Qt: Clean up named view initialization and fix raising

This commit is contained in:
Vicki Pfau 2025-04-15 00:03:05 -07:00
parent 939c8f0487
commit 9bbf6b3173
6 changed files with 49 additions and 36 deletions

View File

@ -15,7 +15,7 @@
using namespace QGBA;
GIFView::GIFView(QWidget* parent)
GIFView::GIFView(std::shared_ptr<CoreController> 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() {

View File

@ -23,7 +23,7 @@ class GIFView : public QWidget {
Q_OBJECT
public:
GIFView(QWidget* parent = nullptr);
GIFView(std::shared_ptr<CoreController> controller, QWidget* parent = nullptr);
virtual ~GIFView();
mAVStream* getStream() { return &m_encoder.d; }

View File

@ -47,7 +47,7 @@ bool VideoView::Preset::compatible(const Preset& other) const {
return true;
}
VideoView::VideoView(QWidget* parent)
VideoView::VideoView(std::shared_ptr<CoreController> 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() {

View File

@ -26,7 +26,7 @@ class VideoView : public QWidget {
Q_OBJECT
public:
VideoView(QWidget* parent = nullptr);
VideoView(std::shared_ptr<CoreController> controller, QWidget* parent = nullptr);
virtual ~VideoView();
mAVStream* getStream() { return &m_encoder.d; }

View File

@ -580,29 +580,35 @@ std::function<void()> Window::openControllerTView(A... arg) {
}
template <typename T, typename... A>
std::function<void()> Window::openNamedTView(std::unique_ptr<T>* name, A... arg) {
std::function<void()> Window::openNamedTView(QPointer<T>* name, bool keepalive, A... arg) {
return [=]() {
if (!*name) {
*name = std::make_unique<T>(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 <typename T, typename... A>
std::function<void()> Window::openNamedControllerTView(std::unique_ptr<T>* name, A... arg) {
std::function<void()> Window::openNamedControllerTView(QPointer<T>* name, bool keepalive, A... arg) {
return [=]() {
if (!*name) {
*name = std::make_unique<T>(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<DolphinConnector>(&m_dolphinView, this), "file");
auto dolphin = m_actions.addAction(tr("Connect to Dolphin..."), "connectDolphin", openNamedTView<DolphinConnector>(&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<VideoView>(&m_videoView), "av");
addGameAction(tr("Record GIF/WebP/APNG..."), "recordGIF", openNamedControllerTView<GIFView>(&m_gifView), "av");
addGameAction(tr("Record A/V..."), "recordOutput", openNamedControllerTView<VideoView>(&m_videoView, true), "av");
addGameAction(tr("Record GIF/WebP/APNG..."), "recordGIF", openNamedControllerTView<GIFView>(&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<OverrideView>(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<SensorView>(&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<CheatsView>(), "tools");
#ifdef ENABLE_SCRIPTING
@ -1750,16 +1768,7 @@ void Window::setupMenu(QMenuBar* menubar) {
addGameAction(tr("View &sprites..."), "spriteWindow", openControllerTView<ObjView>(), "stateViews");
addGameAction(tr("View &tiles..."), "tileWindow", openControllerTView<TileView>(), "stateViews");
addGameAction(tr("View &map..."), "mapWindow", openControllerTView<MapView>(), "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<FrameView>(&m_frameView, false), "stateViews");
addGameAction(tr("View memory..."), "memoryView", openControllerTView<MemoryView>(), "stateViews");
addGameAction(tr("Search memory..."), "memorySearch", openControllerTView<MemorySearch>(), "stateViews");
addGameAction(tr("View &I/O registers..."), "ioViewer", openControllerTView<IOViewer>(), "stateViews");

View File

@ -177,8 +177,8 @@ private:
template <typename T, typename... A> std::function<void()> openTView(A... arg);
template <typename T, typename... A> std::function<void()> openControllerTView(A... arg);
template <typename T, typename... A> std::function<void()> openNamedTView(std::unique_ptr<T>*, A... arg);
template <typename T, typename... A> std::function<void()> openNamedControllerTView(std::unique_ptr<T>*, 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);
std::shared_ptr<Action> addGameAction(const QString& visibleName, const QString& name, Action::Function action, const QString& menu = {}, const QKeySequence& = {});
template<typename T, typename V> std::shared_ptr<Action> 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<OverrideView> m_overrideView;
std::unique_ptr<SensorView> m_sensorView;
std::unique_ptr<DolphinConnector> m_dolphinView;
QPointer<OverrideView> m_overrideView;
QPointer<SensorView> m_sensorView;
QPointer<DolphinConnector> m_dolphinView;
QPointer<FrameView> m_frameView;
#ifdef USE_FFMPEG
std::unique_ptr<VideoView> m_videoView;
std::unique_ptr<GIFView> m_gifView;
QPointer<VideoView> m_videoView;
QPointer<GIFView> m_gifView;
#endif
#ifdef ENABLE_GDB_STUB