diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index bec404a00..e50b04985 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -24,7 +24,7 @@ using namespace QGBA; -OverrideView::OverrideView(ConfigController* config, QWidget* parent) +OverrideView::OverrideView(std::shared_ptr controller, ConfigController* config, QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) , m_config(config) { @@ -111,12 +111,16 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) m_recheck.setInterval(200); connect(&m_recheck, &QTimer::timeout, this, &OverrideView::recheck); + + setController(controller); } void OverrideView::setController(std::shared_ptr controller) { m_controller = controller; - connect(controller.get(), &CoreController::started, this, &OverrideView::gameStarted); - connect(controller.get(), &CoreController::stopping, this, &OverrideView::gameStopped); + if (controller) { + connect(controller.get(), &CoreController::started, this, &OverrideView::gameStarted); + connect(controller.get(), &CoreController::stopping, this, &OverrideView::gameStopped); + } recheck(); } diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index 880bc99bd..ec37c1017 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -31,7 +31,7 @@ class OverrideView : public QDialog { Q_OBJECT public: - OverrideView(ConfigController* config, QWidget* parent = nullptr); + OverrideView(std::shared_ptr controller, ConfigController* config, QWidget* parent = nullptr); void setController(std::shared_ptr controller); diff --git a/src/platform/qt/SensorView.cpp b/src/platform/qt/SensorView.cpp index ba1cf0ce9..53ba4c058 100644 --- a/src/platform/qt/SensorView.cpp +++ b/src/platform/qt/SensorView.cpp @@ -16,7 +16,7 @@ using namespace QGBA; -SensorView::SensorView(InputController* input, QWidget* parent) +SensorView::SensorView(std::shared_ptr controller, InputController* input, QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) , m_input(input) , m_rotation(input->rotationSource()) @@ -65,30 +65,34 @@ SensorView::SensorView(InputController* input, QWidget* parent) }); m_input->stealFocus(this); connect(m_input, &InputController::luminanceValueChanged, this, &SensorView::luminanceValueChanged); + + setController(controller); } void SensorView::setController(std::shared_ptr controller) { m_controller = controller; - connect(m_ui.timeNoOverride, &QAbstractButton::clicked, controller.get(), &CoreController::setRealTime); - connect(m_ui.timeFixed, &QRadioButton::clicked, [controller, this] () { - controller->setFixedTime(m_ui.time->dateTime().toUTC()); - }); - connect(m_ui.timeFakeEpoch, &QRadioButton::clicked, [controller, this] () { - controller->setFakeEpoch(m_ui.time->dateTime().toUTC()); - }); - connect(m_ui.timeOffset, &QRadioButton::clicked, [controller, this] () { - controller->setTimeOffset(m_ui.offsetSeconds->value()); - }); - connect(m_ui.offsetSeconds, qOverload(&QSpinBox::valueChanged), [controller, this] (int value) { - if (m_ui.timeOffset->isChecked()) { - controller->setTimeOffset(value); - } - }); - m_ui.timeButtons->checkedButton()->clicked(); + if (controller) { + connect(m_ui.timeNoOverride, &QAbstractButton::clicked, controller.get(), &CoreController::setRealTime); + connect(m_ui.timeFixed, &QRadioButton::clicked, [controller, this] () { + controller->setFixedTime(m_ui.time->dateTime().toUTC()); + }); + connect(m_ui.timeFakeEpoch, &QRadioButton::clicked, [controller, this] () { + controller->setFakeEpoch(m_ui.time->dateTime().toUTC()); + }); + connect(m_ui.timeOffset, &QRadioButton::clicked, [controller, this] () { + controller->setTimeOffset(m_ui.offsetSeconds->value()); + }); + connect(m_ui.offsetSeconds, qOverload(&QSpinBox::valueChanged), [controller, this] (int value) { + if (m_ui.timeOffset->isChecked()) { + controller->setTimeOffset(value); + } + }); + m_ui.timeButtons->checkedButton()->clicked(); - connect(controller.get(), &CoreController::stopping, [this]() { - m_controller.reset(); - }); + connect(controller.get(), &CoreController::stopping, [this]() { + m_controller.reset(); + }); + } } void SensorView::jiggerer(QAbstractButton* button, void (InputDriver::*setter)(int)) { diff --git a/src/platform/qt/SensorView.h b/src/platform/qt/SensorView.h index 2bb5047cd..101c53668 100644 --- a/src/platform/qt/SensorView.h +++ b/src/platform/qt/SensorView.h @@ -27,7 +27,7 @@ class SensorView : public QDialog { Q_OBJECT public: - SensorView(InputController* input, QWidget* parent = nullptr); + SensorView(std::shared_ptr controller, InputController* input, QWidget* parent = nullptr); void setController(std::shared_ptr); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 049079b87..155431cb1 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -580,6 +580,15 @@ std::function Window::openTView(A... arg) { }; } +template +std::function Window::openTViewModal(A... arg) { + return [=]() { + T* view = new T(arg...); + view->setAttribute(Qt::WA_DeleteOnClose); + view->open(); + }; +} + template std::function Window::openControllerTView(A... arg) { return [=]() { @@ -610,7 +619,9 @@ std::function Window::openNamedControllerTView(QPointer* name, bool k return [=]() { if (!*name) { *name = new T(m_controller, arg...); - connect(m_controller.get(), &CoreController::stopping, name->data(), &QWidget::close); + if (m_controller) { + connect(m_controller.get(), &CoreController::stopping, name->data(), &QWidget::close); + } connect(this, &Window::shutdown, name->data(), &QWidget::close); if (!keepalive) { (*name)->setAttribute(Qt::WA_DeleteOnClose); @@ -1316,7 +1327,7 @@ void Window::setupMenu(QMenuBar* menubar) { m_actions.addSeparator("saves"); - m_actions.addAction(tr("Convert save game..."), "convertSave", openTView(), "saves"); + m_actions.addAction(tr("Convert save game..."), "convertSave", openTViewModal(this), "saves"); #ifdef M_CORE_GBA auto importShark = addGameAction(tr("Import GameShark Save..."), "importShark", this, &Window::importSharkport, "saves"); @@ -1426,13 +1437,13 @@ void Window::setupMenu(QMenuBar* menubar) { m_actions.addSeparator("file"); - m_actions.addAction(tr("Report bug..."), "bugReport", openTView(), "file"); + m_actions.addAction(tr("Report bug..."), "bugReport", openTViewModal(this), "file"); #ifndef Q_OS_MAC m_actions.addSeparator("file"); #endif - m_actions.addAction(tr("About..."), "about", openTView(), "file")->setRole(Action::Role::ABOUT); + m_actions.addAction(tr("About..."), "about", openTViewModal(this), "file")->setRole(Action::Role::ABOUT); m_actions.addAction(tr("E&xit"), "quit", &QApplication::quit, "file", QKeySequence::Quit)->setRole(Action::Role::QUIT); m_actions.addMenu(tr("&Emulation"), "emu"); @@ -1712,40 +1723,16 @@ void Window::setupMenu(QMenuBar* menubar) { addGameAction(tr("Adjust layer placement..."), "placementControl", openControllerTView(), "av"); m_actions.addMenu(tr("&Tools"), "tools"); - m_actions.addAction(tr("View &logs..."), "viewLogs", static_cast(m_logView), &QWidget::show, "tools"); + m_actions.addAction(tr("View &logs..."), "viewLogs", openNamedTView(&m_logView, true, &m_log, this), "tools"); + m_actions.addAction(tr("Game &overrides..."), "overrideWindow", openNamedControllerTView(&m_overrideView, true, m_config, this), "tools"); + m_actions.addAction(tr("Game Pak sensors..."), "sensorWindow", openNamedControllerTView(&m_sensorView, true, &m_inputController, this), "tools"); - m_actions.addAction(tr("Game &overrides..."), "overrideWindow", [this]() { - if (!m_overrideView) { - m_overrideView = new OverrideView(m_config); - if (m_controller) { - m_overrideView->setController(m_controller); - } - connect(this, &Window::shutdown, m_overrideView.data(), &QWidget::close); - } - m_overrideView->show(); - m_overrideView->activateWindow(); - m_overrideView->raise(); - }, "tools"); - - m_actions.addAction(tr("Game Pak sensors..."), "sensorWindow", [this]() { - if (!m_sensorView) { - m_sensorView = new SensorView(&m_inputController); - if (m_controller) { - m_sensorView->setController(m_controller); - } - connect(this, &Window::shutdown, m_sensorView.data(), &QWidget::close); - } - m_sensorView->show(); - m_sensorView->activateWindow(); - m_sensorView->raise(); - }, "tools"); - - addGameAction(tr("&Cheats..."), "cheatsWindow", openControllerTView(), "tools"); + addGameAction(tr("&Cheats..."), "cheatsWindow", openNamedControllerTView(&m_cheatsView, false), "tools"); #ifdef ENABLE_SCRIPTING m_actions.addAction(tr("Scripting..."), "scripting", this, &Window::scriptingOpen, "tools"); #endif - m_actions.addAction(tr("Create forwarder..."), "createForwarder", openTView(), "tools"); + m_actions.addAction(tr("Create forwarder..."), "createForwarder", openTViewModal(this), "tools"); m_actions.addSeparator("tools"); m_actions.addAction(tr("Settings..."), "settings", this, &Window::openSettingsWindow, "tools")->setRole(Action::Role::SETTINGS); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index d4126100b..1af7ac0f0 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -30,6 +30,7 @@ namespace QGBA { class AudioProcessor; +class CheatsView; class ConfigController; class CoreController; class CoreManager; @@ -178,6 +179,7 @@ private: void ensureScripting(); template std::function openTView(A... arg); + template std::function openTViewModal(A... arg); template std::function openControllerTView(A... arg); template std::function openNamedTView(QPointer*, bool keepalive, A... arg); template std::function openNamedControllerTView(QPointer*, bool keepalive, A... arg); @@ -209,7 +211,7 @@ private: QMap> m_frameSizes; LogController m_log{0}; - LogView* m_logView; + QPointer m_logView; #ifdef ENABLE_DEBUGGERS DebuggerConsoleController* m_console = nullptr; #endif @@ -247,6 +249,7 @@ private: QPointer m_sensorView; QPointer m_dolphinView; QPointer m_frameView; + QPointer m_cheatsView; #ifdef USE_FFMPEG QPointer m_videoView;