mirror of https://github.com/mgba-emu/mgba.git
Qt: refactor popup window handling
This commit is contained in:
parent
0418ae33d5
commit
f5029bda70
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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>);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue