From a643c1b46e6f71bad814fc15f5f68a2b47260454 Mon Sep 17 00:00:00 2001 From: Reesque Date: Mon, 13 Oct 2025 20:05:13 -0400 Subject: [PATCH] Make connect of new screen happens after the animation is finished --- src/core/controller.cpp | 12 ++++---- src/mainwindow.cpp | 61 +++++++++++++++++++++++++---------------- src/mainwindow.h | 3 ++ 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/core/controller.cpp b/src/core/controller.cpp index d3cc7f4..dfd4720 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -90,7 +90,7 @@ void Controller::connectGamepad(int id) void Controller::controllerButtonUpChanged(bool value) { - if (!value && !m_dpadDebounceTimer->isActive()) + if (value && !m_dpadDebounceTimer->isActive()) { m_dpadDebounceTimer->start(); emit triggerUpAction(); @@ -99,7 +99,7 @@ void Controller::controllerButtonUpChanged(bool value) void Controller::controllerButtonDownChanged(bool value) { - if (!value && !m_dpadDebounceTimer->isActive()) + if (value && !m_dpadDebounceTimer->isActive()) { m_dpadDebounceTimer->start(); emit triggerDownAction(); @@ -108,7 +108,7 @@ void Controller::controllerButtonDownChanged(bool value) void Controller::controllerButtonLeftChanged(bool value) { - if (!value && !m_dpadDebounceTimer->isActive()) + if (value && !m_dpadDebounceTimer->isActive()) { m_dpadDebounceTimer->start(); emit triggerLeftAction(); @@ -117,7 +117,7 @@ void Controller::controllerButtonLeftChanged(bool value) void Controller::controllerButtonRightChanged(bool value) { - if (!value && !m_dpadDebounceTimer->isActive()) + if (value && !m_dpadDebounceTimer->isActive()) { m_dpadDebounceTimer->start(); emit triggerRightAction(); @@ -126,7 +126,7 @@ void Controller::controllerButtonRightChanged(bool value) void Controller::controllerButtonAChanged(bool value) { - if (!value && !m_faceBtnDebounceTimer->isActive()) + if (value && !m_faceBtnDebounceTimer->isActive()) { m_faceBtnDebounceTimer->start(); emit triggerConfirmAction(); @@ -135,7 +135,7 @@ void Controller::controllerButtonAChanged(bool value) void Controller::controllerButtonBChanged(bool value) { - if (!value && !m_faceBtnDebounceTimer->isActive()) + if (value && !m_faceBtnDebounceTimer->isActive()) { m_faceBtnDebounceTimer->start(); emit triggerBackAction(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3290fea..15a9437 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -204,19 +204,6 @@ void MainWindow::switchScreenTo(ScreenType screenType, screenStack->layout()->addWidget(newScreen); newScreen->setFocus(); prevScreen = newScreen->getPrevScreen(); - connect(newScreen, &Screen::switchScreenTo, this, &MainWindow::switchScreenTo); - connect(newScreen, &Screen::switchToPreviousScreen, this, &MainWindow::switchToPreviousScreen); - connect(newScreen, &Screen::playTrack, m_mediaPlayer.get(), &MediaPlayer::playTrack); - connect(newScreen, &Screen::queueTrack, m_mediaPlayer.get(), &MediaPlayer::queueTrack); - - connect(m_controller.get(), &Controller::triggerLeftAction, newScreen, &Screen::leftAction); - connect(m_controller.get(), &Controller::triggerRightAction, newScreen, &Screen::rightAction); - connect(m_controller.get(), &Controller::triggerUpAction, newScreen, &Screen::upAction); - connect(m_controller.get(), &Controller::triggerDownAction, newScreen, &Screen::downAction); - connect(m_controller.get(), &Controller::triggerBackAction, newScreen, &Screen::backAction); - connect(m_controller.get(), &Controller::triggerConfirmAction, newScreen, &Screen::confirmAction); - - connect(this, &MainWindow::resizeEvent, newScreen, &Screen::resizeEvent); // Delete old screen if (screenStack->layout()->count() > 1) @@ -283,17 +270,7 @@ void MainWindow::switchScreenTo(ScreenType screenType, connect(group, &QParallelAnimationGroup::finished, [=]() { screenStack->setCurrentIndex(1); - disconnect(oldScreen, &Screen::switchScreenTo, this, &MainWindow::switchScreenTo); - disconnect(oldScreen, &Screen::switchToPreviousScreen, this, &MainWindow::switchToPreviousScreen); - - disconnect(m_controller.get(), &Controller::triggerLeftAction, oldScreen, &Screen::leftAction); - disconnect(m_controller.get(), &Controller::triggerRightAction, oldScreen, &Screen::rightAction); - disconnect(m_controller.get(), &Controller::triggerUpAction, oldScreen, &Screen::upAction); - disconnect(m_controller.get(), &Controller::triggerDownAction, oldScreen, &Screen::downAction); - disconnect(m_controller.get(), &Controller::triggerBackAction, oldScreen, &Screen::backAction); - disconnect(m_controller.get(), &Controller::triggerConfirmAction, oldScreen, &Screen::confirmAction); - - disconnect(this, &MainWindow::resizeEvent, oldScreen, &Screen::resizeEvent); + updateConnect(newScreen, oldScreen); QLayoutItem *item = screenStack->layout()->takeAt(0); if (item) { @@ -310,6 +287,10 @@ void MainWindow::switchScreenTo(ScreenType screenType, group->start(QAbstractAnimation::DeleteWhenStopped); } + else + { + updateConnect(newScreen); + } } void MainWindow::switchToPreviousScreen(QVector args) @@ -324,3 +305,35 @@ void MainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); } + +void MainWindow::updateConnect(Screen *newScreen, Screen *oldScreen) +{ + connect(newScreen, &Screen::switchScreenTo, this, &MainWindow::switchScreenTo); + connect(newScreen, &Screen::switchToPreviousScreen, this, &MainWindow::switchToPreviousScreen); + connect(newScreen, &Screen::playTrack, m_mediaPlayer.get(), &MediaPlayer::playTrack); + connect(newScreen, &Screen::queueTrack, m_mediaPlayer.get(), &MediaPlayer::queueTrack); + + connect(m_controller.get(), &Controller::triggerLeftAction, newScreen, &Screen::leftAction); + connect(m_controller.get(), &Controller::triggerRightAction, newScreen, &Screen::rightAction); + connect(m_controller.get(), &Controller::triggerUpAction, newScreen, &Screen::upAction); + connect(m_controller.get(), &Controller::triggerDownAction, newScreen, &Screen::downAction); + connect(m_controller.get(), &Controller::triggerBackAction, newScreen, &Screen::backAction); + connect(m_controller.get(), &Controller::triggerConfirmAction, newScreen, &Screen::confirmAction); + + connect(this, &MainWindow::resizeEvent, newScreen, &Screen::resizeEvent); + + if (oldScreen) + { + disconnect(oldScreen, &Screen::switchScreenTo, this, &MainWindow::switchScreenTo); + disconnect(oldScreen, &Screen::switchToPreviousScreen, this, &MainWindow::switchToPreviousScreen); + + disconnect(m_controller.get(), &Controller::triggerLeftAction, oldScreen, &Screen::leftAction); + disconnect(m_controller.get(), &Controller::triggerRightAction, oldScreen, &Screen::rightAction); + disconnect(m_controller.get(), &Controller::triggerUpAction, oldScreen, &Screen::upAction); + disconnect(m_controller.get(), &Controller::triggerDownAction, oldScreen, &Screen::downAction); + disconnect(m_controller.get(), &Controller::triggerBackAction, oldScreen, &Screen::backAction); + disconnect(m_controller.get(), &Controller::triggerConfirmAction, oldScreen, &Screen::confirmAction); + + disconnect(this, &MainWindow::resizeEvent, oldScreen, &Screen::resizeEvent); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index cc1ea30..c6deb44 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -33,6 +33,9 @@ private slots: ScreenAnimationType screenAnimationType = ScreenAnimationType::Forward); void switchToPreviousScreen(QVector args); +private: + void updateConnect(Screen *newScreen, Screen *oldScreen = nullptr); + private: Ui::MainWindow *ui; //QWidget *screenBox;