#pragma once #include "EditorAttachment.hpp" #include "RcPtr.hpp" #include "Utils.hpp" #include #include #include #include #include // Forward declarations class EditorInstance; class IresManager; class IresObject : public RefCounted { friend class IresManager; public: enum Kind { KD_Texture, KD_SpriteFiles, KD_Spritesheet, KD_COUNT, }; private: std::string mName; std::unique_ptr mEditorAttachment; IresManager* mMan = nullptr; Kind mKind; public: IresObject(Kind kind); virtual ~IresObject() = default; static std::string_view ToString(Kind kind); static Kind FromString(std::string_view name); static std::unique_ptr Create(Kind kind); Kind GetKind() const { return mKind; } IresManager* GetAssociatedManager() const { return mMan; } bool IsAnnoymous() const; const std::string& GetName() const { return mName; } void SetName(std::string name); virtual void ShowEditor(EditorInstance& editor); EditorAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); } void SetEditorAttachment(EditorAttachment* attachment) { mEditorAttachment.reset(attachment); } static void WriteFull(IresObject* ires, rapidjson::Value& value, rapidjson::Document& root); static std::unique_ptr ReadFull(const rapidjson::Value& value); static bool ReadPartial(IresObject* ires, const rapidjson::Value& value); virtual void Write(rapidjson::Value& value, rapidjson::Document& root) const = 0; virtual void Read(const rapidjson::Value& value) = 0; }; class IresManager { public: static inline IresManager* instance = nullptr; private: robin_hood::unordered_map> mObjects; public: void DiscoverFilesDesignatedLocation(); void DiscoverFiles(const std::filesystem::path& dir); std::pair Add(IresObject* mat); void Delete(IresObject* ires); bool Rename(IresObject* ires, std::string newName); IresObject* Load(const std::filesystem::path& path); void Reload(IresObject* ires); void Save(IresObject* ires); void Save(IresObject* ires, const std::filesystem::path& filePath); const auto& GetObjects() const { return mObjects; } IresObject* FindIres(std::string_view path); };