akmenu-next/arm9/source/expwnd.cpp
2024-10-13 02:11:14 -07:00

222 lines
7.0 KiB
C++

/*
expwnd.cpp
Copyright (C) 2007-2009 somebody
Copyright (C) 2009 yellow wood goblin
SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "expwnd.h"
#include <fat.h>
#include "datetime.h"
#include "exptools.h"
#include "fontfactory.h"
#include "language.h"
#include "msgbox.h"
#include "progresswnd.h"
#include "uisettings.h"
#include "windowmanager.h"
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 < pages; ii++) {
expansion().SetRampage(ii);
cExpansion::ReadSram(0x0A000000, buf + ii * page, page);
progressWnd().setPercent(ii * page * 90 / size);
}
expansion().SetRampage(ramPage);
fwrite(buf, size, 1, saveFile);
progressWnd().setPercent(100);
progressWnd().hide();
free(buf);
}
fclose(saveFile);
}
cForm::onOK();
}
void cExpWnd::onShow() {
centerScreen();
}