akmenu-next/arm9/source/mainwnd.cpp
2024-10-04 22:35:39 -07:00

910 lines
27 KiB
C++

/*
mainwnd.cpp
Copyright (C) 2007 Acekard, www.acekard.com
Copyright (C) 2007-2009 somebody
Copyright (C) 2009 yellow wood goblin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dbgtool.h"
#include "windowmanager.h"
#include "mainwnd.h"
#include "msgbox.h"
#include "systemfilenames.h"
#include "timer.h"
#include "../../share/timetool.h"
#include "../../share/fifotool.h"
#include "testcases.h"
#include "datetime.h"
#include "romloader.h"
#include "progresswnd.h"
#include "files.h"
#include "inifile.h"
#include "language.h"
#include "testcases.h"
#include "rominfownd.h"
#include "helpwnd.h"
#include "expwnd.h"
#include "gbaloader.h"
#include "romlauncher.h"
#include "sdidentify.h"
#include "favorites.h"
#ifdef DEBUG
#include "iocmn.h"
#endif
#include <sys/iosupport.h>
#include <elm.h>
using namespace akui;
cMainWnd::cMainWnd( s32 x, s32 y, u32 w, u32 h, cWindow * parent, const std::string & text ):
cForm( x, y, w, h, parent, text ),_mainList(NULL),_startMenu(NULL),_startButton(NULL),
_brightnessButton(NULL),_folderUpButton(NULL),_folderText(NULL),_processL(false)
{
}
cMainWnd::~cMainWnd()
{
delete _folderText;
delete _folderUpButton;
delete _brightnessButton;
delete _startButton;
delete _startMenu;
delete _mainList;
windowManager().removeWindow(this);
}
void cMainWnd::init()
{
int x = 0;
int y = 0;
int w = 0;
int h = 0;
COLOR color = 0;
std::string file("");
std::string text("");
CIniFile ini( SFN_UI_SETTINGS );
// self init
dbg_printf( "mainwnd init() %08x\n", this );
loadAppearance( SFN_LOWER_SCREEN_BG );
windowManager().addWindow( this );
// init game file list
//waitMs( 2000 );
_mainList = new cMainList( 4, 20, 248, 152, this, "main list" );
_mainList->setRelativePosition( cPoint(4, 20) );
_mainList->init();
_mainList->selectChanged.connect( this, &cMainWnd::listSelChange );
_mainList->selectedRowClicked.connect( this, &cMainWnd::onMainListSelItemClicked );
_mainList->selectedRowHeadClicked.connect( this, &cMainWnd::onMainListSelItemHeadClicked );
_mainList->directoryChanged.connect( this, &cMainWnd::onFolderChanged );
_mainList->animateIcons.connect( this, &cMainWnd::onAnimation );
//_mainList->enterDir( "fat0:/" );
addChildWindow( _mainList );
dbg_printf( "mainlist %08x\n", _mainList );
//waitMs( 1000 );
// init start button
x = ini.GetInt( "start button", "x", 0 );
y = ini.GetInt( "start button", "y", 172 );
w = ini.GetInt( "start button", "w", 48 );
h = ini.GetInt( "start button", "h", 10 );
color = ini.GetInt( "start button", "textColor", 0x7fff );
file = ini.GetString( "start button", "file", "none" );
text = ini.GetString( "start button", "text", "START" );
if(file!="none")
{
file=SFN_UI_CURRENT_DIRECTORY+file;
}
if(text=="ini")
{
text=LANG("start menu","START");
}
//_startButton = new cButton( 0, 172, 48, 18, this, " Start" );
_startButton = new cButton( x, y, w, h, this, text );
_startButton->setStyle(cButton::press);
_startButton->setRelativePosition( cPoint(x, y) );
_startButton->loadAppearance( file );
_startButton->clicked.connect( this, &cMainWnd::startButtonClicked );
_startButton->setTextColor( color | BIT(15) );
if(!ini.GetInt( "start button", "show", 1 )) _startButton->hide();
addChildWindow( _startButton );
// init brightness button
x = ini.GetInt( "brightness btn", "x", 240 );
y = ini.GetInt( "brightness btn", "y", 1 );
w = ini.GetInt( "brightness btn", "w", 16 );
h = ini.GetInt( "brightness btn", "h", 16 );
_brightnessButton = new cButton( x, y, w, h, this, "" );
_brightnessButton->setRelativePosition( cPoint(x, y) );
_brightnessButton->loadAppearance( SFN_BRIGHTNESS_BUTTON );
_brightnessButton->pressed.connect( this, &cMainWnd::brightnessButtonClicked );
addChildWindow( _brightnessButton );
x = ini.GetInt( "folderup btn", "x", 0 );
y = ini.GetInt( "folderup btn", "y", 2 );
w = ini.GetInt( "folderup btn", "w", 32 );
h = ini.GetInt( "folderup btn", "h", 16 );
_folderUpButton = new cButton( x, y, w, h, this, "" );
_folderUpButton->setRelativePosition( cPoint(x, y) );
_folderUpButton->loadAppearance( SFN_FOLDERUP_BUTTON );
_folderUpButton->setSize( cSize(w,h) );
_folderUpButton->pressed.connect( _mainList, &cMainList::backParentDir );
addChildWindow( _folderUpButton );
x = ini.GetInt( "folder text", "x", 20 );
y = ini.GetInt( "folder text", "y", 2 );
w = ini.GetInt( "folder text", "w", 160 );
h = ini.GetInt( "folder text", "h", 16 );
_folderText = new cStaticText( x, y, w, h, this, "" );
_folderText->setRelativePosition( cPoint(x, y) );
_folderText->setTextColor( ini.GetInt( "folder text", "color", 0 ) );
addChildWindow( _folderText );
// init startmenu
_startMenu = new cStartMenu( 160, 40, 61,108, this, "start menu" );
//_startMenu->setRelativePosition( cPoint(160, 40) );
_startMenu->init();
_startMenu->itemClicked.connect( this, &cMainWnd::startMenuItemClicked );
_startMenu->hide();
_startMenu->setRelativePosition( _startMenu->position() );
addChildWindow( _startMenu );
//windowManager().addWindow( _startMenu );
dbg_printf( "startMenu %08x\n", _startMenu );
arrangeChildren();
}
void cMainWnd::draw()
{
cForm::draw();
}
void cMainWnd::listSelChange( u32 i )
{
#ifdef DEBUG
//dbg_printf( "main list item %d\n", i );
DSRomInfo info;
if( _mainList->getRomInfo( i, info ) ) {
char title[13] = {}; memcpy( title, info.saveInfo().gameTitle, 12 );
char code[5] = {}; memcpy( code, info.saveInfo().gameCode, 4 );
u16 crc = swiCRC16( 0xffff, ((unsigned char *)&(info.banner())) + 32, 0x840 - 32);
dbg_printf( "%s %s %04x %d %04x/%04x\n",
title, code, info.saveInfo().gameCRC, info.isDSRom(), info.banner().crc,crc );
//dbg_printf("sizeof banner %08x\n", sizeof( info.banner() ) );
}
#endif//DEBUG
}
void cMainWnd::startMenuItemClicked( s16 i )
{
dbg_printf( "start menu item %d\n", i );
//messageBox( this, "Power Off", "Are you sure you want to turn off ds?", MB_YES | MB_NO );
if( START_MENU_ITEM_COPY == i ) {
if( "" == _mainList->getSelectedFullPath() )
return;
struct stat st;
stat( _mainList->getSelectedFullPath().c_str(), &st );
if( st.st_mode & S_IFDIR ) {
messageBox( this, LANG("no copy dir", "title"), LANG("no copy dir", "text"), MB_YES | MB_NO );
return;
}
setSrcFile( _mainList->getSelectedFullPath(), SFM_COPY );
}
else if( START_MENU_ITEM_CUT == i ) {
if( "" == _mainList->getSelectedFullPath() )
return;
struct stat st;
stat( _mainList->getSelectedFullPath().c_str(), &st );
if( st.st_mode & S_IFDIR ) {
messageBox( this, LANG("no copy dir", "title"), LANG("no copy dir", "text"), MB_YES | MB_NO );
return;
}
setSrcFile( _mainList->getSelectedFullPath(), SFM_CUT );
}
else if( START_MENU_ITEM_PASTE == i )
{
bool ret=false;
if(_mainList->IsFavorites())
{
ret=cFavorites::AddToFavorites(getSrcFile());
}
else
{
ret=copyOrMoveFile(_mainList->getCurrentDir());
}
if(ret) // refresh current directory
_mainList->enterDir(_mainList->getCurrentDir());
}
else if( START_MENU_ITEM_DELETE == i ) {
std::string fullPath = _mainList->getSelectedFullPath();
if( "" != fullPath )
{
bool ret=false;
if(_mainList->IsFavorites())
{
ret=cFavorites::RemoveFromFavorites(fullPath);
}
else
{
ret=deleteFile(fullPath);
}
if(ret)
_mainList->enterDir(_mainList->getCurrentDir());
}
}
else if( START_MENU_ITEM_SETTING == i ) {
showSettings();
}
else if( START_MENU_ITEM_INFO == i ) {
showFileInfo();
}
else if( START_MENU_ITEM_HELP == i ) {
CIniFile ini(SFN_UI_SETTINGS); //(256-)/2,(192-128)/2, 220, 128
u32 w = 200;
u32 h = 160;
w = ini.GetInt( "help window", "w", w );
h = ini.GetInt( "help window", "h", h );
cHelpWnd * helpWnd = new cHelpWnd( (256-w)/2, (192-h)/2, w, h, this, LANG("help window", "title" ) );
helpWnd->doModal();
delete helpWnd;
}
else if( START_MENU_ITEM_TOOLS == i ) {
u32 w=250;
u32 h=130;
cExpWnd expWnd((256-w)/2,(192-h)/2,w,h,NULL,LANG("exp window","title"));
expWnd.doModal();
}
}
void cMainWnd::startButtonClicked()
{
if( _startMenu->isVisible() )
{
_startMenu->hide();
}
else {
if(!gs().safeMode) _startMenu->show();
}
}
void cMainWnd::brightnessButtonClicked()
{
gs().nextBrightness();
}
cWindow& cMainWnd::loadAppearance(const std::string & aFileName )
{
return *this;
}
bool cMainWnd::process( const cMessage & msg )
{
if( _startMenu->isVisible() ) return _startMenu->process( msg );
bool ret = false;
ret = cForm::process( msg );
if( !ret ) {
if( msg.id() > cMessage::keyMessageStart && msg.id()
< cMessage::keyMessageEnd )
{
ret = processKeyMessage( (cKeyMessage &)msg );
}
if( msg.id() > cMessage::touchMessageStart && msg.id()
< cMessage::touchMessageEnd )
{
ret = processTouchMessage( (cTouchMessage &)msg );
}
}
return ret;
}
bool cMainWnd::processKeyMessage( const cKeyMessage & msg )
{
bool ret = false, isL = msg.shift()&cKeyMessage::UI_SHIFT_L;
bool allow = !gs().safeMode;
if( msg.id() == cMessage::keyDown )
{
switch( msg.keyCode() )
{
case cKeyMessage::UI_KEY_DOWN:
_mainList->selectNext();
ret = true;
break;
case cKeyMessage::UI_KEY_UP:
_mainList->selectPrev();
ret = true;
break;
case cKeyMessage::UI_KEY_LEFT:
_mainList->selectRow( _mainList->selectedRowId() - _mainList->visibleRowCount() );
ret = true;
break;
case cKeyMessage::UI_KEY_RIGHT:
_mainList->selectRow( _mainList->selectedRowId() + _mainList->visibleRowCount() );
ret = true;
break;
case cKeyMessage::UI_KEY_A:
onKeyAPressed();
ret = true;
break;
case cKeyMessage::UI_KEY_B:
onKeyBPressed();
ret = true;
break;
case cKeyMessage::UI_KEY_Y:
if(isL)
{
showSettings();
_processL = false;
}
else
{
onKeyYPressed();
}
ret = true;
break;
case cKeyMessage::UI_KEY_X: {
if(isL)
{
if(allow)
{
DSRomInfo rominfo;
if(_mainList->getRomInfo(_mainList->selectedRowId(),rominfo)&&rominfo.isDSRom()&&!rominfo.isHomebrew())
{
cRomInfoWnd::showCheats(_mainList->getSelectedFullPath());
}
}
_processL = false;
}
else
{
#if defined(_STORAGE_rpg)
const std::string dir = _mainList->getCurrentDir();
if( dir.length() < 5 ) {
_mainList->enterDir( "fat0:/" );
} else if( dir.substr( 0, 5 ) == "fat0:" ) {
_mainList->enterDir( "fat1:/" );
} else {
_mainList->enterDir( "fat0:/" );
}
#elif defined(_STORAGE_r4) || defined(_STORAGE_ak2i) || defined(_STORAGE_r4idsn)
_mainList->enterDir( "favorites:/" );
#endif
}
ret = true;
break;
}
case cKeyMessage::UI_KEY_START:
startButtonClicked();
ret = true;
break;
case cKeyMessage::UI_KEY_SELECT:
if(isL)
{
if(allow) _mainList->SwitchShowAllFiles();
_processL = false;
}
else
{
if(allow) _mainList->setViewMode((cMainList::VIEW_MODE)((_mainList->getViewMode()+1)%3));
}
ret = true;
break;
case cKeyMessage::UI_KEY_L:
_processL = true;
ret = true;
break;
case cKeyMessage::UI_KEY_R:
brightnessButtonClicked();
#ifdef DEBUG
gdi().switchSubEngineMode();gdi().present( GE_SUB );
#endif//DEBUG
ret = true;
break;
default:
{}
};
}
if( msg.id() == cMessage::keyUp )
{
switch( msg.keyCode() )
{
case cKeyMessage::UI_KEY_L:
if(_processL)
{
_mainList->backParentDir();
_processL = false;
}
ret = true;
break;
}
}
return ret;
}
bool cMainWnd::processTouchMessage( const cTouchMessage & msg )
{
bool ret = false;
return ret;
}
void cMainWnd::onKeyYPressed()
{
if(gs().safeMode) return;
#ifdef DEBUG
// hardware version check
{
dbg_printf("HW: %02x\n",ioVersion());
}
#endif//#ifdef DEBUG
showFileInfo();
}
void cMainWnd::onMainListSelItemClicked( u32 index )
{
}
void cMainWnd::onMainListSelItemHeadClicked( u32 index )
{
onKeyAPressed();
}
void cMainWnd::onKeyAPressed()
{
launchSelected();
}
void cMainWnd::launchSelected()
{
std::string fullPath = _mainList->getSelectedFullPath();
if( fullPath[fullPath.size()-1] == '/' ) {
_mainList->enterDir( fullPath );
return;
}
DSRomInfo rominfo;
if( !_mainList->getRomInfo( _mainList->selectedRowId(), rominfo ) )
return;
//rominfo.loadDSRomInfo( fullPath, false );
if( rominfo.isGbaRom() )
{
CGbaLoader(fullPath).Load(false,false);
return;
}
if(!rominfo.isDSRom()) return;
dbg_printf("(%s)\n", fullPath.c_str() );
dbg_printf("%d\n", fullPath[fullPath.size()-1] );
std::string title,text; bool show=true;
switch(launchRom(fullPath,rominfo,rominfo.isHomebrew()&&"akmenu4.nds"==_mainList->getSelectedShowName()))
{
#if defined(_STORAGE_rpg)
case ELaunchSDOnly:
title=LANG("sd save","title");
text=LANG("sd save","text");
break;
case ELaunchRestoreFail:
title=LANG("restore save fail","title");
text=LANG("restore save fail","text");
break;
#endif
#if defined(_STORAGE_rpg) || defined(_STORAGE_ak2i)
case ELaunchSlowSD:
{
std::string model=sdidGetSDManufacturerName()+" "+sdidGetSDName();
title=LANG("unsupported sd","title");
text=LANG("unsupported sd","text");
text=formatString(text.c_str(),model.c_str());
}
break;
#endif
case ELaunchNoFreeSpace:
title=LANG("no free space","title");
text=LANG("no free space","text");
break;
default:
show=false;
break;
}
if(show) messageBox(this,title,text,MB_OK);
}
void cMainWnd::onKeyBPressed()
{
_mainList->backParentDir();
}
void cMainWnd::setParam(void)
{
cSettingWnd settingWnd(0,0,252,188,NULL,LANG("system setting","title"));
//page 1: system
std::string currentUIStyle=gs().uiName;
std::vector<std::string> _values;
u32 uiIndex=0,langIndex=0;
//user interface style
_values.clear();
std::vector<std::string> uiNames;
DIR_ITER* dir=diropen(SFN_UI_DIRECTORY);
if(NULL!=dir)
{
struct stat st;
char longFilename[MAX_FILENAME_LENGTH];
while(dirnext(dir,longFilename,&st)==0)
{
std::string lfn(longFilename);
if(lfn!=".."&&lfn!=".") _values.push_back(lfn);
}
dirclose(dir);
dir=NULL;
}
else
{
_values.push_back(gs().uiName);
}
std::sort(_values.begin(),_values.end());
for(size_t ii=0;ii<_values.size();++ii)
{
if(0==stricmp(_values[ii].c_str(),gs().uiName.c_str())) uiIndex=ii;
}
uiNames=_values;
settingWnd.addSettingItem(LANG("ui style","text"),_values,uiIndex);
//language
_values.clear();
std::vector<std::string> langNames;
dir=diropen(SFN_LANGUAGE_DIRECTORY);
if(NULL!=dir )
{
struct stat st;
char longFilename[MAX_FILENAME_LENGTH];
while(dirnext(dir,longFilename,&st)==0)
{
std::string lfn(longFilename);
if(lfn!=".."&&lfn!=".") _values.push_back(lfn);
}
dirclose(dir);
dir=NULL;
}
else
{
_values.push_back(gs().langDirectory);
}
std::sort(_values.begin(),_values.end());
for(size_t ii=0;ii<_values.size();++ii)
{
if(0==stricmp(_values[ii].c_str(),gs().langDirectory.c_str())) langIndex=ii;
}
langNames=_values;
settingWnd.addSettingItem(LANG("language","text"),_values,langIndex);
//file list type
_values.clear();
for(size_t ii=0;ii<3;++ii)
{
std::string itemName=formatString("item%d",ii);
_values.push_back(LANG("filelist type",itemName));
}
settingWnd.addSettingItem(LANG("filelist type","text"),_values,gs().fileListType);
_values.clear();
_values.push_back(LANG("switches","Disable"));
_values.push_back(LANG("switches","Enable"));
settingWnd.addSettingItem(LANG("system setting","safe mode"),_values,gs().safeMode);
//page 2: interface
settingWnd.addSettingTab(LANG("interface settings","title"));
size_t scrollSpeed=0;
switch(gs().scrollSpeed)
{
case cGlobalSettings::EScrollFast:
scrollSpeed=0;
break;
case cGlobalSettings::EScrollMedium:
scrollSpeed=1;
break;
case cGlobalSettings::EScrollSlow:
scrollSpeed=2;
break;
}
_values.clear();
_values.push_back(LANG("scrolling","fast"));
_values.push_back(LANG("scrolling","medium"));
_values.push_back(LANG("scrolling","slow"));
settingWnd.addSettingItem(LANG("interface settings","scrolling speed"),_values,scrollSpeed);
_values.clear();
_values.push_back(LANG("interface settings","oldschool"));
_values.push_back(LANG("interface settings","modern"));
_values.push_back(LANG("interface settings","internal"));
settingWnd.addSettingItem(LANG("interface settings","filelist style"),_values,gs().viewMode);
_values.clear();
_values.push_back(LANG("switches","Disable"));
_values.push_back(LANG("switches","Enable"));
settingWnd.addSettingItem(LANG("interface settings","animation"),_values,gs().Animation);
settingWnd.addSettingItem(LANG("interface settings","12 hour"),_values,gs().show12hrClock);
//page 3: filesystem
settingWnd.addSettingTab(LANG("file settings","title"));
_values.clear();
_values.push_back(LANG("switches","Disable"));
_values.push_back(LANG("switches","Enable"));
settingWnd.addSettingItem(LANG("file settings","show hidden files"),_values,gs().showHiddenFiles);
settingWnd.addSettingItem(LANG("rom trim","text"),_values,gs().romTrim);
_values.clear();
_values.push_back(".nds.sav");
_values.push_back(".sav");
settingWnd.addSettingItem(LANG("file settings","save extension"),_values,gs().saveExt);
//page 4: patches
settingWnd.addSettingTab(LANG("setting window","patches"));
_values.clear();
_values.push_back(LANG("switches","Disable"));
_values.push_back(LANG("switches","Enable"));
settingWnd.addSettingItem(LANG("patches","cheating system"),_values,gs().cheats);
settingWnd.addSettingItem(LANG("patches","reset in game"),_values,gs().softreset);
settingWnd.addSettingItem(LANG("patches","homebrew reset"),_values,gs().homebrewreset);
#if defined(_STORAGE_rpg) || defined(_STORAGE_ak2i)
settingWnd.addSettingItem(LANG("patches","dma"),_values,gs().dma);
#endif
#if defined(_STORAGE_rpg)
settingWnd.addSettingItem(LANG("patches","sd save"),_values,gs().sdsave);
#endif
//page 5: gba
settingWnd.addSettingTab(LANG("gba settings","title"));
_values.clear();
_values.push_back(LANG("switches","Disable"));
_values.push_back(LANG("switches","Enable"));
settingWnd.addSettingItem(LANG("gba settings","sleephack"),_values,gs().gbaSleepHack);
settingWnd.addSettingItem(LANG("gba settings","autosave"),_values,gs().gbaAutoSave);
_values.clear();
_values.push_back(LANG("gba settings","modeask"));
_values.push_back(LANG("gba settings","modegba"));
_values.push_back(LANG("gba settings","modends"));
settingWnd.addSettingItem(LANG("gba settings","mode"),_values,gs().slot2mode);
u32 ret=settingWnd.doModal();
if(ID_CANCEL==ret) return;
//page 1: system
u32 uiIndexAfter=settingWnd.getItemSelection(0,0);
u32 langIndexAfter=settingWnd.getItemSelection(0,1);
gs().fileListType=settingWnd.getItemSelection(0,2);
gs().safeMode=settingWnd.getItemSelection(0,3);
//page 2: interface
switch(settingWnd.getItemSelection(1,0))
{
case 0:
gs().scrollSpeed=cGlobalSettings::EScrollFast;
break;
case 1:
gs().scrollSpeed=cGlobalSettings::EScrollMedium;
break;
case 2:
gs().scrollSpeed=cGlobalSettings::EScrollSlow;
break;
}
gs().viewMode=settingWnd.getItemSelection(1,1);
gs().Animation=settingWnd.getItemSelection(1,2);
gs().show12hrClock=settingWnd.getItemSelection(1,3);
//page 3: filesystem
gs().showHiddenFiles=settingWnd.getItemSelection(2,0);
gs().romTrim=settingWnd.getItemSelection(2,1);
gs().saveExt=settingWnd.getItemSelection(2,2);
//page 4: patches
gs().cheats=settingWnd.getItemSelection(3,0);
gs().softreset=settingWnd.getItemSelection(3,1);
gs().homebrewreset=settingWnd.getItemSelection(3,2);
#if defined(_STORAGE_rpg) || defined(_STORAGE_ak2i)
gs().dma=settingWnd.getItemSelection(3,3);
#endif
#if defined(_STORAGE_rpg)
gs().sdsave=settingWnd.getItemSelection(3,4);
#endif
//page 5: gba
gs().gbaSleepHack=settingWnd.getItemSelection(4,0);
gs().gbaAutoSave=settingWnd.getItemSelection(4,1);
gs().slot2mode=settingWnd.getItemSelection(4,2);
if( uiIndex != uiIndexAfter )
{
u32 ret = messageBox( this,
LANG("ui style changed", "title"),
LANG("ui style changed", "text"), MB_YES | MB_NO );
if( ID_YES == ret ) {
gs().uiName = uiNames[uiIndexAfter];
gs().langDirectory = langNames[langIndexAfter];
gs().saveSettings();
#if defined(_STORAGE_rpg)
loadRom( "fat0:/akmenu4.nds", 0, 0, 0 );
#elif defined(_STORAGE_r4)
loadRom( "fat0:/_ds_menu.dat", "", 0, 0, 0 );
#elif defined(_STORAGE_ak2i)
loadRom( "fat0:/akmenu4.nds", "", 0, 0, 0 );
#elif defined(_STORAGE_r4idsn)
loadRom( "fat0:/_dsmenu.dat", "", 0, 0, 0 );
#endif
}
}
if( langIndex != langIndexAfter )
{
u32 ret = messageBox( this,
LANG("language changed", "title"),
LANG("language changed", "text"), MB_YES | MB_NO );
if( ID_YES == ret )
{
gs().langDirectory = langNames[langIndexAfter];
gs().saveSettings();
#if defined(_STORAGE_rpg)
loadRom( "fat0:/akmenu4.nds", 0, 0, 0 );
#elif defined(_STORAGE_r4)
loadRom( "fat0:/_ds_menu.dat", "", 0, 0, 0 );
#elif defined(_STORAGE_ak2i)
loadRom( "fat0:/akmenu4.nds", "", 0, 0, 0 );
#elif defined(_STORAGE_r4idsn)
loadRom( "fat0:/_dsmenu.dat", "", 0, 0, 0 );
#endif
}
}
gs().saveSettings();
_mainList->setViewMode((cMainList::VIEW_MODE)gs().viewMode);
}
void cMainWnd::showSettings(void)
{
if(gs().safeMode) return;
u8 currentFileListType = gs().fileListType,currentShowHiddenFiles=gs().showHiddenFiles;
setParam();
if(gs().fileListType!=currentFileListType||gs().showHiddenFiles!=currentShowHiddenFiles)
{
_mainList->enterDir(_mainList->getCurrentDir());
}
}
void cMainWnd::showFileInfo()
{
DSRomInfo rominfo;
if( !_mainList->getRomInfo( _mainList->selectedRowId(), rominfo ) ) {
return;
}
dbg_printf("show '%s' info\n", _mainList->getSelectedFullPath().c_str() );
CIniFile ini(SFN_UI_SETTINGS); //(256-)/2,(192-128)/2, 220, 128
u32 w = 240;
u32 h = 144;
w = ini.GetInt( "rom info window", "w", w );
h = ini.GetInt( "rom info window", "h", h );
cRomInfoWnd * romInfoWnd = new cRomInfoWnd( (256-w)/2, (192-h)/2, w, h, this, LANG("rom info", "title" ) );
std::string showName = _mainList->getSelectedShowName();
std::string fullPath = _mainList->getSelectedFullPath();
romInfoWnd->setFileInfo( fullPath, showName );
romInfoWnd->setRomInfo( rominfo );
romInfoWnd->setSaves(_mainList->Saves());
romInfoWnd->doModal();
rominfo = romInfoWnd->getRomInfo();
_mainList->setRomInfo( _mainList->selectedRowId(), rominfo );
delete romInfoWnd;
}
void cMainWnd::onFolderChanged()
{
resetInputIdle();
std::string dirShowName = _mainList->getCurrentDir();
#if defined(_STORAGE_rpg)
if( dirShowName.substr( 0, 5 ) == "fat0:" )
dirShowName.replace( 0, 4, "Flash" );
else
#endif
if( dirShowName.substr( 0, 5 ) == SD_ROOT_0 )
dirShowName.replace( 0, 4, "SD" );
else if( "favorites:/" != dirShowName && "slot2:/" == _mainList->getSelectedFullPath() )
{
u8 chk = 0;
for( u32 i = 0xA0; i < 0xBD; ++i ) {
chk = chk - *(u8*)(0x8000000+i);
}
chk = (chk- 0x19) & 0xff;
if( chk != GBA_HEADER.complement ) {
dbg_printf("chk %02x header checksum %02x\n", chk, GBA_HEADER.complement );
std::string title = LANG("no gba card", "title");
std::string text = LANG("no gba card", "text");
messageBox( NULL, title, text, MB_OK );
_mainList->enterDir( "..." );
_mainList->selectRow( _mainList->Slot2() );
return;
}
int mode=gs().slot2mode;
if(mode==cGlobalSettings::ESlot2Ask)
{
if(ID_YES==messageBox(NULL,LANG("gba settings","mode"),LANG("gba settings","modetext"),MB_YES_NO))
{
mode=cGlobalSettings::ESlot2Nds;
}
else
{
mode=cGlobalSettings::ESlot2Gba;
}
}
if(mode==cGlobalSettings::ESlot2Nds)
{
#if defined(_STORAGE_rpg)
loadRom("slot2:/",0,0,0);
#elif defined(_STORAGE_r4) || defined(_STORAGE_ak2i) || defined(_STORAGE_r4idsn)
loadRom("slot2:/","",0,0,0);
#endif
}
else
{
CGbaLoader::StartGBA();
}
}
dbg_printf("%s\n", _mainList->getSelectedFullPath().c_str() );
_folderText->setText( dirShowName );
}
void cMainWnd::onAnimation(bool& anAllow)
{
if(_startMenu->isVisible()) anAllow=false;
else if(windowManager().currentWindow()!=this) anAllow=false;
}
cWindow* cMainWnd::windowBelow(const cPoint & p)
{
cWindow* wbp=cForm::windowBelow(p);
if(_startMenu->isVisible()&&wbp!=_startButton) wbp=_startMenu;
return wbp;
}