#pragma once #include #include #include "FileData.h" #include "Window.h" #include "MetaData.h" #include "PlatformId.h" #include "ThemeData.h" #include "FileFilterIndex.h" class SystemData { public: SystemData(const std::string& name, const std::string& fullName, const std::string& startPath, const std::vector& extensions, const std::string& command, const std::vector& platformIds, const std::string& themeFolder); ~SystemData(); inline FileData* getRootFolder() const { return mRootFolder; }; inline const std::string& getName() const { return mName; } inline const std::string& getFullName() const { return mFullName; } inline const std::string& getStartPath() const { return mStartPath; } inline const std::vector& getExtensions() const { return mSearchExtensions; } inline const std::string& getThemeFolder() const { return mThemeFolder; } inline const std::vector& getPlatformIds() const { return mPlatformIds; } inline bool hasPlatformId(PlatformIds::PlatformId id) { return std::find(mPlatformIds.begin(), mPlatformIds.end(), id) != mPlatformIds.end(); } inline const std::shared_ptr& getTheme() const { return mTheme; } std::string getGamelistPath(bool forWrite) const; bool hasGamelist() const; std::string getThemePath() const; unsigned int getGameCount() const; unsigned int getDisplayedGameCount() const; void launchGame(Window* window, FileData* game); static void deleteSystems(); static bool loadConfig(); //Load the system config file at getConfigPath(). Returns true if no errors were encountered. An example will be written if the file doesn't exist. static void writeExampleConfig(const std::string& path); static std::string getConfigPath(bool forWrite); // if forWrite, will only return ~/.emulationstation/es_systems.cfg, never /etc/emulationstation/es_systems.cfg static std::vector sSystemVector; inline std::vector::const_iterator getIterator() const { return std::find(sSystemVector.begin(), sSystemVector.end(), this); }; inline std::vector::const_reverse_iterator getRevIterator() const { return std::find(sSystemVector.rbegin(), sSystemVector.rend(), this); }; inline SystemData* getNext() const { auto it = getIterator(); it++; if(it == sSystemVector.end()) it = sSystemVector.begin(); return *it; } inline SystemData* getPrev() const { auto it = getRevIterator(); it++; if(it == sSystemVector.rend()) it = sSystemVector.rbegin(); return *it; } // Load or re-load theme. void loadTheme(); FileFilterIndex* getIndex() { return mFilterIndex; }; private: std::string mName; std::string mFullName; std::string mStartPath; std::vector mSearchExtensions; std::string mLaunchCommand; std::vector mPlatformIds; std::string mThemeFolder; std::shared_ptr mTheme; void populateFolder(FileData* folder); FileFilterIndex* mFilterIndex; FileData* mRootFolder; };