From b0cf51aa6bff7fc3c16a131cbed0ed0a1ef04661 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Wed, 29 Mar 2023 22:21:55 +0200 Subject: [PATCH] Added status messages to GuiThemeDownloader --- es-app/src/guis/GuiThemeDownloader.cpp | 58 ++++++++++++++++++++------ es-app/src/guis/GuiThemeDownloader.h | 10 ++++- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/es-app/src/guis/GuiThemeDownloader.cpp b/es-app/src/guis/GuiThemeDownloader.cpp index b2ebb5dbc..aa9c67fbc 100644 --- a/es-app/src/guis/GuiThemeDownloader.cpp +++ b/es-app/src/guis/GuiThemeDownloader.cpp @@ -133,7 +133,7 @@ GuiThemeDownloader::GuiThemeDownloader() (mRenderer->getScreenHeight() - mSize.y) / 2.0f); mBusyAnim.setSize(mSize); - mBusyAnim.setText("100%"); + mBusyAnim.setText("DOWNLOADING THEMES LIST 100%"); mBusyAnim.onSizeChanged(); mList->setCursorChangedCallback([this](CursorState state) { @@ -167,7 +167,7 @@ bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, int errorCode {0}; const std::string path {mThemeDirectory + repositoryName}; mRepositoryError = RepositoryError::NO_REPO_ERROR; - mErrorMessage = ""; + mMessage = ""; const bool isThemesList {repositoryName == "themes-list"}; git_repository* repository {nullptr}; @@ -265,6 +265,8 @@ bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, if (mergeAnalysis & GIT_MERGE_ANALYSIS_UP_TO_DATE) { LOG(LogInfo) << "Repository \"" << repositoryName << "\" already up to date"; + if (repositoryName != "themes-list") + mMessage = "THEME ALREADY UP TO DATE"; git_annotated_commit_free(annotated); git_object_free(object); mPromise.set_value(true); @@ -318,7 +320,7 @@ bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, catch (std::runtime_error& runtimeError) { const git_error* gitError {git_error_last()}; LOG(LogError) << "GuiThemeDownloader: " << runtimeError.what() << gitError->message; - mErrorMessage = gitError->message; + mMessage = gitError->message; git_error_clear(); if (gitRemote != nullptr) git_remote_disconnect(gitRemote); @@ -326,6 +328,9 @@ bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, return true; } + if (repositoryName != "themes-list") + mMessage = "THEME HAS BEEN UPDATED"; + mPromise.set_value(true); return false; } @@ -525,7 +530,6 @@ void GuiThemeDownloader::parseThemesList() } } - mWindow->queueInfoPopup("PARSED " + std::to_string(mThemeSets.size()) + " THEME SETS", 6000); LOG(LogInfo) << "GuiThemeDownloader: Parsed " << mThemeSets.size() << " theme sets"; } @@ -569,6 +573,8 @@ void GuiThemeDownloader::populateGUI() mFuture = mPromise.get_future(); mFetchThread = std::thread(&GuiThemeDownloader::cloneRepository, this, theme.reponame, theme.url); + mStatusType = StatusType::STATUS_DOWNLOADING; + mStatusText = "DOWNLOADING THEME"; }, "ABORT", [] { return; }, "", nullptr, true, true, (mRenderer->getIsVerticalOrientation() ? @@ -587,6 +593,8 @@ void GuiThemeDownloader::populateGUI() mFuture = mPromise.get_future(); mFetchThread = std::thread(&GuiThemeDownloader::fetchRepository, this, theme.reponame, theme.url, true); + mStatusType = StatusType::STATUS_UPDATING; + mStatusText = "UPDATING THEME"; }, "ABORT", [] { return; }, "", nullptr, true, true, (mRenderer->getIsVerticalOrientation() ? @@ -597,11 +605,15 @@ void GuiThemeDownloader::populateGUI() mFuture = mPromise.get_future(); mFetchThread = std::thread(&GuiThemeDownloader::fetchRepository, this, theme.reponame, theme.url, false); + mStatusType = StatusType::STATUS_UPDATING; + mStatusText = "UPDATING THEME"; } else { mFuture = mPromise.get_future(); mFetchThread = std::thread(&GuiThemeDownloader::cloneRepository, this, theme.reponame, theme.url); + mStatusType = StatusType::STATUS_DOWNLOADING; + mStatusText = "DOWNLOADING THEME"; } }); mList->addRow(row); @@ -681,9 +693,10 @@ void GuiThemeDownloader::update(int deltaTime) mFetching = false; if (mRepositoryError != RepositoryError::NO_REPO_ERROR) { std::string errorMessage {"ERROR: "}; - errorMessage.append(Utils::String::toUpper(mErrorMessage)); + errorMessage.append(Utils::String::toUpper(mMessage)); mWindow->queueInfoPopup(errorMessage, 6000); - LOG(LogError) << "Error: " << mErrorMessage; + LOG(LogError) << "Error: " << mMessage; + mMessage = ""; } if (mThemeSets.empty() && mLatestThemesList) { parseThemesList(); @@ -700,21 +713,38 @@ void GuiThemeDownloader::update(int deltaTime) if (mFetching) { int progress {mReceivedObjectsProgress != 1.0f ? 0 : 100}; + if (mStatusType != StatusType::STATUS_NO_CHANGE) { + if (mStatusType == StatusType::STATUS_DOWNLOADING) + mBusyAnim.setText(mStatusText + " 100%"); + else if (mStatusType == StatusType::STATUS_UPDATING) + mBusyAnim.setText(mStatusText); + mBusyAnim.onSizeChanged(); + mStatusType = StatusType::STATUS_NO_CHANGE; + } if (mReceivedObjectsProgress != 1.0f) { progress = static_cast( std::round(glm::mix(0.0f, 100.0f, static_cast(mReceivedObjectsProgress)))); - const std::string progressText {std::to_string(progress) + "%"}; - mBusyAnim.setText(progressText); + if (mStatusText.substr(0, 11) == "DOWNLOADING") + mBusyAnim.setText(mStatusText + " " + std::to_string(progress) + "%"); + else + mBusyAnim.setText(mStatusText); } else if (mReceivedObjectsProgress != 0.0f) { progress = static_cast( std::round(glm::mix(0.0f, 100.0f, static_cast(mResolveDeltaProgress)))); - const std::string progressText {std::to_string(progress) + "%"}; - mBusyAnim.setText(progressText); + if (mStatusText.substr(0, 11) == "DOWNLOADING") + mBusyAnim.setText(mStatusText + " " + std::to_string(progress) + "%"); + else + mBusyAnim.setText(mStatusText); } mBusyAnim.update(deltaTime); } + if (mMessage != "") { + mWindow->queueInfoPopup(mMessage, 6000); + mMessage = ""; + } + GuiComponent::update(deltaTime); } @@ -783,7 +813,7 @@ bool GuiThemeDownloader::input(InputConfig* config, Input input) return true; } - return mGrid.input(config, input); + return GuiComponent::input(config, input); } std::vector GuiThemeDownloader::getHelpPrompts() @@ -823,10 +853,14 @@ bool GuiThemeDownloader::fetchThemesList() mFetchThread = std::thread(&GuiThemeDownloader::fetchRepository, this, repositoryName, url, false); + mStatusType = StatusType::STATUS_UPDATING; + mStatusText = "UPDATING THEMES LIST"; } else { LOG(LogInfo) << "GuiThemeDownloader: Creating initial themes list repository clone"; mFetchThread = std::thread(&GuiThemeDownloader::cloneRepository, this, repositoryName, url); + mStatusType = StatusType::STATUS_DOWNLOADING; + mStatusText = "DOWNLOADING THEMES LIST"; return false; } @@ -892,7 +926,7 @@ bool GuiThemeDownloader::cloneRepository(const std::string& repositoryName, cons const git_error* gitError {git_error_last()}; LOG(LogWarning) << "GuiThemeDownloader: Git returned error code " << errorCode << ", error message: \"" << gitError->message << "\""; - mErrorMessage = gitError->message; + mMessage = gitError->message; git_error_clear(); mPromise.set_value(true); return true; diff --git a/es-app/src/guis/GuiThemeDownloader.h b/es-app/src/guis/GuiThemeDownloader.h index 85c801d64..a749b3a1f 100644 --- a/es-app/src/guis/GuiThemeDownloader.h +++ b/es-app/src/guis/GuiThemeDownloader.h @@ -110,6 +110,12 @@ private: std::vector mThemeGUIEntries; + enum class StatusType { + STATUS_NO_CHANGE, + STATUS_DOWNLOADING, + STATUS_UPDATING + }; + enum class RepositoryError { NO_REPO_ERROR, MANUALLY_DOWNLOADED, @@ -121,7 +127,7 @@ private: RepositoryError mRepositoryError; std::string mThemeDirectory; - std::string mErrorMessage; + std::string mMessage; std::thread mFetchThread; std::promise mPromise; std::future mFuture; @@ -130,6 +136,8 @@ private: static inline std::atomic mReceivedObjectsProgress {0.0f}; static inline std::atomic mResolveDeltaProgress {0.0f}; std::vector mThemeSets; + StatusType mStatusType; + std::string mStatusText; std::shared_ptr mScrollUp; std::shared_ptr mScrollDown;