summaryrefslogtreecommitdiff
path: root/core/src/Model/Assets.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-06-05 19:44:54 -0700
committerrtk0c <[email protected]>2021-06-05 19:44:54 -0700
commita180e1b56025c6b7d81d2e587ad90531d29de44c (patch)
tree1c88361320371b508c81b52a28ae0579fcdd1fd7 /core/src/Model/Assets.hpp
parentd3fa128d5408673b0ea8d3ba3435c38b258a5e7a (diff)
Initial work on asset system (does not compile)
Diffstat (limited to 'core/src/Model/Assets.hpp')
-rw-r--r--core/src/Model/Assets.hpp104
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)));
+ }
+};