mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-18 09:19:17 +01:00
9e79c9d99b
* code cleanup
670 lines
22 KiB
C++
670 lines
22 KiB
C++
/****************************************************************************
|
|
* Theme_Downloader
|
|
* USB Loader GX 2009
|
|
*
|
|
* Theme downloader for USB Loader GX
|
|
*
|
|
* Theme_Downloader.cpp
|
|
***************************************************************************/
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include "language/gettext.h"
|
|
#include "libwiigui/gui.h"
|
|
#include "prompts/PromptWindows.h"
|
|
#include "prompts/ProgressWindow.h"
|
|
#include "homebrewboot/HomebrewBrowse.h"
|
|
#include "network/networkops.h"
|
|
#include "themes/Theme_List.h"
|
|
#include "menu.h"
|
|
#include "filelist.h"
|
|
#include "listfiles.h"
|
|
#include "sys.h"
|
|
#include "network/http.h"
|
|
#include "ZipFile.h"
|
|
#include "gecko.h"
|
|
|
|
/*** Extern functions ***/
|
|
extern void ResumeGui();
|
|
extern void HaltGui();
|
|
|
|
/*** Extern variables ***/
|
|
extern GuiWindow * mainWindow;
|
|
extern GuiSound * bgMusic;
|
|
extern GuiImage * bgImg;
|
|
extern u8 shutdown;
|
|
extern u8 reset;
|
|
|
|
|
|
int DownloadTheme( const char *url, const char *title )
|
|
{
|
|
if ( !url )
|
|
return 0;
|
|
|
|
char filename[255];
|
|
memset( filename, 0, sizeof( filename ) );
|
|
|
|
int filesize = download_request( url, ( char * ) & filename );
|
|
|
|
if ( filesize <= 0 )
|
|
{
|
|
WindowPrompt( tr( "Download request failed." ), 0, tr( "OK" ) );
|
|
return 0;
|
|
}
|
|
|
|
char path[300];
|
|
char filepath[300];
|
|
|
|
snprintf( path, sizeof( path ), "%s%s", Settings.theme_downloadpath, title );
|
|
|
|
subfoldercreate( path );
|
|
|
|
snprintf( filepath, sizeof( filepath ), "%s/%s", path, filename );
|
|
|
|
FILE *file = fopen( filepath, "wb" );
|
|
if ( !file )
|
|
{
|
|
WindowPrompt( tr( "Download failed." ), tr( "Can't create file" ), tr( "OK" ) );
|
|
return 0;
|
|
}
|
|
|
|
u32 done = 0;
|
|
|
|
int blocksize = 1024 * 5;
|
|
|
|
u8 *buffer = new u8[blocksize];
|
|
|
|
while ( done < ( u32 ) filesize )
|
|
{
|
|
if ( ( u32 ) blocksize > filesize - done )
|
|
blocksize = filesize - done;
|
|
|
|
ShowProgress( tr( "Downloading file" ), 0, ( char* ) filename, done, filesize, true );
|
|
|
|
int ret = network_read( buffer, blocksize );
|
|
if ( ret < 0 )
|
|
{
|
|
free( buffer );
|
|
fclose( file );
|
|
remove( path );
|
|
ProgressStop();
|
|
WindowPrompt( tr( "Download failed." ), tr( "Transfer failed." ), tr( "OK" ) );
|
|
return 0;
|
|
}
|
|
else if ( ret == 0 )
|
|
break;
|
|
|
|
fwrite( buffer, 1, blocksize, file );
|
|
|
|
done += ret;
|
|
}
|
|
|
|
delete [] buffer;
|
|
fclose( file );
|
|
|
|
ProgressStop();
|
|
|
|
if ( done != ( u32 ) filesize )
|
|
{
|
|
remove( filepath );
|
|
WindowPrompt( tr( "Download failed." ), tr( "Connection lost..." ), tr( "OK" ) );
|
|
return 0;
|
|
}
|
|
|
|
ZipFile zipfile( filepath );
|
|
|
|
int result = zipfile.ExtractAll( path );
|
|
if ( result )
|
|
{
|
|
remove( filepath );
|
|
int choice = WindowPrompt( tr( "Successfully extracted theme." ), tr( "Do you want to apply it now?" ), tr( "Yes" ), tr( "No" ) );
|
|
if ( choice )
|
|
{
|
|
char real_themepath[1024];
|
|
sprintf( real_themepath, "%s", CFG.theme_path );
|
|
if ( SearchFile( path, "GXtheme.cfg", real_themepath ) == true )
|
|
{
|
|
char *ptr = strrchr( real_themepath, '/' );
|
|
if ( ptr )
|
|
{
|
|
ptr++;
|
|
ptr[0] = '\0';
|
|
}
|
|
snprintf( CFG.theme_path, sizeof( CFG.theme_path ), "%s", real_themepath );
|
|
cfg_save_global();
|
|
CFG_Load();
|
|
CFG_LoadGlobal();
|
|
result = 2;
|
|
}
|
|
else
|
|
WindowPrompt( tr( "ERROR: Can't set up theme." ), tr( "GXtheme.cfg not found in any subfolder." ), tr( "OK" ) );
|
|
}
|
|
}
|
|
else
|
|
WindowPrompt( tr( "Failed to extract." ), tr( "Unsupported format, try to extract manually." ), tr( "OK" ) );
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
static int Theme_Prompt( const char *title, const char *author, GuiImageData *thumbimageData, const char *downloadlink )
|
|
{
|
|
gprintf( "\nTheme_Prompt(%s ,%s, <DATA>, %s)", title, author, downloadlink );
|
|
bool leave = false;
|
|
int result = 0;
|
|
|
|
GuiSound btnSoundOver( button_over_pcm, button_over_pcm_size, Settings.sfxvolume );
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if ( !btnClick2 ) btnClick2 = new GuiSound( button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume );
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
char imgPath[100];
|
|
snprintf( imgPath, sizeof( imgPath ), "%sbutton_dialogue_box.png", CFG.theme_path );
|
|
GuiImageData btnOutline( imgPath, button_dialogue_box_png );
|
|
snprintf( imgPath, sizeof( imgPath ), "%stheme_dialogue_box.png", CFG.theme_path );
|
|
GuiImageData dialogBox( imgPath, theme_dialogue_box_png );
|
|
|
|
GuiImage dialogBoxImg( &dialogBox );
|
|
|
|
GuiWindow promptWindow( dialogBox.GetWidth(), dialogBox.GetHeight() );
|
|
promptWindow.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
promptWindow.SetPosition( 0, -10 );
|
|
|
|
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( tr( "Theme Title:" ), 18, THEME.prompttext );
|
|
titleTxt.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
titleTxt.SetPosition( 230, 30 );
|
|
|
|
GuiText titleTxt2( title, 18, THEME.prompttext );
|
|
titleTxt2.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
titleTxt2.SetPosition( 230, 50 );
|
|
titleTxt2.SetMaxWidth( dialogBox.GetWidth() - 220, WRAP );
|
|
|
|
GuiText authorTxt( tr( "Author:" ), 18, THEME.prompttext );
|
|
authorTxt.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
authorTxt.SetPosition( 230, 100 );
|
|
|
|
GuiText authorTxt2( author, 18, THEME.prompttext );
|
|
authorTxt2.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
authorTxt2.SetPosition( 230, 120 );
|
|
authorTxt2.SetMaxWidth( dialogBox.GetWidth() - 220, DOTTED );
|
|
|
|
GuiText downloadBtnTxt( tr( "Download" ) , 22, THEME.prompttext );
|
|
downloadBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
|
|
GuiImage downloadBtnImg( &btnOutline );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
downloadBtnTxt.SetWidescreen( CFG.widescreen );
|
|
downloadBtnImg.SetWidescreen( CFG.widescreen );
|
|
}
|
|
GuiButton downloadBtn( &downloadBtnImg, &downloadBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 170, &trigA, &btnSoundOver, btnClick2, 1 );
|
|
downloadBtn.SetLabel( &downloadBtnTxt );
|
|
downloadBtn.SetScale( 0.9 );
|
|
|
|
GuiText backBtnTxt( tr( "Back" ) , 22, THEME.prompttext );
|
|
backBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
|
|
GuiImage backBtnImg( &btnOutline );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
backBtnTxt.SetWidescreen( CFG.widescreen );
|
|
backBtnImg.SetWidescreen( CFG.widescreen );
|
|
}
|
|
GuiButton backBtn( &backBtnImg, &backBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 220, &trigA, &btnSoundOver, btnClick2, 1 );
|
|
backBtn.SetLabel( &backBtnTxt );
|
|
backBtn.SetTrigger( &trigB );
|
|
backBtn.SetScale( 0.9 );
|
|
|
|
GuiImage ThemeImage( thumbimageData );
|
|
ThemeImage.SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
ThemeImage.SetPosition( 20, 10 );
|
|
ThemeImage.SetScale( 0.8 );
|
|
|
|
ThemeImage.SetScale( 0.8 );
|
|
|
|
promptWindow.Append( &dialogBoxImg );
|
|
promptWindow.Append( &ThemeImage );
|
|
promptWindow.Append( &titleTxt );
|
|
promptWindow.Append( &titleTxt2 );
|
|
promptWindow.Append( &authorTxt );
|
|
promptWindow.Append( &authorTxt2 );
|
|
promptWindow.Append( &downloadBtn );
|
|
promptWindow.Append( &backBtn );
|
|
|
|
HaltGui();
|
|
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50 );
|
|
mainWindow->SetState( STATE_DISABLED );
|
|
mainWindow->Append( &promptWindow );
|
|
mainWindow->ChangeFocus( &promptWindow );
|
|
ResumeGui();
|
|
|
|
while ( !leave )
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
if ( shutdown == 1 )
|
|
Sys_Shutdown();
|
|
else if ( reset == 1 )
|
|
Sys_Reboot();
|
|
|
|
if ( downloadBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
int choice = WindowPrompt( tr( "Do you want to download this theme?" ), title, tr( "Yes" ), tr( "Cancel" ) );
|
|
if ( choice )
|
|
{
|
|
result = DownloadTheme( downloadlink, title );
|
|
if ( result == 2 )
|
|
leave = true;
|
|
}
|
|
mainWindow->SetState( STATE_DISABLED );
|
|
promptWindow.SetState( STATE_DEFAULT );
|
|
mainWindow->ChangeFocus( &promptWindow );
|
|
downloadBtn.ResetState();
|
|
}
|
|
|
|
else if ( backBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
leave = true;
|
|
backBtn.ResetState();
|
|
}
|
|
}
|
|
|
|
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50 );
|
|
while ( promptWindow.GetEffect() > 0 ) usleep( 50 );
|
|
HaltGui();
|
|
mainWindow->Remove( &promptWindow );
|
|
mainWindow->SetState( STATE_DEFAULT );
|
|
ResumeGui();
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
int Theme_Downloader()
|
|
{
|
|
int pagesize = 4;
|
|
int menu = MENU_NONE;
|
|
bool listchanged = false;
|
|
|
|
char THEME_LINK[70];
|
|
sprintf( THEME_LINK, "http://wii.spiffy360.com/themes.php?xml=1&category=1&adult=%d", Settings.godmode );
|
|
//gprintf("\nTHEME_LINK: %s", THEME_LINK);
|
|
//const char THEME_LINK_ADULT[70] = "http://wii.spiffy360.com/themes.php?xml=1&category=1&adult=1";
|
|
|
|
/*** Sound Variables ***/
|
|
GuiSound btnSoundOver( button_over_pcm, button_over_pcm_size, Settings.sfxvolume );
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if ( !btnClick2 ) btnClick2 = new GuiSound( button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume );
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
GuiSound btnClick1( button_click_pcm, button_click_pcm_size, Settings.sfxvolume );
|
|
|
|
/*** Image Variables ***/
|
|
char imgPath[150];
|
|
snprintf( imgPath, sizeof( imgPath ), "%sbutton_dialogue_box.png", CFG.theme_path );
|
|
GuiImageData btnOutline( imgPath, button_dialogue_box_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%stheme_box.png", CFG.theme_path );
|
|
GuiImageData theme_box_Data( imgPath, theme_box_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%ssettings_background.png", CFG.theme_path );
|
|
GuiImageData bgData( imgPath, settings_background_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sstartgame_arrow_left.png", CFG.theme_path );
|
|
GuiImageData arrow_left( imgPath, startgame_arrow_left_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sstartgame_arrow_right.png", CFG.theme_path );
|
|
GuiImageData arrow_right( imgPath, startgame_arrow_right_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sWifi_btn.png", CFG.theme_path );
|
|
GuiImageData wifiImgData( imgPath, Wifi_btn_png );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%spageindicator.png", CFG.theme_path );
|
|
GuiImageData PageindicatorImgData( imgPath, pageindicator_png );
|
|
|
|
GuiImage background( &bgData );
|
|
|
|
/*** Trigger Variables ***/
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A );
|
|
GuiTrigger trigHome;
|
|
trigHome.SetButtonOnlyTrigger( -1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0 );
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger( -1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B );
|
|
GuiTrigger trigL;
|
|
trigL.SetButtonOnlyTrigger( -1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT );
|
|
GuiTrigger trigR;
|
|
trigR.SetButtonOnlyTrigger( -1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT );
|
|
GuiTrigger trigMinus;
|
|
trigMinus.SetButtonOnlyTrigger( -1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0 );
|
|
GuiTrigger trigPlus;
|
|
trigPlus.SetButtonOnlyTrigger( -1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0 );
|
|
|
|
GuiText titleTxt( tr( "Theme Downloader" ), 28, ( GXColor ) {0, 0, 0, 255} );
|
|
titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
titleTxt.SetPosition( 0, 40 );
|
|
|
|
GuiImageData *ImageData[pagesize];
|
|
GuiImage *Image[pagesize];
|
|
GuiImage *theme_box_img[pagesize];
|
|
GuiButton *MainButton[pagesize];
|
|
GuiText *MainButtonTxt[pagesize];
|
|
Theme_List *Theme = NULL;
|
|
|
|
/*** Buttons ***/
|
|
|
|
for ( int i = 0; i < pagesize; i++ )
|
|
{
|
|
ImageData[i] = NULL;
|
|
Image[i] = NULL;
|
|
MainButtonTxt[i] = NULL;
|
|
theme_box_img[i] = new GuiImage( &theme_box_Data );
|
|
|
|
MainButton[i] = new GuiButton( theme_box_Data.GetWidth(), theme_box_Data.GetHeight() );
|
|
MainButton[i]->SetAlignment( ALIGN_LEFT, ALIGN_TOP );
|
|
MainButton[i]->SetSoundOver( &btnSoundOver );
|
|
MainButton[i]->SetSoundClick( &btnClick1 );
|
|
MainButton[i]->SetImage( theme_box_img[i] );
|
|
MainButton[i]->SetEffectGrow();
|
|
MainButton[i]->SetTrigger( &trigA );
|
|
}
|
|
|
|
/*** Positions ***/
|
|
MainButton[0]->SetPosition( 90, 75 );
|
|
MainButton[1]->SetPosition( 340, 75 );
|
|
MainButton[2]->SetPosition( 90, 230 );
|
|
MainButton[3]->SetPosition( 340, 230 );
|
|
|
|
GuiText backBtnTxt( tr( "Back" ) , 22, THEME.prompttext );
|
|
backBtnTxt.SetMaxWidth( btnOutline.GetWidth() - 30 );
|
|
GuiImage backBtnImg( &btnOutline );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
backBtnTxt.SetWidescreen( CFG.widescreen );
|
|
backBtnImg.SetWidescreen( CFG.widescreen );
|
|
}
|
|
GuiButton backBtn( &backBtnImg, &backBtnImg, 2, 3, -180, 400, &trigA, &btnSoundOver, btnClick2, 1 );
|
|
backBtn.SetLabel( &backBtnTxt );
|
|
backBtn.SetTrigger( &trigB );
|
|
|
|
GuiButton HomeBtn( 1, 1 );
|
|
HomeBtn.SetTrigger( &trigHome );
|
|
|
|
GuiImage GoLeftImg( &arrow_left );
|
|
GuiButton GoLeftBtn( GoLeftImg.GetWidth(), GoLeftImg.GetHeight() );
|
|
GoLeftBtn.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
GoLeftBtn.SetPosition( 25, -25 );
|
|
GoLeftBtn.SetImage( &GoLeftImg );
|
|
GoLeftBtn.SetSoundOver( &btnSoundOver );
|
|
GoLeftBtn.SetSoundClick( btnClick2 );
|
|
GoLeftBtn.SetEffectGrow();
|
|
GoLeftBtn.SetTrigger( &trigA );
|
|
GoLeftBtn.SetTrigger( &trigL );
|
|
GoLeftBtn.SetTrigger( &trigMinus );
|
|
|
|
GuiImage GoRightImg( &arrow_right );
|
|
GuiButton GoRightBtn( GoRightImg.GetWidth(), GoRightImg.GetHeight() );
|
|
GoRightBtn.SetAlignment( ALIGN_RIGHT, ALIGN_MIDDLE );
|
|
GoRightBtn.SetPosition( -25, -25 );
|
|
GoRightBtn.SetImage( &GoRightImg );
|
|
GoRightBtn.SetSoundOver( &btnSoundOver );
|
|
GoRightBtn.SetSoundClick( btnClick2 );
|
|
GoRightBtn.SetEffectGrow();
|
|
GoRightBtn.SetTrigger( &trigA );
|
|
GoRightBtn.SetTrigger( &trigR );
|
|
GoRightBtn.SetTrigger( &trigPlus );
|
|
|
|
GuiImage PageindicatorImg( &PageindicatorImgData );
|
|
GuiText PageindicatorTxt( ( char * ) NULL, 22, ( GXColor ) { 0, 0, 0, 255} );
|
|
GuiButton PageIndicatorBtn( PageindicatorImg.GetWidth(), PageindicatorImg.GetHeight() );
|
|
PageIndicatorBtn.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
PageIndicatorBtn.SetPosition( 110, 400 );
|
|
PageIndicatorBtn.SetImage( &PageindicatorImg );
|
|
PageIndicatorBtn.SetLabel( &PageindicatorTxt );
|
|
PageIndicatorBtn.SetSoundOver( &btnSoundOver );
|
|
PageIndicatorBtn.SetSoundClick( &btnClick1 );
|
|
PageIndicatorBtn.SetTrigger( &trigA );
|
|
PageIndicatorBtn.SetEffectGrow();
|
|
|
|
GuiImage wifiImg( &wifiImgData );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
wifiImg.SetWidescreen( CFG.widescreen );
|
|
}
|
|
GuiButton wifiBtn( wifiImg.GetWidth(), wifiImg.GetHeight() );
|
|
wifiBtn.SetImage( &wifiImg );
|
|
wifiBtn.SetPosition( 500, 400 );
|
|
wifiBtn.SetSoundOver( &btnSoundOver );
|
|
wifiBtn.SetSoundClick( &btnClick1 );
|
|
wifiBtn.SetEffectGrow();
|
|
wifiBtn.SetTrigger( &trigA );
|
|
|
|
GuiWindow w( screenwidth, screenheight );
|
|
|
|
HaltGui();
|
|
w.Append( &background );
|
|
mainWindow->Append( &w );
|
|
ResumeGui();
|
|
|
|
if ( !IsNetworkInit() )
|
|
NetworkInitPrompt();
|
|
|
|
char url[300];
|
|
int currentpage = 1;
|
|
int currenttheme = 0;
|
|
|
|
HaltGui();
|
|
w.RemoveAll();
|
|
w.Append( &background );
|
|
w.Append( &titleTxt );
|
|
w.Append( &backBtn );
|
|
w.Append( &GoLeftBtn );
|
|
w.Append( &GoRightBtn );
|
|
w.Append( &PageIndicatorBtn );
|
|
w.Append( &wifiBtn );
|
|
w.Append( &HomeBtn );
|
|
ResumeGui();
|
|
|
|
ShowProgress( tr( "Downloading Page List:" ), "", ( char * ) tr( "Please wait..." ), 0, pagesize );
|
|
|
|
Theme = new Theme_List( THEME_LINK );
|
|
|
|
int ThemesOnPage = Theme->GetThemeCount();
|
|
|
|
if ( !ThemesOnPage )
|
|
{
|
|
WindowPrompt( tr( "No themes found on the site." ), 0, "OK" );
|
|
menu = MENU_SETTINGS;
|
|
}
|
|
|
|
while ( menu == MENU_NONE )
|
|
{
|
|
HaltGui();
|
|
w.RemoveAll();
|
|
w.Append( &background );
|
|
w.Append( &titleTxt );
|
|
w.Append( &backBtn );
|
|
w.Append( &GoLeftBtn );
|
|
w.Append( &GoRightBtn );
|
|
w.Append( &PageIndicatorBtn );
|
|
w.Append( &wifiBtn );
|
|
w.Append( &HomeBtn );
|
|
ResumeGui();
|
|
|
|
sprintf( url, "%i", currentpage );
|
|
PageindicatorTxt.SetText( url );
|
|
|
|
int n = 0;
|
|
|
|
for ( int i = currenttheme; ( i < ( currenttheme + pagesize ) ); i++ )
|
|
{
|
|
ShowProgress( tr( "Downloading image:" ), 0, ( char * ) Theme->GetThemeTitle( i ), n, pagesize );
|
|
|
|
if ( MainButtonTxt[n] )
|
|
delete MainButtonTxt[n];
|
|
if ( ImageData[n] )
|
|
delete ImageData[n];
|
|
if ( Image[n] )
|
|
delete Image[n];
|
|
|
|
MainButtonTxt[n] = NULL;
|
|
ImageData[n] = NULL;
|
|
Image[n] = NULL;
|
|
|
|
if ( i < ThemesOnPage )
|
|
{
|
|
MainButtonTxt[n] = new GuiText( Theme->GetThemeTitle( i ), 18, ( GXColor ) { 0, 0, 0, 255} );
|
|
MainButtonTxt[n]->SetAlignment( ALIGN_CENTER, ALIGN_TOP );
|
|
MainButtonTxt[n]->SetPosition( 0, 10 );
|
|
MainButtonTxt[n]->SetMaxWidth( theme_box_Data.GetWidth() - 10, DOTTED );
|
|
|
|
sprintf( url, "%s", Theme->GetImageLink( i ) );
|
|
|
|
char filepath[300];
|
|
snprintf( filepath, sizeof( filepath ), "%s/tmp/%s.jpg", Settings.theme_downloadpath, Theme->GetThemeTitle( i ) );
|
|
|
|
FILE * storefile = fopen( filepath, "rb" );
|
|
|
|
if ( !storefile )
|
|
{
|
|
struct block file = downloadfile( url );
|
|
char storepath[300];
|
|
snprintf( storepath, sizeof( storepath ), "%s/tmp/", Settings.theme_downloadpath );
|
|
subfoldercreate( storepath );
|
|
if ( file.data )
|
|
{
|
|
storefile = fopen( filepath, "wb" );
|
|
fwrite( file.data, 1, file.size, storefile );
|
|
fclose( storefile );
|
|
}
|
|
ImageData[n] = new GuiImageData( file.data, file.size );
|
|
free( file.data );
|
|
}
|
|
else
|
|
{
|
|
fseek( storefile, 0, SEEK_END );
|
|
u32 filesize = ftell( storefile );
|
|
u8 *buffer = ( u8* ) malloc( filesize );
|
|
rewind( storefile );
|
|
fread( buffer, 1, filesize, storefile );
|
|
fclose( storefile );
|
|
ImageData[n] = new GuiImageData( buffer, filesize );
|
|
free( buffer );
|
|
buffer = NULL;
|
|
}
|
|
Image[n] = new GuiImage( ImageData[n] );
|
|
Image[n]->SetScale( 0.4 );
|
|
Image[n]->SetPosition( 50, -45 );
|
|
MainButton[n]->SetIcon( Image[n] );
|
|
MainButton[n]->SetLabel( MainButtonTxt[n] );
|
|
}
|
|
n++;
|
|
}
|
|
|
|
ProgressStop();
|
|
|
|
HaltGui();
|
|
for ( int i = 0; i < pagesize; i++ )
|
|
{
|
|
if ( MainButtonTxt[i] )
|
|
w.Append( MainButton[i] );
|
|
}
|
|
ResumeGui();
|
|
|
|
listchanged = false;
|
|
|
|
while ( !listchanged )
|
|
{
|
|
VIDEO_WaitVSync ();
|
|
|
|
if ( shutdown == 1 )
|
|
Sys_Shutdown();
|
|
else if ( reset == 1 )
|
|
Sys_Reboot();
|
|
|
|
else if ( wifiBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
Initialize_Network();
|
|
wifiBtn.ResetState();
|
|
}
|
|
else if ( backBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
listchanged = true;
|
|
menu = MENU_SETTINGS;
|
|
backBtn.ResetState();
|
|
break;
|
|
}
|
|
else if ( GoRightBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
listchanged = true;
|
|
currenttheme += pagesize;
|
|
currentpage++;
|
|
if ( currenttheme >= ThemesOnPage )
|
|
{
|
|
currentpage = 1;
|
|
currenttheme = 0;
|
|
}
|
|
GoRightBtn.ResetState();
|
|
}
|
|
else if ( GoLeftBtn.GetState() == STATE_CLICKED )
|
|
{
|
|
listchanged = true;
|
|
currenttheme -= pagesize;
|
|
currentpage--;
|
|
if ( currenttheme < 0 )
|
|
{
|
|
currentpage = roundup( ( ThemesOnPage + 1.0f ) / pagesize );
|
|
currenttheme = currentpage * pagesize - pagesize;
|
|
}
|
|
GoLeftBtn.ResetState();
|
|
}
|
|
|
|
for ( int i = 0; i < pagesize; i++ )
|
|
{
|
|
if ( MainButton[i]->GetState() == STATE_CLICKED )
|
|
{
|
|
snprintf( url, sizeof( url ), "%s", Theme->GetDownloadLink( currenttheme + i ) );
|
|
int ret = Theme_Prompt( Theme->GetThemeTitle( currenttheme + i ), Theme->GetThemeAuthor( currenttheme + i ), ImageData[i], url );
|
|
MainButton[i]->ResetState();
|
|
if ( ret == 2 )
|
|
{
|
|
listchanged = true;
|
|
menu = MENU_THEMEDOWNLOADER;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
w.SetEffect( EFFECT_FADE, -20 );
|
|
|
|
while ( w.GetEffect() > 0 ) usleep( 100 );
|
|
|
|
HaltGui();
|
|
mainWindow->Remove( &w );
|
|
|
|
for ( int i = 0; i < pagesize; i++ )
|
|
{
|
|
if ( MainButton[i] )
|
|
delete MainButton[i];
|
|
if ( theme_box_img[i] )
|
|
delete theme_box_img[i];
|
|
if ( ImageData[i] )
|
|
delete ImageData[i];
|
|
if ( Image[i] )
|
|
delete Image[i];
|
|
if ( MainButtonTxt[i] )
|
|
delete MainButtonTxt[i];
|
|
}
|
|
|
|
if ( Theme )
|
|
delete Theme;
|
|
Theme = NULL;
|
|
|
|
ResumeGui();
|
|
|
|
return menu;
|
|
}
|