|
|
|
@@ -5,30 +5,44 @@
|
|
|
|
|
#include <QCoreApplication>
|
|
|
|
|
#include <QStatusBar>
|
|
|
|
|
#include <QTimer>
|
|
|
|
|
#include <QMimeData>
|
|
|
|
|
#include <resources/gamecontrollerdb.h>
|
|
|
|
|
#include <Options.hpp>
|
|
|
|
|
#include <Scheduler.hpp>
|
|
|
|
|
|
|
|
|
|
KaizenGui::KaizenGui() noexcept : settings(QSettings::UserScope) {
|
|
|
|
|
KaizenGui::KaizenGui() noexcept : QMainWindow(nullptr), settings(QSettings::UserScope) {
|
|
|
|
|
SDL_InitSubSystem(SDL_INIT_GAMEPAD);
|
|
|
|
|
|
|
|
|
|
hide();
|
|
|
|
|
|
|
|
|
|
restoreGeometry(settings.value("geometry").toByteArray());
|
|
|
|
|
restoreState(settings.value("windowState").toByteArray());
|
|
|
|
|
|
|
|
|
|
vulkanWidget = new RenderWidget();
|
|
|
|
|
vulkanWidget->hide();
|
|
|
|
|
|
|
|
|
|
cpuTypeLabel = new QLabel("Interpreter");
|
|
|
|
|
if (Options::GetCpuType() == 1)
|
|
|
|
|
cpuTypeLabel->setText("Cached Interpreter");
|
|
|
|
|
|
|
|
|
|
idleSkipLabel = new QLabel("Idle skipping");
|
|
|
|
|
if (!Options::GetIdleSkip())
|
|
|
|
|
idleSkipLabel->hide();
|
|
|
|
|
|
|
|
|
|
fpsLabel = new QLabel("Not running");
|
|
|
|
|
|
|
|
|
|
statusBar()->addWidget(fpsLabel);
|
|
|
|
|
statusBar()->addWidget(cpuTypeLabel);
|
|
|
|
|
statusBar()->addWidget(idleSkipLabel);
|
|
|
|
|
|
|
|
|
|
setWindowTitle("Kaizen " KAIZEN_VERSION_STR);
|
|
|
|
|
setMinimumSize(640, 480);
|
|
|
|
|
setCentralWidget(vulkanWidget);
|
|
|
|
|
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
|
|
|
|
|
statusBarTimer = new QTimer();
|
|
|
|
|
statusBarTimer->setInterval(1000);
|
|
|
|
|
|
|
|
|
|
connect(statusBarTimer, &QTimer::timeout, this, [&] {
|
|
|
|
|
pause->setText("Pause");
|
|
|
|
@@ -60,6 +74,8 @@ KaizenGui::KaizenGui() noexcept : settings(QSettings::UserScope) {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto exit = fileMenu->addAction("Exit");
|
|
|
|
|
connect(exit, &QAction::triggered, this, [&] { Scheduler::GetInstance().EnqueueRelative(0, STOP); });
|
|
|
|
|
connect(exit, &QAction::triggered, this, &QMainWindow::close);
|
|
|
|
|
auto emulationMenu = menuBar()->addMenu("Emulation");
|
|
|
|
|
auto settingsMenu = emulationMenu->addAction("Settings");
|
|
|
|
|
settingsWindow = new SettingsWindow();
|
|
|
|
@@ -71,6 +87,12 @@ KaizenGui::KaizenGui() noexcept : settings(QSettings::UserScope) {
|
|
|
|
|
cpuTypeLabel->setText("Interpreter");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
connect(settingsWindow->cpu, &CPUSettings::idleSkipChanged, this, [&] {
|
|
|
|
|
idleSkipLabel->show();
|
|
|
|
|
if (!Options::GetIdleSkip())
|
|
|
|
|
idleSkipLabel->hide();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
emulationMenu->addSeparator();
|
|
|
|
|
|
|
|
|
|
pause->setDisabled(true);
|
|
|
|
@@ -88,7 +110,10 @@ KaizenGui::KaizenGui() noexcept : settings(QSettings::UserScope) {
|
|
|
|
|
|
|
|
|
|
stop->setDisabled(true);
|
|
|
|
|
emulationMenu->addAction(stop);
|
|
|
|
|
connect(stop, &QAction::triggered, this, [&] { Scheduler::GetInstance().EnqueueRelative(0, STOP); });
|
|
|
|
|
connect(stop, &QAction::triggered, this, [&] {
|
|
|
|
|
Scheduler::GetInstance().EnqueueRelative(0, STOP);
|
|
|
|
|
vulkanWidget->show();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto helpMenu = menuBar()->addMenu("Help");
|
|
|
|
|
auto about = helpMenu->addAction("About");
|
|
|
|
@@ -103,9 +128,6 @@ KaizenGui::KaizenGui() noexcept : settings(QSettings::UserScope) {
|
|
|
|
|
QMessageBox::about(this, "About", text.c_str());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
restoreGeometry(settings.value("geometry").toByteArray());
|
|
|
|
|
restoreState(settings.value("windowState").toByteArray());
|
|
|
|
|
|
|
|
|
|
show();
|
|
|
|
|
|
|
|
|
|
emuThread = QThread::create([&] {
|
|
|
|
@@ -142,13 +164,28 @@ void KaizenGui::LoadROM(const std::string &path) noexcept {
|
|
|
|
|
pause->setEnabled(true);
|
|
|
|
|
reset->setEnabled(true);
|
|
|
|
|
stop->setEnabled(true);
|
|
|
|
|
vulkanWidget->show();
|
|
|
|
|
setWindowTitle(("Kaizen " KAIZEN_VERSION_STR " - " + n64::Core::GetMem().rom.gameNameDB).c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KaizenGui::LoadTAS(const std::string &path) noexcept { n64::Core::GetInstance().LoadTAS(fs::path(path)); }
|
|
|
|
|
|
|
|
|
|
void KaizenGui::closeEvent(QCloseEvent *event) {
|
|
|
|
|
Scheduler::GetInstance().EnqueueRelative(0, STOP);
|
|
|
|
|
settings.setValue("geometry", saveGeometry());
|
|
|
|
|
settings.setValue("windowState", saveState());
|
|
|
|
|
QMainWindow::closeEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KaizenGui::dropEvent(QDropEvent *event) {
|
|
|
|
|
if (event->mimeData()->hasUrls()) {
|
|
|
|
|
auto file = event->mimeData()->urls()[0].toLocalFile().toStdString();
|
|
|
|
|
LoadROM(file);
|
|
|
|
|
event->acceptProposedAction();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KaizenGui::dragEnterEvent(QDragEnterEvent *event) {
|
|
|
|
|
if (event->mimeData()->hasUrls())
|
|
|
|
|
event->acceptProposedAction();
|
|
|
|
|
}
|
|
|
|
|