From d6e80ecd99273ef855a68d529f0690046bea1f85 Mon Sep 17 00:00:00 2001 From: Bkg2k Date: Tue, 9 Jul 2024 08:35:43 +0200 Subject: [PATCH 1/4] fiw(frontend): fix multiple update popups --- projects/frontend/es-app/src/Upgrade.cpp | 12 ++------ projects/frontend/es-app/src/Upgrade.h | 36 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/projects/frontend/es-app/src/Upgrade.cpp b/projects/frontend/es-app/src/Upgrade.cpp index e3ed67e543..70faca6c25 100755 --- a/projects/frontend/es-app/src/Upgrade.cpp +++ b/projects/frontend/es-app/src/Upgrade.cpp @@ -13,8 +13,6 @@ #include "RecalboxConf.h" #include "utils/locale/LocaleHelper.h" #include "recalbox/RecalboxSystem.h" -#include "guis/GuiMsgBox.h" -#include "guis/GuiMsgBoxScroll.h" #include "guis/GuiUpdateRecalbox.h" #include #include @@ -25,6 +23,8 @@ String Upgrade::mLocalVersion; String Upgrade::mRemoteReleaseNote; String Upgrade::mLocalReleaseNote; +Upgrade::UpdatePopup* Upgrade::UpdatePopup::mInstance = nullptr; + Upgrade::Upgrade(WindowManager& window) : mWindow(window) , mSender(*this) @@ -120,13 +120,7 @@ void Upgrade::ReceiveSyncMessage() // Messagebox if (!mMessageBoxMessage.empty()) - { - //mWindow.displayScrollMessage(_("AN UPDATE IS AVAILABLE FOR YOUR RECALBOX"), mMessageBoxMessage, false); - Gui* gui = new GuiMsgBoxScroll(mWindow, _("AN UPDATE IS AVAILABLE FOR YOUR RECALBOX"), mMessageBoxMessage, _("LATER"), nullptr, _("UPDATE NOW"), - [this] { mWindow.pushGui(new GuiUpdateRecalbox(mWindow, TarUrl(), ImageUrl(), HashUrl(), NewVersion())); }, - String::Empty, nullptr, TextAlignment::Left); - mWindow.pushGui(gui); - } + UpdatePopup::Show(&mWindow, mMessageBoxMessage); } String Upgrade::GetDomainName() diff --git a/projects/frontend/es-app/src/Upgrade.h b/projects/frontend/es-app/src/Upgrade.h index 2b9e41ce6f..742e5548dc 100644 --- a/projects/frontend/es-app/src/Upgrade.h +++ b/projects/frontend/es-app/src/Upgrade.h @@ -4,6 +4,10 @@ #include #include #include +#include +#include +#include +#include "utils/locale/LocaleHelper.h" // Forward declaration class WindowManager; @@ -90,6 +94,38 @@ class Upgrade: private Thread static bool NetworkReady() { return !GetDomainName().empty(); } private: + class UpdatePopup : public GuiMsgBoxScroll + { + public: + //! Build & show the popup if it does not already exists + static void Show(WindowManager* window, const String& message) + { + if (mInstance == nullptr) + { + mInstance = new UpdatePopup(window, message); + window->pushGui(mInstance); + } + } + + /// Destructor - remove unique instance + ~UpdatePopup() { mInstance = nullptr; } + + private: + //! Static unitary instance + static UpdatePopup* mInstance; + + //! Launch update window + static void LaunchUpdate(WindowManager* window) + { + window->pushGui(new GuiUpdateRecalbox(*window, TarUrl(), ImageUrl(), HashUrl(), NewVersion())); + } + + //! Default constructor + UpdatePopup(WindowManager* window, const String& message) + : GuiMsgBoxScroll(*window, _("AN UPDATE IS AVAILABLE FOR YOUR RECALBOX"), message, _("LATER"), nullptr, _("UPDATE NOW"), + std::bind(UpdatePopup::LaunchUpdate, window), String::Empty, nullptr, TextAlignment::Left) {} + }; + //! Release DNS static constexpr const char* sUpgradeDNS = ".download.recalbox.com"; -- GitLab From 38d499cb09a654423ef40591a0ed9a583cbbd3f5 Mon Sep 17 00:00:00 2001 From: Bkg2k Date: Tue, 9 Jul 2024 08:42:32 +0200 Subject: [PATCH 2/4] fix(frontend): do not check update immediately when relaunched --- projects/frontend/es-app/src/MainRunner.cpp | 2 +- projects/frontend/es-app/src/Upgrade.cpp | 5 +++-- projects/frontend/es-app/src/Upgrade.h | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/projects/frontend/es-app/src/MainRunner.cpp b/projects/frontend/es-app/src/MainRunner.cpp index df40effb0d..7727f1cde4 100644 --- a/projects/frontend/es-app/src/MainRunner.cpp +++ b/projects/frontend/es-app/src/MainRunner.cpp @@ -172,7 +172,7 @@ MainRunner::ExitState MainRunner::Run() // Start update thread { LOG(LogDebug) << "[MainRunner] Launching Network thread"; } - Upgrade networkThread(window); + Upgrade networkThread(window, mRunCount == 0); // Start the socket server { LOG(LogDebug) << "[MainRunner] Launching Command thread"; } CommandThread commandThread(systemManager); diff --git a/projects/frontend/es-app/src/Upgrade.cpp b/projects/frontend/es-app/src/Upgrade.cpp index 70faca6c25..f40d768aa5 100755 --- a/projects/frontend/es-app/src/Upgrade.cpp +++ b/projects/frontend/es-app/src/Upgrade.cpp @@ -25,9 +25,10 @@ String Upgrade::mLocalReleaseNote; Upgrade::UpdatePopup* Upgrade::UpdatePopup::mInstance = nullptr; -Upgrade::Upgrade(WindowManager& window) +Upgrade::Upgrade(WindowManager& window, bool firstRun) : mWindow(window) , mSender(*this) + , mFirstRun(firstRun) { Thread::Start("Upgrade"); } @@ -46,7 +47,7 @@ void Upgrade::Run() PatronInfo::Instance().WaitForAuthentication(*this); // First check at 15s - int waitForSeconds = 15; + int waitForSeconds = mFirstRun ? 15 : 3600; while (IsRunning()) { if (mSignal.WaitSignal(waitForSeconds * 1000LL)) return; diff --git a/projects/frontend/es-app/src/Upgrade.h b/projects/frontend/es-app/src/Upgrade.h index 742e5548dc..0423f1eb3b 100644 --- a/projects/frontend/es-app/src/Upgrade.h +++ b/projects/frontend/es-app/src/Upgrade.h @@ -28,8 +28,9 @@ class Upgrade: private Thread /*! * @brief Constructor * @param window main Window + * @param firstRun True if the front end just lauched, false otherwise */ - explicit Upgrade(WindowManager& window); + explicit Upgrade(WindowManager& window, bool firstRun); /*! * @brief Destructor @@ -157,6 +158,8 @@ class Upgrade: private Thread static String mRemoteReleaseNote; //! Local version static String mLocalReleaseNote; + //! First run? + bool mFirstRun; /* * Thread implementation -- GitLab From c9ddc7882a536657e9acfe831b232ea16b812fc5 Mon Sep 17 00:00:00 2001 From: Bkg2k Date: Tue, 9 Jul 2024 08:51:40 +0200 Subject: [PATCH 3/4] fix(frontend): do not autoscrape when the scraper runs in background --- projects/frontend/es-app/src/guis/GuiScraperRun.h | 1 + .../es-app/src/views/gamelist/DetailedGameListView.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/frontend/es-app/src/guis/GuiScraperRun.h b/projects/frontend/es-app/src/guis/GuiScraperRun.h index 6160c57806..bcb3abbc48 100644 --- a/projects/frontend/es-app/src/guis/GuiScraperRun.h +++ b/projects/frontend/es-app/src/guis/GuiScraperRun.h @@ -8,6 +8,7 @@ #include #include "components/ProgressBarComponent.h" #include +#include class ScraperSearchComponent; class TextComponent; diff --git a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp index d2609925d3..efeb6eb0e6 100755 --- a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp +++ b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp @@ -4,6 +4,7 @@ #include "animations/LambdaAnimation.h" #include "scraping/ScraperSeamless.h" #include "recalbox/RecalboxStorageWatcher.h" +#include "guis/GuiScraperRun.h" DetailedGameListView::DetailedGameListView(WindowManager&window, SystemManager& systemManager, SystemData& system, const IGlobalVariableResolver& resolver, FlagCaches& flagCache) : ISimpleGameListView(window, systemManager, system, resolver, flagCache) @@ -597,7 +598,7 @@ void DetailedGameListView::Update(int deltatime) if (mList.isScrolling()) mVideo.setVideo(Path::Empty); - if (!mSystem.IsScreenshots()) + if (!mSystem.IsScreenshots() && !GuiScraperRun::IsRunning()) { // Need busy animation? ScraperSeamless& scraper = ScraperSeamless::Instance(); -- GitLab From baa80d7b8238302d68354110f3127d5d41961390 Mon Sep 17 00:00:00 2001 From: Bkg2k Date: Tue, 9 Jul 2024 09:05:13 +0200 Subject: [PATCH 4/4] fix(frontend): close scraper & save gamelists on shutdown/reboot --- projects/frontend/es-app/src/MainRunner.cpp | 2 ++ .../es-app/src/guis/GuiScraperRun.cpp | 20 ++++++++++++++----- .../frontend/es-app/src/guis/GuiScraperRun.h | 11 +++++++--- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/projects/frontend/es-app/src/MainRunner.cpp b/projects/frontend/es-app/src/MainRunner.cpp index 7727f1cde4..5202d1d1e4 100644 --- a/projects/frontend/es-app/src/MainRunner.cpp +++ b/projects/frontend/es-app/src/MainRunner.cpp @@ -38,6 +38,7 @@ #include #include #include +#include MainRunner::ExitState MainRunner::sRequestedExitState = MainRunner::ExitState::Quit; bool MainRunner::sQuitRequested = false; @@ -212,6 +213,7 @@ MainRunner::ExitState MainRunner::Run() // Main SDL loop exitState = MainLoop(window, systemManager, fileNotifier, mSyncMessageFactory); + GuiScraperRun::Abort(); ResetExitState(); fileNotifier.ResetEventNotifier(); DeleteReadyFlagFile(); diff --git a/projects/frontend/es-app/src/guis/GuiScraperRun.cpp b/projects/frontend/es-app/src/guis/GuiScraperRun.cpp index 1ac42df781..ecdc1201f8 100644 --- a/projects/frontend/es-app/src/guis/GuiScraperRun.cpp +++ b/projects/frontend/es-app/src/guis/GuiScraperRun.cpp @@ -43,7 +43,16 @@ void GuiScraperRun::Hide(WindowManager& window) } } -void GuiScraperRun::Terminate() +void GuiScraperRun::Abort() +{ + if (sInstance != nullptr) + { + sInstance->TerminateScraping(); + TerminateGui(); + } +} + +void GuiScraperRun::TerminateGui() { if (sInstance != nullptr) sInstance->Close(); @@ -109,7 +118,8 @@ GuiScraperRun::GuiScraperRun(WindowManager& window, SystemManager& systemManager std::vector> buttons { - mButton = std::make_shared(mWindow, _("STOP"), _("stop (progress saved)"), std::bind(&GuiScraperRun::finish, this)), + mButton = std::make_shared(mWindow, _("STOP"), _("stop (progress saved)"), std::bind( + &GuiScraperRun::TerminateScraping, this)), mRunInBgButton = std::make_shared(mWindow, _("RUN IN BACKGROUND"), _("RUN IN BACKGROUND"), [this] { GuiScraperRun::Hide(mWindow); }) }; mButtonGrid = MenuComponent::MakeButtonGrid(mWindow, buttons); @@ -143,10 +153,10 @@ void GuiScraperRun::onSizeChanged() mGrid.setSize(mSize); } -void GuiScraperRun::finish() +void GuiScraperRun::TerminateScraping() { mScraper->Abort(true); - Terminate(); + TerminateGui(); for(const auto& systemData : mSearchQueue) systemData->UpdateGamelistXml(); mWindow.CloseAll(); @@ -320,7 +330,7 @@ void GuiScraperRun::ScrapingComplete(ScrapeResult reason, MetadataType changedMe if (mWindow.InfoPopupIsShown(&mPopup) || mLowResolution) { String text = mLowResolution ? _("Your scraping session completed!") : _("Your scraping session completed. Press OK to show the results."); - GuiMsgBox* msgBox = new GuiMsgBox(mWindow, text, _("OK"), [this] { if (mLowResolution) Terminate(); else Show(mWindow); mButtonGrid->resetCursor(); }); + GuiMsgBox* msgBox = new GuiMsgBox(mWindow, text, _("OK"), [this] { if (mLowResolution) TerminateGui(); else Show(mWindow); mButtonGrid->resetCursor(); }); mWindow.pushGui(msgBox); } } diff --git a/projects/frontend/es-app/src/guis/GuiScraperRun.h b/projects/frontend/es-app/src/guis/GuiScraperRun.h index bcb3abbc48..a7cc727040 100644 --- a/projects/frontend/es-app/src/guis/GuiScraperRun.h +++ b/projects/frontend/es-app/src/guis/GuiScraperRun.h @@ -46,10 +46,15 @@ class GuiScraperRun : public Gui static bool IsRunning() { return sInstance != nullptr; } /*! - * @brief Terminate the running instance + * @brief Abort scraping immediately + */ + static void Abort(); + + /*! + * @brief TerminateGui the running instance * @param window Window manager */ - static void Terminate(); + static void TerminateGui(); //! Destructor ~GuiScraperRun() override = default; @@ -68,7 +73,7 @@ class GuiScraperRun : public Gui */ GuiScraperRun(WindowManager& window, SystemManager& systemManager, const SystemManager::List& systems, ScrapingMethod method, IScraperEngineFreezer* freezer, bool lowResolution); - void finish(); + void TerminateScraping(); //! Instance static GuiScraperRun* sInstance; -- GitLab