diff --git a/projects/frontend/es-app/src/MainRunner.cpp b/projects/frontend/es-app/src/MainRunner.cpp index df40effb0d2e6af490c8105d19ff384e035761d7..5202d1d1e4dbc5375f0ee87102d07f9ab07fe8cf 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; @@ -172,7 +173,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); @@ -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/Upgrade.cpp b/projects/frontend/es-app/src/Upgrade.cpp index e3ed67e5435054553da8f739ae8d98f7dcaf43f9..f40d768aa5227e4aba85226b664205a6fa5029cf 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,9 +23,12 @@ String Upgrade::mLocalVersion; String Upgrade::mRemoteReleaseNote; String Upgrade::mLocalReleaseNote; -Upgrade::Upgrade(WindowManager& window) +Upgrade::UpdatePopup* Upgrade::UpdatePopup::mInstance = nullptr; + +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; @@ -120,13 +121,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 2b9e41ce6f392684ad6b6542f57228e5fa4748ef..0423f1eb3ba5e24da164ac00597364d69d25f0be 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; @@ -24,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 @@ -90,6 +95,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"; @@ -121,6 +158,8 @@ class Upgrade: private Thread static String mRemoteReleaseNote; //! Local version static String mLocalReleaseNote; + //! First run? + bool mFirstRun; /* * Thread implementation diff --git a/projects/frontend/es-app/src/guis/GuiScraperRun.cpp b/projects/frontend/es-app/src/guis/GuiScraperRun.cpp index 1ac42df781d9b5e376d1a14998b8d1c809d32c0b..ecdc1201f8021846921482c96caea9604a71d5f7 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 6160c578064464bc5edc05023e4f7ca29801d718..a7cc727040205f6e6f23b95679d886a8c77d1342 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; @@ -45,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; @@ -67,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; diff --git a/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp b/projects/frontend/es-app/src/views/gamelist/DetailedGameListView.cpp index d2609925d3d0077ba3b5dc3676fadca3fe3d43e9..efeb6eb0e6c5d8d619928dde70dcfc8b2224f5c1 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();