From b84537d589eceeaf8180feeb5e086542e809405d Mon Sep 17 00:00:00 2001 From: iris Date: Tue, 9 Jun 2026 17:12:38 +0200 Subject: [PATCH] drag&drop and smaller changes --- src/frontend/KaizenGui.cpp | 47 ++++++++++++++++++++++++--- src/frontend/KaizenGui.hpp | 5 +++ src/frontend/Settings/CPUSettings.cpp | 1 + src/frontend/Settings/CPUSettings.hpp | 1 + 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/frontend/KaizenGui.cpp b/src/frontend/KaizenGui.cpp index ad5f2da..bd31f02 100644 --- a/src/frontend/KaizenGui.cpp +++ b/src/frontend/KaizenGui.cpp @@ -5,30 +5,44 @@ #include #include #include +#include #include #include #include -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(); +} diff --git a/src/frontend/KaizenGui.hpp b/src/frontend/KaizenGui.hpp index cf12bb9..6c6e987 100644 --- a/src/frontend/KaizenGui.hpp +++ b/src/frontend/KaizenGui.hpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include class EmuThread; @@ -15,6 +17,8 @@ class KaizenGui final : QMainWindow { ~KaizenGui(); void closeEvent(QCloseEvent *) override; + void dropEvent(QDropEvent *) override; + void dragEnterEvent(QDragEnterEvent *) override; bool fastForward = false; bool unlockFramerate = false; @@ -28,6 +32,7 @@ class KaizenGui final : QMainWindow { QTimer *statusBarTimer; QLabel *fpsLabel; QLabel *cpuTypeLabel; + QLabel *idleSkipLabel; QAction *pause = new QAction("Pause"); QAction *reset = new QAction("Reset"); QAction *stop = new QAction("Stop"); diff --git a/src/frontend/Settings/CPUSettings.cpp b/src/frontend/Settings/CPUSettings.cpp index 370d46d..5d71e1d 100644 --- a/src/frontend/Settings/CPUSettings.cpp +++ b/src/frontend/Settings/CPUSettings.cpp @@ -45,6 +45,7 @@ CPUSettings::CPUSettings() : settings(QSettings::UserScope) { Options::SetIdleSkip(idleSkip->checkState()); settings.setValue("cpu/idle_skip", idleSkip->checkState()); settings.sync(); + emit idleSkipChanged(); }); h->addWidget(idleSkip); diff --git a/src/frontend/Settings/CPUSettings.hpp b/src/frontend/Settings/CPUSettings.hpp index bdead05..a2ec024 100644 --- a/src/frontend/Settings/CPUSettings.hpp +++ b/src/frontend/Settings/CPUSettings.hpp @@ -18,4 +18,5 @@ class CPUSettings final : public QWidget { explicit CPUSettings(); signals: void cpuTypeChanged(); + void idleSkipChanged(); };