usbloadergx/source/settings/SettingsPrompts.cpp
dimok321 7bccfd2b17 *added loading screen
*Removed the console loading screen (no more console at all)
*Complete rework of device handle. You need to reset all your custom paths for this rev.
*Support for writing images/settings/... on any writable partition (FAT/NTFS/EXT). (Theoretically you can run the loader from NTFS only without the need of any other partition or SD if run from new forwarder channel, for example)
*Support for Primary/Logical partitions and GUID Partition Table (GPT)

Forwarder Channel in last revision was not using IOS58 (not sure about AHBPROT)
Here a corrected version (thx to Cyan):
http://www.mediafire.com/?a9y3ywqcm4v3lz3
2010-12-30 23:49:22 +00:00

532 lines
18 KiB
C++

#include <gccore.h>
#include <unistd.h>
#include <string.h>
#include "language/gettext.h"
#include "language/UpdateLanguage.h"
#include "prompts/PromptWindows.h"
#include "prompts/ProgressWindow.h"
#include "libwiigui/gui.h"
#include "libwiigui/gui_customoptionbrowser.h"
#include "settings/CSettings.h"
#include "themes/CTheme.h"
#include "network/URL_List.h"
#include "FileOperations/fileops.h"
#include "FileOperations/DirList.h"
#include "main.h"
#include "filelist.h"
#include "prompts/filebrowser.h"
#include "sys.h"
#include "menu/menus.h"
/*** Extern variables ***/
extern u8 shutdown;
extern u8 reset;
/****************************************************************************
* MenuOGG
***************************************************************************/
bool MenuBackgroundMusic()
{
bool ret = false;
char entered[1024];
int result = -1;
snprintf( entered, sizeof( entered ), "%s", Settings.ogg_path );
if ( strcmp( entered, "" ) == 0 )
{
sprintf( entered, "%s", Settings.BootDevice );
}
else
{
char * pathptr = strrchr( entered, '/' );
if ( pathptr )
{
pathptr++;
int choice = WindowPrompt( tr( "Playing Music:" ), pathptr, tr( "Play Previous" ), tr( "Play Next" ), tr( "Change Play Path" ), tr( "Cancel" ) );
if ( choice == 1 )
{
return bgMusic->PlayPrevious();
}
else if ( choice == 2 )
{
return bgMusic->PlayNext();
}
else if ( choice == 3 )
{
pathptr[0] = 0;
}
else
return true;
}
else
sprintf( entered, "%s", Settings.BootDevice );
}
result = BrowseDevice( entered, sizeof( entered ), FB_DEFAULT );
if ( result )
{
if ( !bgMusic->Load( entered ) )
{
WindowPrompt( tr( "Not supported format!" ), tr( "Loading standard music." ), tr( "OK" ) );
}
else
ret = true;
bgMusic->Play();
bgMusic->SetVolume( Settings.volume );
}
return ret;
}
/****************************************************************************
* MenuLanguageSelect
***************************************************************************/
int MenuLanguageSelect()
{
int cnt = 0;
int ret = 0, choice = 0;
int returnhere = 0;
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png"));
GuiTrigger trigA;
trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A );
GuiTrigger trigB;
trigB.SetButtonOnlyTrigger( -1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B );
char fullpath[100];
DirList Dir(Settings.languagefiles_path, ".lang");
if ( !strcmp( "", Settings.language_path ) )
{
sprintf( fullpath, "%s", tr( "Default" ) );
}
else
{
sprintf( fullpath, "%s", Settings.languagefiles_path );
}
GuiText titleTxt( fullpath, 24, ( GXColor ) {0, 0, 0, 255} );
titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
titleTxt.SetPosition( 0, 0 );
GuiButton pathBtn( 300, 50 );
pathBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
pathBtn.SetPosition( 0, 28 );
pathBtn.SetLabel( &titleTxt );
pathBtn.SetSoundOver( btnSoundOver );
pathBtn.SetSoundClick( btnSoundClick2 );
pathBtn.SetTrigger( &trigA );
pathBtn.SetEffectGrow();
GuiImage oggmenubackground( &settingsbg );
oggmenubackground.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
oggmenubackground.SetPosition( 0, 0 );
GuiText backBtnTxt( tr( "Back" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
backBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
GuiImage backBtnImg( &btnOutline );
if ( Settings.wsprompt == ON )
{
backBtnTxt.SetWidescreen( Settings.widescreen );
backBtnImg.SetWidescreen( Settings.widescreen );
}
GuiButton backBtn( btnOutline.GetWidth(), btnOutline.GetHeight() );
backBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
backBtn.SetPosition( -190, 400 );
backBtn.SetLabel( &backBtnTxt );
backBtn.SetImage( &backBtnImg );
backBtn.SetSoundOver( btnSoundOver );
backBtn.SetSoundClick( btnSoundClick2 );
backBtn.SetTrigger( &trigA );
backBtn.SetTrigger( &trigB );
backBtn.SetEffectGrow();
GuiText defaultBtnTxt( tr( "Default" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
defaultBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
GuiImage defaultBtnImg( &btnOutline );
if ( Settings.wsprompt == ON )
{
defaultBtnTxt.SetWidescreen( Settings.widescreen );
defaultBtnImg.SetWidescreen( Settings.widescreen );
}
GuiButton defaultBtn( btnOutline.GetWidth(), btnOutline.GetHeight() );
defaultBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
defaultBtn.SetPosition( 190, 400 );
defaultBtn.SetLabel( &defaultBtnTxt );
defaultBtn.SetImage( &defaultBtnImg );
defaultBtn.SetSoundOver( btnSoundOver );
defaultBtn.SetSoundClick( btnSoundClick2 );
defaultBtn.SetTrigger( &trigA );
defaultBtn.SetEffectGrow();
GuiText updateBtnTxt( tr( "Update Files" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
updateBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
GuiImage updateBtnImg( &btnOutline );
if ( Settings.wsprompt == ON )
{
updateBtnTxt.SetWidescreen( Settings.widescreen );
updateBtnImg.SetWidescreen( Settings.widescreen );
}
GuiButton updateBtn( btnOutline.GetWidth(), btnOutline.GetHeight() );
updateBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
updateBtn.SetPosition( 0, 400 );
updateBtn.SetLabel( &updateBtnTxt );
updateBtn.SetImage( &updateBtnImg );
updateBtn.SetSoundOver( btnSoundOver );
updateBtn.SetSoundClick( btnSoundClick2 );
updateBtn.SetTrigger( &trigA );
updateBtn.SetEffectGrow();
OptionList options2;
for ( cnt = 0; cnt < Dir.GetFilecount(); cnt++ )
{
char filename[64];
strlcpy( filename, Dir.GetFilename( cnt ), sizeof( filename ) );
char *dot = strchr( filename, '.' );
if ( dot ) *dot = '\0';
options2.SetName( cnt, "%s", filename );
options2.SetValue( cnt, NULL );
}
GuiCustomOptionBrowser optionBrowser4( 396, 280, &options2, "bg_options_settings.png");
optionBrowser4.SetPosition( 0, 90 );
optionBrowser4.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
HaltGui();
GuiWindow w( screenwidth, screenheight );
w.Append( &oggmenubackground );
w.Append( &pathBtn );
w.Append( &backBtn );
w.Append( &defaultBtn );
w.Append( &updateBtn );
w.Append( &optionBrowser4 );
mainWindow->Append( &w );
w.SetEffect( EFFECT_FADE, 20 );
ResumeGui();
while ( w.GetEffect() > 0 ) usleep( 50 );
while ( !returnhere )
{
usleep(100);
if ( shutdown == 1 )
Sys_Shutdown();
else if ( reset == 1 )
Sys_Reboot();
else if ( backBtn.GetState() == STATE_CLICKED )
{
backBtn.ResetState();
break;
}
else if ( defaultBtn.GetState() == STATE_CLICKED )
{
choice = WindowPrompt( tr( "Loading standard language." ), 0, tr( "OK" ), tr( "Cancel" ) );
if ( choice == 1 )
{
Settings.LoadLanguage(NULL, CONSOLE_DEFAULT);
Settings.Save();
returnhere = 2;
}
defaultBtn.ResetState();
//optionBrowser4.SetFocus(1); // commented out to prevent crash
}
else if ( updateBtn.GetState() == STATE_CLICKED )
{
choice = WindowPrompt( tr( "Update all Language Files" ), tr( "Do you wish to update/download all language files?" ), tr( "OK" ), tr( "Cancel" ) );
if ( choice == 1 )
{
if (IsNetworkInit() || NetworkInitPrompt())
{
if(DownloadAllLanguageFiles() > 0)
WindowPrompt(tr("Update successfull"), 0, tr("OK"));
returnhere = 1;
break;
}
}
updateBtn.ResetState();
//optionBrowser4.SetFocus(1); // commented out to prevent crash
}
else if ( pathBtn.GetState() == STATE_CLICKED )
{
w.Remove( &optionBrowser4 );
w.Remove( &backBtn );
w.Remove( &pathBtn );
w.Remove( &defaultBtn );
char entered[43] = "";
strlcpy( entered, Settings.languagefiles_path, sizeof( entered ) );
int result = OnScreenKeyboard( entered, 43, 0 );
w.Append( &optionBrowser4 );
w.Append( &pathBtn );
w.Append( &backBtn );
w.Append( &defaultBtn );
if (result == 1)
{
if (entered[strlen(entered)-1] != '/')
strcat (entered, "/");
snprintf(Settings.languagefiles_path, sizeof(Settings.languagefiles_path), entered);
WindowPrompt(tr("Languagepath changed."), 0, tr("OK"));
}
if ( Dir.GetFilecount() > 0 )
{
optionBrowser4.SetFocus( 1 );
}
pathBtn.ResetState();
}
ret = optionBrowser4.GetClickedOption();
if (ret >= 0)
{
choice = WindowPrompt( tr( "Do you want to change language?" ), 0, tr( "Yes" ), tr( "Cancel" ) );
if (choice == 1)
{
char newLangPath[150];
snprintf(Settings.languagefiles_path, sizeof( Settings.languagefiles_path ), "%s", Dir.GetFilepath(ret));
char * ptr = strrchr(Settings.languagefiles_path, '/');
if(ptr) ptr[1] = 0;
snprintf(newLangPath, sizeof(newLangPath), "%s", Dir.GetFilepath(ret));
if (!CheckFile(newLangPath))
{
WindowPrompt(tr("File not found."), tr("Loading standard language."), tr("OK"));
Settings.LoadLanguage(NULL, CONSOLE_DEFAULT);
}
else
{
Settings.LoadLanguage(newLangPath);
}
Settings.Save();
returnhere = 2;
break;
}
optionBrowser4.SetFocus( 1 );
}
}
w.SetEffect( EFFECT_FADE, -20 );
while ( w.GetEffect() > 0 ) usleep( 50 );
HaltGui();
mainWindow->Remove( &w );
ResumeGui();
return returnhere;
}
/****************************************************************************
* MenuThemeSelect
***************************************************************************/
int MenuThemeSelect()
{
int cnt = 0;
int ret = 0, choice = 0;
int returnVal = 0;
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png"));
GuiTrigger trigA;
trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A );
GuiTrigger trigB;
trigB.SetButtonOnlyTrigger( -1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B );
GuiText titleTxt(Settings.theme_path, 24, ( GXColor ) {0, 0, 0, 255} );
titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
titleTxt.SetPosition( 0, 0 );
GuiButton pathBtn( 300, 50 );
pathBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
pathBtn.SetPosition( 0, 28 );
pathBtn.SetLabel( &titleTxt );
pathBtn.SetSoundOver( btnSoundOver );
pathBtn.SetSoundClick( btnSoundClick2 );
pathBtn.SetTrigger( &trigA );
pathBtn.SetEffectGrow();
GuiImage backgroundImg( &settingsbg );
backgroundImg.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
backgroundImg.SetPosition( 0, 0 );
GuiText backBtnTxt( tr( "Back" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
backBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
GuiImage backBtnImg( &btnOutline );
if ( Settings.wsprompt == ON )
{
backBtnTxt.SetWidescreen( Settings.widescreen );
backBtnImg.SetWidescreen( Settings.widescreen );
}
GuiButton backBtn( btnOutline.GetWidth(), btnOutline.GetHeight() );
backBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
backBtn.SetPosition( -190, 400 );
backBtn.SetLabel( &backBtnTxt );
backBtn.SetImage( &backBtnImg );
backBtn.SetSoundOver( btnSoundOver );
backBtn.SetSoundClick( btnSoundClick2 );
backBtn.SetTrigger( &trigA );
backBtn.SetTrigger( &trigB );
backBtn.SetEffectGrow();
GuiText defaultBtnTxt( tr( "Default" ) , 22, thColor("r=0 g=0 b=0 a=255 - prompt windows text color"));
defaultBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
GuiImage defaultBtnImg( &btnOutline );
if ( Settings.wsprompt == ON )
{
defaultBtnTxt.SetWidescreen( Settings.widescreen );
defaultBtnImg.SetWidescreen( Settings.widescreen );
}
GuiButton defaultBtn( btnOutline.GetWidth(), btnOutline.GetHeight() );
defaultBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
defaultBtn.SetPosition( 190, 400 );
defaultBtn.SetLabel( &defaultBtnTxt );
defaultBtn.SetImage( &defaultBtnImg );
defaultBtn.SetSoundOver( btnSoundOver );
defaultBtn.SetSoundClick( btnSoundClick2 );
defaultBtn.SetTrigger( &trigA );
defaultBtn.SetEffectGrow();
DirList * Dir = new DirList(Settings.theme_path, ".them");
OptionList options2;
for ( cnt = 0; cnt < Dir->GetFilecount(); cnt++ )
{
char filename[64];
strlcpy( filename, Dir->GetFilename( cnt ), sizeof( filename ) );
char *dot = strchr( filename, '.' );
if ( dot ) *dot = '\0';
options2.SetName( cnt, "%s", filename );
options2.SetValue( cnt, NULL );
}
GuiCustomOptionBrowser optionBrowser4( 396, 280, &options2, "bg_options_settings.png");
optionBrowser4.SetPosition( 0, 90 );
optionBrowser4.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
HaltGui();
GuiWindow w( screenwidth, screenheight );
w.Append( &backgroundImg );
w.Append( &pathBtn );
w.Append( &backBtn );
w.Append( &optionBrowser4 );
mainWindow->Append( &w );
w.SetEffect( EFFECT_FADE, 20 );
ResumeGui();
while ( w.GetEffect() > 0 ) usleep(100);
while (returnVal == 0)
{
usleep(100);
if (shutdown)
Sys_Shutdown();
else if (reset)
Sys_Reboot();
else if ( backBtn.GetState() == STATE_CLICKED )
break;
else if ( defaultBtn.GetState() == STATE_CLICKED )
{
choice = WindowPrompt( tr( "Loading default theme." ), 0, tr( "OK" ), tr( "Cancel" ) );
if ( choice == 1 )
{
snprintf(Settings.theme_path, sizeof(Settings.theme_path), "%stheme/", Settings.ConfigPath);
strcpy(Settings.theme, "");
Theme::SetDefault();
Settings.Save();
returnVal = 1;
}
defaultBtn.ResetState();
}
else if ( pathBtn.GetState() == STATE_CLICKED )
{
w.Remove( &optionBrowser4 );
w.Remove( &backBtn );
w.Remove( &pathBtn );
w.Remove( &defaultBtn );
int result = BrowseDevice(Settings.theme_path, sizeof(Settings.theme_path), FB_DEFAULT, noFILES);
w.Append( &optionBrowser4 );
w.Append( &pathBtn );
w.Append( &backBtn );
w.Append( &defaultBtn );
if (result == 1)
{
if (Settings.theme_path[strlen(Settings.theme_path)-1] != '/')
strcat(Settings.theme_path, "/");
HaltGui();
delete Dir;
Dir = new DirList(Settings.theme_path, ".them");
options2.ClearList();
for ( cnt = 0; cnt < Dir->GetFilecount(); cnt++ )
{
char filename[64];
strlcpy( filename, Dir->GetFilename( cnt ), sizeof( filename ) );
char *dot = strchr( filename, '.' );
if ( dot ) *dot = '\0';
options2.SetName( cnt, "%s", filename );
options2.SetValue( cnt, NULL );
}
titleTxt.SetText(Settings.theme_path);
ResumeGui();
WindowPrompt( tr( "Theme path is changed." ), 0, tr( "OK" ) );
}
pathBtn.ResetState();
}
ret = optionBrowser4.GetClickedOption();
if (ret >= 0 && ret < Dir->GetFilecount())
{
choice = WindowPrompt( tr( "Do you want to load this theme?" ), Dir->GetFilename(ret), tr( "Yes" ), tr( "Cancel" ) );
if ( choice == 1 )
{
snprintf(Settings.theme, sizeof( Settings.theme ), "%s", Dir->GetFilepath(ret));
if ( !CheckFile( Settings.theme ) )
{
WindowPrompt( tr( "File not found." ), tr( "Loading default theme." ), tr( "OK" ) );
Theme::SetDefault();
strcpy(Settings.theme, "");
}
else
{
HaltGui();
Theme::Load(Settings.theme);
ResumeGui();
}
Settings.Save();
returnVal = 1;
break;
}
optionBrowser4.SetFocus( 1 );
}
}
w.SetEffect( EFFECT_FADE, -20 );
while ( w.GetEffect() > 0 ) usleep(100);
HaltGui();
mainWindow->Remove( &w );
ResumeGui();
delete Dir;
return returnVal;
}