diff options
author | rtk0c <[email protected]> | 2021-06-05 19:44:54 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-06-05 19:44:54 -0700 |
commit | a180e1b56025c6b7d81d2e587ad90531d29de44c (patch) | |
tree | 1c88361320371b508c81b52a28ae0579fcdd1fd7 /core/src/Model/Assets.hpp | |
parent | d3fa128d5408673b0ea8d3ba3435c38b258a5e7a (diff) |
Initial work on asset system (does not compile)
Diffstat (limited to 'core/src/Model/Assets.hpp')
-rw-r--r-- | core/src/Model/Assets.hpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/core/src/Model/Assets.hpp b/core/src/Model/Assets.hpp new file mode 100644 index 0000000..bc5219d --- /dev/null +++ b/core/src/Model/Assets.hpp @@ -0,0 +1,104 @@ +#pragma once + +#include <tsl/array_map.h> +#include <filesystem> +#include <iosfwd> +#include <memory> +#include <string_view> + +/// A structure representing a ready-to-be-loaded asset, locating on the disk. +struct SavedAsset +{ + std::filesystem::path Path; + std::string Name; + /// `Path`'s string form, encoded in UTF-8. + std::string PathString = Path.string(); +}; + +class Asset +{ +public: + Asset(); + virtual ~Asset() = default; +}; + +class AssetCategory +{ +public: + virtual ~AssetCategory() = default; + + virtual void DiscoverFiles(const std::function<void(SavedAsset)>& callback) const = 0; + + virtual Asset* CreateEmpty(const SavedAsset& diskForm) const = 0; + std::unique_ptr<Asset> CreateEmptyUnique(const SavedAsset& diskForm) const; + virtual Asset* Load(const SavedAsset& diskForm) const = 0; + std::unique_ptr<Asset> LoadUnique(const SavedAsset& diskForm) const; + + /// This should call ImGui::BeginTable() along with other accessories such as setting up the header row. + virtual void SetupDetailsTable(const char* tableId) const = 0; + virtual void DrawBigIcon(const SavedAsset& asset) const = 0; + virtual void DrawDetailsTableRow(const SavedAsset& asset) const = 0; + +protected: + /* Helper loader functions */ + + static void DiscoverFilesByExtension(const std::function<void(SavedAsset)>& callback, const std::filesystem::path& containerDir, std::string_view extension); + static void DiscoverFilesByHeader(const std::function<void(SavedAsset)>& callback, const std::filesystem::path& containerDir, const std::function<bool(std::istream&)>& validater); +}; + +class AssetList +{ +private: + const AssetCategory* mLoader; + tsl::array_map<char, SavedAsset> mAssets; + tsl::array_map<char, std::unique_ptr<Asset>> mCache; + int mCacheSizeLimit = 0; + +public: + AssetList(const AssetCategory& loader); + + // TODO support file watches + void Reload(); + + const SavedAsset* FindByName(std::string_view name) const; + const SavedAsset& Create(SavedAsset asset); + std::unique_ptr<Asset> CreateAndLoad(SavedAsset asset); + std::unique_ptr<Asset> LoadFromDisk(std::string_view name) const; + bool Rename(std::string_view oldName, std::string_view newName); + bool Remove(std::string_view name); + + int GetCacheSizeLimit() const; + void SetCacheSizeLimit(int limit); + + struct DrawState + { + const SavedAsset* SelectedAsset = nullptr; + }; + void DrawBigIcons(DrawState& state); + void DrawDetails(DrawState& state); +}; + +template <class TAsset> +class TypedAssetList : public AssetList +{ +public: + using Asset = TAsset; + using AssetType = typename TAsset::CategoryType; + +public: + // Import constructor + using AssetList::AssetList; + + Asset* FindByName(std::string_view name) const + { + return static_cast<TAsset*>(AssetList::FindByName(name)); + } + std::unique_ptr<Asset> Create(std::string_view name) + { + return std::unique_ptr<TAsset>(static_cast<TAsset*>(AssetList::Create(name).release())); + } + std::unique_ptr<Asset> LoadFromDisk(std::string_view name) const + { + return std::unique_ptr<TAsset>(static_cast<TAsset>(AssetList::LoadFromDisk(name))); + } +}; |