// SPDX-License-Identifier: MIT // // ES-DE Frontend // GuiThemeDownloader.h // // Theme downloader. // #ifndef ES_APP_GUIS_GUI_THEME_DOWNLOADER_H #define ES_APP_GUIS_GUI_THEME_DOWNLOADER_H #include "GuiComponent.h" #include "components/BusyComponent.h" #include "components/ButtonComponent.h" #include "components/ComponentGrid.h" #include "components/ComponentList.h" #include "components/ImageComponent.h" #include "components/NinePatchComponent.h" #include "components/ScrollIndicatorComponent.h" #include "components/TextComponent.h" #include "renderers/Renderer.h" #include "views/ViewController.h" #include #include #include #include #include #include #include #include #include #include #include class GuiThemeDownloader : public GuiComponent { public: GuiThemeDownloader(std::function updateCallback); ~GuiThemeDownloader(); void update(int deltaTime) override; void render(const glm::mat4& parentTrans) override; void onSizeChanged() override; bool input(InputConfig* config, Input input) override; std::vector getHelpPrompts() override; HelpStyle getHelpStyle() override { return ViewController::getInstance()->getViewHelpStyle(); } private: struct Screenshot { std::string image; std::string caption; }; struct ThemeEntry { std::string name; std::string reponame; std::string url; std::string manualExtension; std::string author; std::vector variants; std::vector colorSchemes; std::vector aspectRatios; std::vector fontSizes; std::vector transitions; std::vector screenshots; bool newEntry; bool deprecated; bool invalidRepository; bool corruptRepository; bool shallowRepository; bool manuallyDownloaded; bool hasLocalChanges; bool isCloned; ThemeEntry() : newEntry {false} , deprecated {false} , invalidRepository {false} , corruptRepository {false} , shallowRepository {false} , manuallyDownloaded {false} , hasLocalChanges {false} , isCloned {false} { } }; bool fetchThemesList(); bool fetchRepository(const std::string& repositoryName, bool allowReset = false); bool cloneRepository(const std::string& repositoryName, const std::string& url); bool checkLocalChanges(git_repository* repository); bool checkCorruptRepository(git_repository* repository); void resetRepository(git_repository* repository); void makeInventory(); bool renameDirectory(const std::string& path, const std::string& extension); void parseThemesList(); void populateGUI(); void updateGUI(); void updateInfoPane(); void setupFullscreenViewer(); Renderer* mRenderer; NinePatchComponent mBackground; ComponentGrid mGrid; std::shared_ptr mCenterGrid; std::shared_ptr mList; std::shared_ptr mButtons; BusyComponent mBusyAnim; std::function mUpdateCallback; struct ThemeGUIEntry { std::shared_ptr themeName; }; std::vector mThemeGUIEntries; enum class StatusType { STATUS_NO_CHANGE, STATUS_DOWNLOADING, STATUS_UPDATING }; enum class RepositoryError { NO_REPO_ERROR, NOT_A_REPOSITORY, INVALID_ORIGIN, HAS_DIVERGED, CLONE_ERROR, FETCH_ERROR }; RepositoryError mRepositoryError; std::string mThemeDirectory; std::string mMessage; std::thread mFetchThread; std::promise mPromise; std::future mFuture; std::atomic mFetching; std::atomic mLatestThemesList; bool mAttemptedFetch; bool mHasThemeUpdates; static inline std::atomic mReceivedObjectsProgress {0.0f}; static inline std::atomic mResolveDeltaProgress {0.0f}; std::vector mThemes; StatusType mStatusType; std::string mStatusText; bool mFullscreenViewing; size_t mFullscreenViewerIndex; std::shared_ptr mScrollUp; std::shared_ptr mScrollDown; std::shared_ptr mScrollIndicator; std::vector mGrayRectangleCoords; std::shared_ptr mScreenshot; std::vector> mViewerScreenshots; std::vector> mViewerCaptions; std::shared_ptr mViewerIndicatorLeft; std::shared_ptr mViewerIndicatorRight; std::shared_ptr mDownloadStatus; std::shared_ptr mLocalChanges; std::shared_ptr mTitle; std::shared_ptr mVariantsLabel; std::shared_ptr mColorSchemesLabel; std::shared_ptr mAspectRatiosLabel; std::shared_ptr mFontSizesLabel; std::shared_ptr mAuthor; std::shared_ptr mVariantCount; std::shared_ptr mColorSchemesCount; std::shared_ptr mAspectRatiosCount; std::shared_ptr mFontSizesCount; }; #endif // ES_APP_GUIS_GUI_THEME_DOWNLOADER_H