usbloadergx/source/settings/menus/CustomPathsSM.cpp
Cyan a8f136335f * Fixed launching GameCube games from disc with official MIOS
* Added Forced Language settings for GameCube games when using DM(L)
* Fixed GameCube games video mode error with DML by removing forced progressive mode 
  when using component cable.
* Replaced the "Force interlace" by "DML Progressive Patch" (use it ONLY if you don't
  see any picture when forcing 480p)
* Added a setting to choose whether to use MIOS or Devolution for GameCube games.
* Added support for Devolution:
  - place Loader.bin from devolution sources in "DEVO Loader Folder". 
    default folder is sd:/apps/gc_devo/ but you can change it.
  - You need to use the same folder layout than DIOS MIOS: /games/title [ID6]/game.iso
  - You need to place the second game disc ISO in the same folder than the first ISO (untested)
  - The Memory Card Emulation for Devolution can be: 
      OFF (real Memory Card) 
      ON  (saved in /apps/gc_devo)
      Individual (Saved in the game folder)
  - Other settings have no effect in Devolution Mode. (no Ocarina/language/video force/etc.)
2012-07-16 16:07:24 +00:00

374 lines
10 KiB
C++

/****************************************************************************
* Copyright (C) 2010
* by Dimok
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you
* must not claim that you wrote the original software. If you use
* this software in a product, an acknowledgment in the product
* documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and
* must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
***************************************************************************/
#include <unistd.h>
#include "Channels/channels.h"
#include "Controls/DeviceHandler.hpp"
#include "GameCube/GCGames.h"
#include "CustomPathsSM.hpp"
#include "settings/SettingsPrompts.h"
#include "settings/CSettings.h"
#include "settings/SettingsEnums.h"
#include "prompts/PromptWindows.h"
#include "language/gettext.h"
#include "prompts/filebrowser.h"
#include "themes/CTheme.h"
#include "gecko.h"
CustomPathsSM::CustomPathsSM()
: SettingsMenu(tr("Custom Paths"), &GuiOptions, MENU_NONE)
{
int Idx = 0;
Options->SetName(Idx++, tr("3D Cover Path"));
Options->SetName(Idx++, tr("2D Cover Path"));
Options->SetName(Idx++, tr("Full Cover Path"));
Options->SetName(Idx++, tr("Disc Artwork Path"));
Options->SetName(Idx++, tr("Theme Path"));
Options->SetName(Idx++, tr("GameTDB Path"));
Options->SetName(Idx++, tr("Update Path"));
Options->SetName(Idx++, tr("GCT Cheatcodes Path"));
Options->SetName(Idx++, tr("TXT Cheatcodes Path"));
Options->SetName(Idx++, tr("DOL Path"));
Options->SetName(Idx++, tr("Homebrew Apps Path"));
Options->SetName(Idx++, tr("BCA Codes Path"));
Options->SetName(Idx++, tr("WIP Patches Path"));
Options->SetName(Idx++, tr("Languagefiles Path"));
Options->SetName(Idx++, tr("WDM Files Path"));
Options->SetName(Idx++, tr("Wiinnertag Path"));
Options->SetName(Idx++, tr("Nand Emu Path"));
Options->SetName(Idx++, tr("Nand Emu Channel Path"));
Options->SetName(Idx++, tr("Main GameCube Path"));
Options->SetName(Idx++, tr("SD GameCube Path"));
Options->SetName(Idx++, tr("Devolution Loader Path"));
Options->SetName(Idx++, tr("Cache BNR Files Path"));
SetOptionValues();
}
void CustomPathsSM::SetOptionValues()
{
int Idx = 0;
//! Settings: 3D Cover Path
Options->SetValue(Idx++, Settings.covers_path);
//! Settings: 2D Cover Path
Options->SetValue(Idx++, Settings.covers2d_path);
//! Settings: Full Cover Path
Options->SetValue(Idx++, Settings.coversFull_path);
//! Settings: Disc Artwork Path
Options->SetValue(Idx++, Settings.disc_path);
//! Settings: Theme Path
Options->SetValue(Idx++, Settings.theme_path);
//! Settings: GameTDB Path
Options->SetValue(Idx++, Settings.titlestxt_path);
//! Settings: Update Path
Options->SetValue(Idx++, Settings.update_path);
//! Settings: GCT Cheatcodes Path
Options->SetValue(Idx++, Settings.Cheatcodespath);
//! Settings: TXT Cheatcodes Path
Options->SetValue(Idx++, Settings.TxtCheatcodespath);
//! Settings: DOL Path
Options->SetValue(Idx++, Settings.dolpath);
//! Settings: Homebrew Apps Path
Options->SetValue(Idx++, Settings.homebrewapps_path);
//! Settings: BCA Codes Path
Options->SetValue(Idx++, Settings.BcaCodepath);
//! Settings: WIP Patches Path
Options->SetValue(Idx++, Settings.WipCodepath);
//! Settings: Languagefiles Path
Options->SetValue(Idx++, Settings.languagefiles_path);
//! Settings: WDM Files Path
Options->SetValue(Idx++, Settings.WDMpath);
//! Settings: Wiinnertag Path
Options->SetValue(Idx++, Settings.WiinnertagPath);
//! Settings: Nand Emu Path
Options->SetValue(Idx++, Settings.NandEmuPath);
//! Settings: Nand Emu Channel Path
Options->SetValue(Idx++, Settings.NandEmuChanPath);
//! Settings: GameCube Games Path
Options->SetValue(Idx++, Settings.GameCubePath);
//! Settings: SD GameCube Games Path
Options->SetValue(Idx++, Settings.GameCubeSDPath);
//! Settings: GameCube Devolution loader.bin Path
Options->SetValue(Idx++, Settings.DEVOLoaderPath);
//! Settings: Cache BNR Files Path
Options->SetValue(Idx++, Settings.BNRCachePath);
}
int CustomPathsSM::GetMenuInternal()
{
int ret = optionBrowser->GetClickedOption();
if (ret < 0)
return MENU_NONE;
int Idx = -1;
//! Settings: 3D Cover Path
if (ret == ++Idx)
{
titleTxt->SetText(tr( "3D Cover Path" ));
ChangePath(Settings.covers_path, sizeof(Settings.covers_path));
}
//! Settings: 2D Cover Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "2D Cover Path" ));
ChangePath(Settings.covers2d_path, sizeof(Settings.covers2d_path));
}
//! Settings: Full Cover Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Full Cover Path" ));
ChangePath(Settings.coversFull_path, sizeof(Settings.coversFull_path));
}
//! Settings: Disc Artwork Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Disc Artwork Path" ));
ChangePath(Settings.disc_path, sizeof(Settings.disc_path));
}
//! Settings: Theme Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Theme Path" ));
ChangePath(Settings.theme_path, sizeof(Settings.theme_path));
}
//! Settings: GameTDB Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "GameTDB Path" ));
ChangePath(Settings.titlestxt_path, sizeof(Settings.titlestxt_path));
}
//! Settings: Update Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Update Path" ));
ChangePath(Settings.update_path, sizeof(Settings.update_path));
}
//! Settings: GCT Cheatcodes Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "GCT Cheatcodes Path" ));
ChangePath(Settings.Cheatcodespath, sizeof(Settings.Cheatcodespath));
}
//! Settings: TXT Cheatcodes Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "TXT Cheatcodes Path" ));
ChangePath(Settings.TxtCheatcodespath, sizeof(Settings.TxtCheatcodespath));
}
//! Settings: DOL Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "DOL Path" ));
ChangePath(Settings.dolpath, sizeof(Settings.dolpath));
}
//! Settings: Homebrew Apps Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Homebrew Apps Path" ));
ChangePath(Settings.homebrewapps_path, sizeof(Settings.homebrewapps_path));
}
//! Settings: BCA Codes Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "BCA Codes Path" ));
ChangePath(Settings.BcaCodepath, sizeof(Settings.BcaCodepath));
}
//! Settings: WIP Patches Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "WIP Patches Path" ));
ChangePath(Settings.WipCodepath, sizeof(Settings.WipCodepath));
}
//! Settings: Languagefiles Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Languagefiles Path" ));
ChangePath(Settings.languagefiles_path, sizeof(Settings.languagefiles_path));
}
//! Settings: WDM Files Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "WDM Files Path" ));
ChangePath(Settings.WDMpath, sizeof(Settings.WDMpath));
}
//! Settings: Wiinnertag Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Wiinnertag Path" ));
ChangePath(Settings.WiinnertagPath, sizeof(Settings.WiinnertagPath));
}
//! Settings: Nand Emu Path
else if (ret == ++Idx)
{
char oldPath[sizeof(Settings.NandEmuPath)];
snprintf(oldPath, sizeof(oldPath), Settings.NandEmuPath);
titleTxt->SetText(tr( "Nand Emu Path" ));
ChangePath(Settings.NandEmuPath, sizeof(Settings.NandEmuPath));
if(strncasecmp(DeviceHandler::PathToFSName(Settings.NandEmuPath), "FAT", 3) != 0)
{
snprintf(Settings.NandEmuPath, sizeof(Settings.NandEmuPath), oldPath);
WindowPrompt(tr("Error:"), tr("Nand Emulation only works on FAT/FAT32 partitions!"), tr("OK"));
}
}
//! Settings: Nand Emu Channel Path
else if (ret == ++Idx)
{
char oldPath[sizeof(Settings.NandEmuChanPath)];
snprintf(oldPath, sizeof(oldPath), Settings.NandEmuChanPath);
titleTxt->SetText(tr( "Nand Emu Channel Path" ));
int result = ChangePath(Settings.NandEmuChanPath, sizeof(Settings.NandEmuChanPath));
if(strncasecmp(DeviceHandler::PathToFSName(Settings.NandEmuChanPath), "FAT", 3) != 0)
{
snprintf(Settings.NandEmuChanPath, sizeof(Settings.NandEmuChanPath), oldPath);
WindowPrompt(tr("Error:"), tr("Nand Emulation only works on FAT/FAT32 partitions!"), tr("OK"));
}
else if(result == 1)
{
Channels::Instance()->GetEmuChannelList();
}
}
//! Settings: GameCube Games Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Main GameCube Games Path" ));
if(ChangePath(Settings.GameCubePath, sizeof(Settings.GameCubePath)))
{
GCGames::Instance()->LoadAllGames();
}
}
//! Settings: SD GameCube Games Path
else if (ret == ++Idx)
{
char tmp_path[sizeof(Settings.GameCubeSDPath)];
snprintf(tmp_path, sizeof(tmp_path), "%s", Settings.GameCubeSDPath);
titleTxt->SetText(tr( "SD GameCube Games Path" ));
if(ChangePath(tmp_path, sizeof(tmp_path)))
{
if(strncmp(tmp_path, "sd", 2) != 0)
{
WindowPrompt(tr("Error:"), tr("This path must be on SD!"), tr("OK"));
}
else
{
snprintf(Settings.GameCubeSDPath, sizeof(Settings.GameCubeSDPath), "%s", tmp_path);
GCGames::Instance()->LoadAllGames();
}
}
}
//! Settings: GameCube Devolution loader.bin path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Devolution Loader Path" ));
ChangePath(Settings.DEVOLoaderPath, sizeof(Settings.DEVOLoaderPath));
}
//! Settings: Cache BNR Files Path
else if (ret == ++Idx)
{
titleTxt->SetText(tr( "Cache BNR Files Path" ));
ChangePath(Settings.BNRCachePath, sizeof(Settings.BNRCachePath));
}
//! Global set back of the titleTxt after a change
titleTxt->SetText(tr( "Custom Paths" ));
SetOptionValues();
return MENU_NONE;
}
int CustomPathsSM::ChangePath(char * SettingsPath, int SizeOfPath)
{
char entered[300];
snprintf(entered, sizeof(entered), SettingsPath);
HaltGui();
GuiWindow * parent = (GuiWindow *) parentElement;
if(parent) parent->SetState(STATE_DISABLED);
this->SetState(STATE_DEFAULT);
this->Remove(optionBrowser);
ResumeGui();
int result = BrowseDevice(entered, sizeof(entered), FB_DEFAULT, noFILES);
if(parent) parent->SetState(STATE_DEFAULT);
this->Append(optionBrowser);
if (result == 1)
{
if (entered[strlen(entered)-1] != '/')
strcat(entered, "/");
snprintf(SettingsPath, SizeOfPath, entered);
WindowPrompt(tr( "Path Changed" ), 0, tr( "OK" ));
}
return result;
}