mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 21:37:42 -07:00
hook up savestate shito
This commit is contained in:
parent
47ff012f5e
commit
5fbad464c2
@ -47,7 +47,7 @@ bool LoadBIOS();
|
|||||||
// note: loading a ROM to the NDS slot resets emulation
|
// note: loading a ROM to the NDS slot resets emulation
|
||||||
bool LoadROM(const char* file, int slot);
|
bool LoadROM(const char* file, int slot);
|
||||||
|
|
||||||
// get the filename associated with the given savestate slot
|
// get the filename associated with the given savestate slot (1-8)
|
||||||
void GetSavestateName(int slot, char* filename, int len);
|
void GetSavestateName(int slot, char* filename, int len);
|
||||||
|
|
||||||
// determine whether the given savestate slot does contain a savestate
|
// determine whether the given savestate slot does contain a savestate
|
||||||
|
@ -69,6 +69,8 @@ bool LoadBIOS()
|
|||||||
|
|
||||||
NDS::LoadBIOS();
|
NDS::LoadBIOS();
|
||||||
|
|
||||||
|
SavestateLoaded = false;
|
||||||
|
|
||||||
// TODO: error reporting?
|
// TODO: error reporting?
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -395,7 +395,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
|||||||
{
|
{
|
||||||
QMenu* menu = menubar->addMenu("File");
|
QMenu* menu = menubar->addMenu("File");
|
||||||
|
|
||||||
actOpenROM = menu->addAction("Open file...");
|
actOpenROM = menu->addAction("Open ROM...");
|
||||||
connect(actOpenROM, &QAction::triggered, this, &MainWindow::onOpenFile);
|
connect(actOpenROM, &QAction::triggered, this, &MainWindow::onOpenFile);
|
||||||
|
|
||||||
//actBootFirmware = menu->addAction("Launch DS menu");
|
//actBootFirmware = menu->addAction("Launch DS menu");
|
||||||
@ -404,6 +404,49 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
|||||||
|
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
|
|
||||||
|
{
|
||||||
|
QMenu* submenu = menu->addMenu("Save state");
|
||||||
|
|
||||||
|
for (int i = 1; i < 9; i++)
|
||||||
|
{
|
||||||
|
char title[16];
|
||||||
|
sprintf(title, "%d", i);
|
||||||
|
actSaveState[i] = submenu->addAction(title);
|
||||||
|
actSaveState[i]->setShortcut(QKeySequence(Qt::ShiftModifier | (Qt::Key_F1+i-1)));
|
||||||
|
actSaveState[i]->setData(QVariant(i));
|
||||||
|
connect(actSaveState[i], &QAction::triggered, this, &MainWindow::onSaveState);
|
||||||
|
}
|
||||||
|
|
||||||
|
actSaveState[0] = submenu->addAction("File...");
|
||||||
|
actSaveState[0]->setShortcut(QKeySequence(Qt::ShiftModifier | Qt::Key_F9));
|
||||||
|
actSaveState[0]->setData(QVariant(0));
|
||||||
|
connect(actSaveState[0], &QAction::triggered, this, &MainWindow::onSaveState);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
QMenu* submenu = menu->addMenu("Load state");
|
||||||
|
|
||||||
|
for (int i = 1; i < 9; i++)
|
||||||
|
{
|
||||||
|
char title[16];
|
||||||
|
sprintf(title, "%d", i);
|
||||||
|
actLoadState[i] = submenu->addAction(title);
|
||||||
|
actLoadState[i]->setShortcut(QKeySequence(Qt::Key_F1+i-1));
|
||||||
|
actLoadState[i]->setData(QVariant(i));
|
||||||
|
connect(actLoadState[i], &QAction::triggered, this, &MainWindow::onLoadState);
|
||||||
|
}
|
||||||
|
|
||||||
|
actLoadState[0] = submenu->addAction("File...");
|
||||||
|
actLoadState[0]->setShortcut(QKeySequence(Qt::Key_F9));
|
||||||
|
actLoadState[0]->setData(QVariant(0));
|
||||||
|
connect(actLoadState[0], &QAction::triggered, this, &MainWindow::onLoadState);
|
||||||
|
}
|
||||||
|
|
||||||
|
actUndoStateLoad = menu->addAction("Undo state load");
|
||||||
|
actUndoStateLoad->setShortcut(QKeySequence(Qt::Key_F12));
|
||||||
|
connect(actUndoStateLoad, &QAction::triggered, this, &MainWindow::onUndoStateLoad);
|
||||||
|
|
||||||
|
menu->addSeparator();
|
||||||
|
|
||||||
actQuit = menu->addAction("Quit");
|
actQuit = menu->addAction("Quit");
|
||||||
connect(actQuit, &QAction::triggered, this, &MainWindow::onQuit);
|
connect(actQuit, &QAction::triggered, this, &MainWindow::onQuit);
|
||||||
}
|
}
|
||||||
@ -499,6 +542,102 @@ void MainWindow::onBootFirmware()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onSaveState()
|
||||||
|
{
|
||||||
|
int slot = ((QAction*)sender())->data().toInt();
|
||||||
|
|
||||||
|
emuThread->emuPause(true);
|
||||||
|
|
||||||
|
char filename[1024];
|
||||||
|
if (slot > 0)
|
||||||
|
{
|
||||||
|
Frontend::GetSavestateName(slot, filename, 1024);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: specific 'last directory' for savestate files?
|
||||||
|
QString qfilename = QFileDialog::getSaveFileName(this,
|
||||||
|
"Save state",
|
||||||
|
Config::LastROMFolder,
|
||||||
|
"melonDS savestates (*.mln);;Any file (*.*)");
|
||||||
|
if (qfilename.isEmpty())
|
||||||
|
{
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(filename, qfilename.toStdString().c_str(), 1023); filename[1023] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Frontend::SaveState(filename))
|
||||||
|
{
|
||||||
|
// TODO: OSD message
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: OSD error message?
|
||||||
|
}
|
||||||
|
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onLoadState()
|
||||||
|
{
|
||||||
|
int slot = ((QAction*)sender())->data().toInt();
|
||||||
|
|
||||||
|
emuThread->emuPause(true);
|
||||||
|
|
||||||
|
char filename[1024];
|
||||||
|
if (slot > 0)
|
||||||
|
{
|
||||||
|
Frontend::GetSavestateName(slot, filename, 1024);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: specific 'last directory' for savestate files?
|
||||||
|
QString qfilename = QFileDialog::getOpenFileName(this,
|
||||||
|
"Load state",
|
||||||
|
Config::LastROMFolder,
|
||||||
|
"melonDS savestates (*.ml*);;Any file (*.*)");
|
||||||
|
if (qfilename.isEmpty())
|
||||||
|
{
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(filename, qfilename.toStdString().c_str(), 1023); filename[1023] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Platform::FileExists(filename))
|
||||||
|
{
|
||||||
|
/*char msg[64];
|
||||||
|
if (slot > 0) sprintf(msg, "State slot %d is empty", slot);
|
||||||
|
else sprintf(msg, "State file does not exist");
|
||||||
|
OSD::AddMessage(0xFFA0A0, msg);*/
|
||||||
|
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Frontend::LoadState(filename))
|
||||||
|
{
|
||||||
|
// TODO: OSD message
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: OSD error message?
|
||||||
|
}
|
||||||
|
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onUndoStateLoad()
|
||||||
|
{
|
||||||
|
emuThread->emuPause(true);
|
||||||
|
Frontend::UndoStateLoad();
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onQuit()
|
void MainWindow::onQuit()
|
||||||
{
|
{
|
||||||
QApplication::quit();
|
QApplication::quit();
|
||||||
|
@ -81,6 +81,9 @@ protected:
|
|||||||
private slots:
|
private slots:
|
||||||
void onOpenFile();
|
void onOpenFile();
|
||||||
void onBootFirmware();
|
void onBootFirmware();
|
||||||
|
void onSaveState();
|
||||||
|
void onLoadState();
|
||||||
|
void onUndoStateLoad();
|
||||||
void onQuit();
|
void onQuit();
|
||||||
|
|
||||||
void onTitleUpdate(QString title);
|
void onTitleUpdate(QString title);
|
||||||
@ -90,6 +93,9 @@ private:
|
|||||||
|
|
||||||
QAction* actOpenROM;
|
QAction* actOpenROM;
|
||||||
QAction* actBootFirmware;
|
QAction* actBootFirmware;
|
||||||
|
QAction* actSaveState[9];
|
||||||
|
QAction* actLoadState[9];
|
||||||
|
QAction* actUndoStateLoad;
|
||||||
QAction* actQuit;
|
QAction* actQuit;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user