Qt: refactor popup window handling

This commit is contained in:
Adam Higerd 2025-05-20 21:10:55 -05:00
parent 0418ae33d5
commit f5029bda70
6 changed files with 57 additions and 59 deletions

View File

@ -24,7 +24,7 @@
using namespace QGBA;
OverrideView::OverrideView(ConfigController* config, QWidget* parent)
OverrideView::OverrideView(std::shared_ptr<CoreController> 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<CoreController> 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();
}

View File

@ -31,7 +31,7 @@ class OverrideView : public QDialog {
Q_OBJECT
public:
OverrideView(ConfigController* config, QWidget* parent = nullptr);
OverrideView(std::shared_ptr<CoreController> controller, ConfigController* config, QWidget* parent = nullptr);
void setController(std::shared_ptr<CoreController> controller);

View File

@ -16,7 +16,7 @@
using namespace QGBA;
SensorView::SensorView(InputController* input, QWidget* parent)
SensorView::SensorView(std::shared_ptr<CoreController> 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<CoreController> 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<int>(&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<int>(&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)) {

View File

@ -27,7 +27,7 @@ class SensorView : public QDialog {
Q_OBJECT
public:
SensorView(InputController* input, QWidget* parent = nullptr);
SensorView(std::shared_ptr<CoreController> controller, InputController* input, QWidget* parent = nullptr);
void setController(std::shared_ptr<CoreController>);

View File

@ -580,6 +580,15 @@ std::function<void()> Window::openTView(A... arg) {
};
}
template <typename T, typename... A>
std::function<void()> Window::openTViewModal(A... arg) {
return [=]() {
T* view = new T(arg...);
view->setAttribute(Qt::WA_DeleteOnClose);
view->open();
};
}
template <typename T, typename... A>
std::function<void()> Window::openControllerTView(A... arg) {
return [=]() {
@ -610,7 +619,9 @@ std::function<void()> Window::openNamedControllerTView(QPointer<T>* 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<SaveConverter>(), "saves");
m_actions.addAction(tr("Convert save game..."), "convertSave", openTViewModal<SaveConverter>(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<ReportView>(), "file");
m_actions.addAction(tr("Report bug..."), "bugReport", openTViewModal<ReportView>(this), "file");
#ifndef Q_OS_MAC
m_actions.addSeparator("file");
#endif
m_actions.addAction(tr("About..."), "about", openTView<AboutScreen>(), "file")->setRole(Action::Role::ABOUT);
m_actions.addAction(tr("About..."), "about", openTViewModal<AboutScreen>(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<PlacementControl>(), "av");
m_actions.addMenu(tr("&Tools"), "tools");
m_actions.addAction(tr("View &logs..."), "viewLogs", static_cast<QWidget*>(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<CheatsView>(), "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<ForwarderView>(), "tools");
m_actions.addAction(tr("Create forwarder..."), "createForwarder", openTViewModal<ForwarderView>(this), "tools");
m_actions.addSeparator("tools");
m_actions.addAction(tr("Settings..."), "settings", this, &Window::openSettingsWindow, "tools")->setRole(Action::Role::SETTINGS);

View File

@ -30,6 +30,7 @@
namespace QGBA {
class AudioProcessor;
class CheatsView;
class ConfigController;
class CoreController;
class CoreManager;
@ -178,6 +179,7 @@ private:
void ensureScripting();
template <typename T, typename... A> std::function<void()> openTView(A... arg);
template <typename T, typename... A> std::function<void()> openTViewModal(A... arg);
template <typename T, typename... A> std::function<void()> openControllerTView(A... arg);
template <typename T, typename... A> std::function<void()> openNamedTView(QPointer<T>*, bool keepalive, A... arg);
template <typename T, typename... A> std::function<void()> openNamedControllerTView(QPointer<T>*, bool keepalive, A... arg);
@ -209,7 +211,7 @@ private:
QMap<int, std::shared_ptr<Action>> m_frameSizes;
LogController m_log{0};
LogView* m_logView;
QPointer<LogView> m_logView;
#ifdef ENABLE_DEBUGGERS
DebuggerConsoleController* m_console = nullptr;
#endif
@ -247,6 +249,7 @@ private:
QPointer<SensorView> m_sensorView;
QPointer<DolphinConnector> m_dolphinView;
QPointer<FrameView> m_frameView;
QPointer<CheatsView> m_cheatsView;
#ifdef USE_FFMPEG
QPointer<VideoView> m_videoView;