// SPDX-License-Identifier: MIT // // EmulationStation Desktop Edition // GuiScraperSearch.h // // User interface for the scraper where the user is able to see an overview // of the game being scraped and an option to override the game search string. // Used by both single-game scraping from the GuiMetaDataEd menu as well as // to resolve scraping conflicts when run from GuiScraperMenu. // The function to properly save scraped metadata is located here too. // // This GUI is called from GuiGameScraper for single-game scraping and // from GuiScraperMulti for multi-game scraping. // #ifndef ES_APP_GUIS_GUI_SCRAPER_SEARCH_H #define ES_APP_GUIS_GUI_SCRAPER_SEARCH_H #include "components/BusyComponent.h" #include "components/ComponentGrid.h" #include "scrapers/Scraper.h" #include "GuiComponent.h" class ComponentList; class DateTimeEditComponent; class ImageComponent; class RatingComponent; class ScrollableContainer; class TextComponent; class GuiScraperSearch : public GuiComponent { public: enum SearchType { ALWAYS_ACCEPT_FIRST_RESULT, ACCEPT_SINGLE_MATCHES, NEVER_AUTO_ACCEPT }; GuiScraperSearch(Window* window, SearchType searchType, unsigned int scrapeCount = 1); ~GuiScraperSearch(); void search(const ScraperSearchParams& params); void openInputScreen(ScraperSearchParams& from); void stop(); inline SearchType getSearchType() const { return mSearchType; } bool getSavedNewMedia() { return (mMDResolveHandle ? mMDResolveHandle->getSavedNewMedia() : false); }; static bool saveMetadata(const ScraperSearchResult& result, MetaDataList& metadata, FileData* scrapedGame); // Metadata assets will be resolved before calling the accept callback // (e.g. result.mdl's "image" is automatically downloaded and properly set). inline void setAcceptCallback(const std::function& acceptCallback) { mAcceptCallback = acceptCallback; } inline void setSkipCallback(const std::function& skipCallback) { mSkipCallback = skipCallback; }; inline void setCancelCallback(const std::function& cancelCallback) { mScrapeCount -= 1; mCancelCallback = cancelCallback; } bool input(InputConfig* config, Input input) override; void update(int deltaTime) override; void render(const Transform4x4f& parentTrans) override; std::vector getHelpPrompts() override; HelpStyle getHelpStyle() override; void onSizeChanged() override; void onFocusGained() override; void onFocusLost() override; void unsetRefinedSearch() { mRefinedSearch = false; } private: void updateViewStyle(); void updateThumbnail(); void updateInfoPane(); void resizeMetadata(); void onSearchError(const std::string& error, HttpReq::Status status = HttpReq::REQ_UNDEFINED_ERROR); void onSearchDone(const std::vector& results); int getSelectedIndex(); // For TheGamesDB, retrieve URLs for the additional metadata assets // that need to be downloaded. void retrieveMediaURLs(ScraperSearchResult result); // Resolve any metadata assets that need to be downloaded and return. void returnResult(ScraperSearchResult result); ComponentGrid mGrid; std::shared_ptr mResultName; std::shared_ptr mDescContainer; std::shared_ptr mResultDesc; std::shared_ptr mResultThumbnail; std::shared_ptr mResultList; std::shared_ptr mMD_Grid; std::shared_ptr mMD_Rating; std::shared_ptr mMD_ReleaseDate; std::shared_ptr mMD_Developer; std::shared_ptr mMD_Publisher; std::shared_ptr mMD_Genre; std::shared_ptr mMD_Players; std::shared_ptr mMD_Filler; // Label-component pair. struct MetaDataPair { std::shared_ptr first; std::shared_ptr second; bool resize; MetaDataPair(const std::shared_ptr& f, const std::shared_ptr& s, bool r = true) : first(f), second(s), resize(r) {}; }; std::vector mMD_Pairs; SearchType mSearchType; ScraperSearchParams mLastSearch; std::function mAcceptCallback; std::function mSkipCallback; std::function mCancelCallback; unsigned int mScrapeCount; bool mRefinedSearch; bool mBlockAccept; bool mFoundGame; bool mScrapeRatings; bool mRetrySearch; unsigned int mRetryCount; std::unique_ptr mSearchHandle; std::unique_ptr mMDRetrieveURLsHandle; std::unique_ptr mMDResolveHandle; std::vector mScraperResults; std::map> mThumbnailReqMap; BusyComponent mBusyAnim; }; #endif // ES_APP_GUIS_GUI_SCRAPER_SEARCH_H