From 9bbf6b317378fac97d975191479de301d50c13f9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 15 Apr 2025 00:03:05 -0700 Subject: [PATCH] Qt: Clean up named view initialization and fix raising --- src/platform/qt/GIFView.cpp | 4 ++- src/platform/qt/GIFView.h | 2 +- src/platform/qt/VideoView.cpp | 4 ++- src/platform/qt/VideoView.h | 2 +- src/platform/qt/Window.cpp | 59 ++++++++++++++++++++--------------- src/platform/qt/Window.h | 14 ++++----- 6 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/platform/qt/GIFView.cpp b/src/platform/qt/GIFView.cpp index c0b2d3994..c3bf496da 100644 --- a/src/platform/qt/GIFView.cpp +++ b/src/platform/qt/GIFView.cpp @@ -15,7 +15,7 @@ using namespace QGBA; -GIFView::GIFView(QWidget* parent) +GIFView::GIFView(std::shared_ptr controller, QWidget* parent) : QWidget(parent) { m_ui.setupUi(this); @@ -31,6 +31,8 @@ GIFView::GIFView(QWidget* parent) FFmpegEncoderInit(&m_encoder); FFmpegEncoderSetAudio(&m_encoder, nullptr, 0); + + setController(controller); } GIFView::~GIFView() { diff --git a/src/platform/qt/GIFView.h b/src/platform/qt/GIFView.h index 37f71fd93..c6f1230a9 100644 --- a/src/platform/qt/GIFView.h +++ b/src/platform/qt/GIFView.h @@ -23,7 +23,7 @@ class GIFView : public QWidget { Q_OBJECT public: - GIFView(QWidget* parent = nullptr); + GIFView(std::shared_ptr controller, QWidget* parent = nullptr); virtual ~GIFView(); mAVStream* getStream() { return &m_encoder.d; } diff --git a/src/platform/qt/VideoView.cpp b/src/platform/qt/VideoView.cpp index 21e50f396..356133bbb 100644 --- a/src/platform/qt/VideoView.cpp +++ b/src/platform/qt/VideoView.cpp @@ -47,7 +47,7 @@ bool VideoView::Preset::compatible(const Preset& other) const { return true; } -VideoView::VideoView(QWidget* parent) +VideoView::VideoView(std::shared_ptr controller, QWidget* parent) : QWidget(parent) { m_ui.setupUi(this); @@ -133,6 +133,8 @@ VideoView::VideoView(QWidget* parent) m_ui.presetYoutube->setChecked(true); // Use the Youtube preset by default showAdvanced(false); + + setController(controller); } void VideoView::updatePresets() { diff --git a/src/platform/qt/VideoView.h b/src/platform/qt/VideoView.h index 9e3ab5ca2..4c61800d4 100644 --- a/src/platform/qt/VideoView.h +++ b/src/platform/qt/VideoView.h @@ -26,7 +26,7 @@ class VideoView : public QWidget { Q_OBJECT public: - VideoView(QWidget* parent = nullptr); + VideoView(std::shared_ptr controller, QWidget* parent = nullptr); virtual ~VideoView(); mAVStream* getStream() { return &m_encoder.d; } diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index ad18ab934..da1c80847 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -580,29 +580,35 @@ std::function Window::openControllerTView(A... arg) { } template -std::function Window::openNamedTView(std::unique_ptr* name, A... arg) { +std::function Window::openNamedTView(QPointer* name, bool keepalive, A... arg) { return [=]() { if (!*name) { - *name = std::make_unique(arg...); + *name = new T(arg...); connect(this, &Window::shutdown, name->get(), &QWidget::close); + if (!keepalive) { + (*name)->setAttribute(Qt::WA_DeleteOnClose); + } } (*name)->show(); - (*name)->setFocus(Qt::PopupFocusReason); + (*name)->activateWindow(); + (*name)->raise(); }; } template -std::function Window::openNamedControllerTView(std::unique_ptr* name, A... arg) { +std::function Window::openNamedControllerTView(QPointer* name, bool keepalive, A... arg) { return [=]() { if (!*name) { - *name = std::make_unique(arg...); - if (m_controller) { - (*name)->setController(m_controller); - } + *name = new T(m_controller, arg...); + connect(m_controller.get(), &CoreController::stopping, name->get(), &QWidget::close); connect(this, &Window::shutdown, name->get(), &QWidget::close); + if (!keepalive) { + (*name)->setAttribute(Qt::WA_DeleteOnClose); + } } (*name)->show(); - (*name)->setFocus(Qt::PopupFocusReason); + (*name)->activateWindow(); + (*name)->raise(); }; } @@ -1414,7 +1420,7 @@ void Window::setupMenu(QMenuBar* menubar) { m_multiWindow = m_actions.addAction(tr("New multiplayer window"), "multiWindow", GBAApp::app(), &GBAApp::newWindow, "file"); #ifdef M_CORE_GBA - auto dolphin = m_actions.addAction(tr("Connect to Dolphin..."), "connectDolphin", openNamedTView(&m_dolphinView, this), "file"); + auto dolphin = m_actions.addAction(tr("Connect to Dolphin..."), "connectDolphin", openNamedTView(&m_dolphinView, true, this), "file"); m_platformActions.insert(mPLATFORM_GBA, dolphin); #endif @@ -1695,8 +1701,8 @@ void Window::setupMenu(QMenuBar* menubar) { #endif #ifdef USE_FFMPEG - addGameAction(tr("Record A/V..."), "recordOutput", openNamedControllerTView(&m_videoView), "av"); - addGameAction(tr("Record GIF/WebP/APNG..."), "recordGIF", openNamedControllerTView(&m_gifView), "av"); + addGameAction(tr("Record A/V..."), "recordOutput", openNamedControllerTView(&m_videoView, true), "av"); + addGameAction(tr("Record GIF/WebP/APNG..."), "recordGIF", openNamedControllerTView(&m_gifView, true), "av"); #endif m_actions.addSeparator("av"); @@ -1710,17 +1716,29 @@ void Window::setupMenu(QMenuBar* menubar) { m_actions.addAction(tr("Game &overrides..."), "overrideWindow", [this]() { if (!m_overrideView) { - m_overrideView = std::make_unique(m_config); + m_overrideView = new OverrideView(m_config); if (m_controller) { m_overrideView->setController(m_controller); } connect(this, &Window::shutdown, m_overrideView.get(), &QWidget::close); } m_overrideView->show(); - m_overrideView->recheck(); + m_overrideView->activateWindow(); + m_overrideView->raise(); }, "tools"); - m_actions.addAction(tr("Game Pak sensors..."), "sensorWindow", openNamedControllerTView(&m_sensorView, &m_inputController), "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.get(), &QWidget::close); + } + m_sensorView->show(); + m_sensorView->activateWindow(); + m_sensorView->raise(); + }, "tools"); addGameAction(tr("&Cheats..."), "cheatsWindow", openControllerTView(), "tools"); #ifdef ENABLE_SCRIPTING @@ -1750,16 +1768,7 @@ void Window::setupMenu(QMenuBar* menubar) { addGameAction(tr("View &sprites..."), "spriteWindow", openControllerTView(), "stateViews"); addGameAction(tr("View &tiles..."), "tileWindow", openControllerTView(), "stateViews"); addGameAction(tr("View &map..."), "mapWindow", openControllerTView(), "stateViews"); - - addGameAction(tr("&Frame inspector..."), "frameWindow", [this]() { - if (!m_frameView) { - m_frameView = new FrameView(m_controller); - connect(this, &Window::shutdown, m_frameView, &QWidget::close); - m_frameView->setAttribute(Qt::WA_DeleteOnClose); - } - m_frameView->show(); - }, "stateViews"); - + addGameAction(tr("&Frame inspector..."), "frameWindow", openNamedControllerTView(&m_frameView, false), "stateViews"); addGameAction(tr("View memory..."), "memoryView", openControllerTView(), "stateViews"); addGameAction(tr("Search memory..."), "memorySearch", openControllerTView(), "stateViews"); addGameAction(tr("View &I/O registers..."), "ioViewer", openControllerTView(), "stateViews"); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 5c73032b5..0ae94397d 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -177,8 +177,8 @@ private: template std::function openTView(A... arg); template std::function openControllerTView(A... arg); - template std::function openNamedTView(std::unique_ptr*, A... arg); - template std::function openNamedControllerTView(std::unique_ptr*, A... arg); + template std::function openNamedTView(QPointer*, bool keepalive, A... arg); + template std::function openNamedControllerTView(QPointer*, bool keepalive, A... arg); std::shared_ptr addGameAction(const QString& visibleName, const QString& name, Action::Function action, const QString& menu = {}, const QKeySequence& = {}); template std::shared_ptr addGameAction(const QString& visibleName, const QString& name, T* obj, V (T::*action)(), const QString& menu = {}, const QKeySequence& = {}); @@ -241,14 +241,14 @@ private: bool m_multiActive = true; int m_playerId; - std::unique_ptr m_overrideView; - std::unique_ptr m_sensorView; - std::unique_ptr m_dolphinView; + QPointer m_overrideView; + QPointer m_sensorView; + QPointer m_dolphinView; QPointer m_frameView; #ifdef USE_FFMPEG - std::unique_ptr m_videoView; - std::unique_ptr m_gifView; + QPointer m_videoView; + QPointer m_gifView; #endif #ifdef ENABLE_GDB_STUB