diff --git a/include/panda_qt/config_window.hpp b/include/panda_qt/config_window.hpp index e91936c4..1c16711a 100644 --- a/include/panda_qt/config_window.hpp +++ b/include/panda_qt/config_window.hpp @@ -1,16 +1,23 @@ #pragma once #include +#include #include #include #include #include #include +#include +#include + +#include "config.hpp" class ConfigWindow : public QDialog { Q_OBJECT private: + using ConfigCallback = std::function; + enum class Theme : int { System = 0, Light = 1, @@ -21,9 +28,15 @@ class ConfigWindow : public QDialog { Theme currentTheme; QComboBox* themeSelect = nullptr; + // The config class holds a copy of the emulator config which it edits and sends + // over to the emulator + EmulatorConfig config; + ConfigCallback updateConfig; void setTheme(Theme theme); public: - ConfigWindow(QWidget* parent = nullptr); + ConfigWindow(ConfigCallback callback, const EmulatorConfig& config, QWidget* parent = nullptr); ~ConfigWindow(); + + EmulatorConfig& getConfig() { return config; } }; \ No newline at end of file diff --git a/include/panda_qt/main_window.hpp b/include/panda_qt/main_window.hpp index c2db9ac1..3b77e606 100644 --- a/include/panda_qt/main_window.hpp +++ b/include/panda_qt/main_window.hpp @@ -44,6 +44,7 @@ class MainWindow : public QMainWindow { EditCheat, PressTouchscreen, ReleaseTouchscreen, + UpdateConfig }; // Tagged union representing our message queue messages diff --git a/src/panda_qt/config_window.cpp b/src/panda_qt/config_window.cpp index 44debc32..c9efcbb0 100644 --- a/src/panda_qt/config_window.cpp +++ b/src/panda_qt/config_window.cpp @@ -1,7 +1,8 @@ #include "panda_qt/config_window.hpp" -ConfigWindow::ConfigWindow(QWidget* parent) : QDialog(parent) { +ConfigWindow::ConfigWindow(ConfigCallback callback, const EmulatorConfig& emuConfig, QWidget* parent) : QDialog(parent), config(emuConfig) { setWindowTitle(tr("Configuration")); + updateConfig = std::move(callback); // Set up theme selection setTheme(Theme::Dark); @@ -15,6 +16,14 @@ ConfigWindow::ConfigWindow(QWidget* parent) : QDialog(parent) { themeSelect->setGeometry(40, 40, 100, 50); themeSelect->show(); connect(themeSelect, &QComboBox::currentIndexChanged, this, [&](int index) { setTheme(static_cast(index)); }); + + QCheckBox* useShaderJIT = new QCheckBox(tr("Enable Shader recompiler"), this); + useShaderJIT->setChecked(config.shaderJitEnabled); + + connect(useShaderJIT, &QCheckBox::toggled, this, [this, useShaderJIT]() { + config.shaderJitEnabled = useShaderJIT->isChecked(); + updateConfig(); + }); } void ConfigWindow::setTheme(Theme theme) { diff --git a/src/panda_qt/main_window.cpp b/src/panda_qt/main_window.cpp index de70cc18..2ed266e0 100644 --- a/src/panda_qt/main_window.cpp +++ b/src/panda_qt/main_window.cpp @@ -64,7 +64,14 @@ MainWindow::MainWindow(QApplication* app, QWidget* parent) : QMainWindow(parent) // Set up misc objects aboutWindow = new AboutWindow(nullptr); - configWindow = new ConfigWindow(this); + configWindow = new ConfigWindow( + [&]() { + EmulatorMessage message{.type = MessageType::UpdateConfig}; + sendMessage(message); + }, + emu->getConfig(), this + ); + cheatsEditor = new CheatsWindow(emu, {}, this); luaEditor = new TextEditorWindow(this, "script.lua", ""); @@ -282,6 +289,7 @@ void MainWindow::dispatchMessage(const EmulatorMessage& message) { emu->getServiceManager().getHID().setTouchScreenPress(message.touchscreen.x, message.touchscreen.y); break; case MessageType::ReleaseTouchscreen: emu->getServiceManager().getHID().releaseTouchScreen(); break; + case MessageType::UpdateConfig: emu->getConfig() = configWindow->getConfig(); break; } }