/* expwnd.cpp 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 . */ #include "expwnd.h" #include "msgbox.h" #include "windowmanager.h" #include "uisettings.h" #include "language.h" #include "exptools.h" #include "datetime.h" #include "progresswnd.h" #include "fontfactory.h" #include using namespace akui; cExpWnd::cExpWnd( s32 x, s32 y, u32 w, u32 h, cWindow * parent, const std::string & text ) : cForm( x, y, w, h, parent, text ), _buttonOK(0,0,46,18,this,"\x01 OK"), _buttonCancel(0,0,48,18,this,"\x02 Cancel"), _buttonRAM(0,0,46,18,this,"\x03 RAM"), _buttonSRAM(0,0,46,18,this,"\x04 SRAM"), _Rumble(0,0,108,18,this,"spin"), _Label( 0, 0, 20 * 6, gs().fontHeight, this, "rumble strength" ) { s16 buttonY = size().y - _buttonCancel.size().y - 4; _buttonCancel.setStyle( cButton::press ); _buttonCancel.setText( "\x02 " + LANG( "setting window", "cancel" ) ); _buttonCancel.setTextColor( uis().buttonTextColor ); _buttonCancel.loadAppearance( SFN_BUTTON3 ); _buttonCancel.clicked.connect( this, &cExpWnd::onCancel ); addChildWindow( &_buttonCancel ); _buttonOK.setStyle( cButton::press ); _buttonOK.setText( "\x01 " + LANG( "setting window", "ok" ) ); _buttonOK.setTextColor( uis().buttonTextColor ); _buttonOK.loadAppearance( SFN_BUTTON3 ); _buttonOK.clicked.connect( this, &cExpWnd::onOK ); addChildWindow( &_buttonOK ); _buttonRAM.setStyle( cButton::press ); _buttonRAM.setText( "\x03 " + LANG( "exp window", "ram" ) ); _buttonRAM.setTextColor( uis().buttonTextColor ); _buttonRAM.loadAppearance( SFN_BUTTON3 ); _buttonRAM.clicked.connect( this, &cExpWnd::onRAM ); addChildWindow( &_buttonRAM ); _buttonSRAM.setStyle( cButton::press ); _buttonSRAM.setText( "\x04 " + LANG( "exp window", "sram" ) ); _buttonSRAM.setTextColor( uis().buttonTextColor ); _buttonSRAM.loadAppearance( SFN_BUTTON3 ); _buttonSRAM.clicked.connect( this, &cExpWnd::onSRAM ); addChildWindow( &_buttonSRAM ); s16 nextButtonX = size().x; s16 buttonPitch = _buttonCancel.size().x + 4; nextButtonX -= buttonPitch; _buttonCancel.setRelativePosition( cPoint(nextButtonX, buttonY) ); buttonPitch = _buttonOK.size().x + 4; nextButtonX -= buttonPitch; _buttonOK.setRelativePosition( cPoint(nextButtonX, buttonY) ); buttonPitch = _buttonRAM.size().x + 4; nextButtonX -= buttonPitch; _buttonRAM.setRelativePosition( cPoint(nextButtonX, buttonY) ); buttonPitch = _buttonSRAM.size().x + 4; nextButtonX -= buttonPitch; _buttonSRAM.setRelativePosition( cPoint(nextButtonX, buttonY) ); s32 itemY = 32; s32 itemX = 8; const char* rumbleLang[]={"off","low","mid","high"}; for( size_t i = 0; i < 4; ++i ) { _Rumble.insertItem( LANG( "exp window", rumbleLang[i] ) , i ); } CIniFile ini( SFN_UI_SETTINGS ); u32 spinBoxWidth = ini.GetInt( "setting window", "spinBoxWidth", 108 ); _Rumble.loadAppearance( "" ); _Rumble.setSize( cSize(spinBoxWidth, 18) ); _Rumble.setRelativePosition( cPoint( _size.x - spinBoxWidth - 4, itemY ) ); addChildWindow( &_Rumble ); _Rumble.selectItem(0); itemY += (_Rumble.windowRectangle().height() - _Label.windowRectangle().height()) / 2; _Label.setText(LANG( "exp window","strength")); _Label.setRelativePosition( cPoint( itemX, itemY ) ); _Label.setTextColor( uis().formTextColor ); _Label.setSize( cSize( _size.x / 2 + 8, 12 ) ); addChildWindow( &_Label ); loadAppearance( "" ); arrangeChildren(); CIniFile f; _romName=f.LoadIniFile(SFN_LAST_GBA_SAVEINFO)?f.GetString("Save Info","lastLoadedNOR",""):""; _romName=font().breakLine(_romName,size().x-16); } cExpWnd::~cExpWnd() {} void cExpWnd::draw() { _renderDesc.draw( windowRectangle(), _engine ); gdi().setPenColor( uiSettings().formTextColor,_engine ); int textY=_Rumble.position().y+_Rumble.size().y+8,textHeight=_buttonOK.position().y-8-textY; gdi().textOutRect(position().x+8,textY,size().x-16,textHeight,_romName.c_str(),_engine); cForm::draw(); } bool cExpWnd::process( const akui::cMessage & msg ) { bool ret = false; ret = cForm::process( msg ); if( !ret ) { if( msg.id() > cMessage::keyMessageStart && msg.id() < cMessage::keyMessageEnd ) { ret = processKeyMessage( (cKeyMessage &)msg ); } } return ret; } bool cExpWnd::processKeyMessage( const cKeyMessage & msg ) { bool ret = false; if( msg.id() == cMessage::keyDown ) { switch( msg.keyCode() ) { case cKeyMessage::UI_KEY_A: onOK(); ret = true; break; case cKeyMessage::UI_KEY_B: onCancel(); ret = true; break; case cKeyMessage::UI_KEY_X: onRAM(); ret = true; break; case cKeyMessage::UI_KEY_Y: onSRAM(); ret = true; break; case cKeyMessage::UI_KEY_LEFT: _Rumble.selectPrev(); ret = true; break; case cKeyMessage::UI_KEY_RIGHT: _Rumble.selectNext(); ret = true; break; default: {} }; } return ret; } cWindow& cExpWnd::loadAppearance(const std::string& aFileName ) { _renderDesc.loadData( SFN_FORM_TITLE_L, SFN_FORM_TITLE_R, SFN_FORM_TITLE_M ); _renderDesc.setTitleText( _text ); return *this; } void cExpWnd::onOK() { expansion().SoftReset(); if(_Rumble.selectedItemId()>0) cExpansion::SetShake(0xEF+_Rumble.selectedItemId()); cForm::onOK(); } void cExpWnd::onCancel() { cForm::onCancel(); } void cExpWnd::onRAM() { expansion().SoftReset(); cExpansion::SetRompage(0x300); cExpansion::OpenNorWrite(); cExpansion::EnableBrowser(); cForm::onOK(); } void cExpWnd::onSRAM() { std::string saveName="fat:/sram-"+datetime().getTimeStampString()+".sav"; const u32 size=4096*128,page=4096,pages=128; FILE* saveFile=fopen(saveName.c_str(),"wb"); if(saveFile) { u8* buf=(u8*)malloc(size); if(buf) { u16 ramPage=expansion().Rampage(); progressWnd().setTipText(LANG("progress window","gba save store" )); progressWnd().show(); progressWnd().setPercent(0); for(u32 ii=0;ii