aboutsummaryrefslogtreecommitdiff
path: root/core/src/Model/Template
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-06-07 12:19:51 -0700
committerrtk0c <[email protected]>2021-06-07 12:19:51 -0700
commitd7ee2efaca226fc478e3f0c78abdbe86a887f17a (patch)
tree81670fefb7cdba3c5fa0ab890f7d84e24c194bdb /core/src/Model/Template
parenta180e1b56025c6b7d81d2e587ad90531d29de44c (diff)
Complete asset loading/saving and UI management logic
Diffstat (limited to 'core/src/Model/Template')
-rw-r--r--core/src/Model/Template/Template.hpp19
-rw-r--r--core/src/Model/Template/Template_Main.cpp62
-rw-r--r--core/src/Model/Template/fwd.hpp2
3 files changed, 63 insertions, 20 deletions
diff --git a/core/src/Model/Template/Template.hpp b/core/src/Model/Template/Template.hpp
index d876650..600bb26 100644
--- a/core/src/Model/Template/Template.hpp
+++ b/core/src/Model/Template/Template.hpp
@@ -19,8 +19,7 @@ public:
KindCount = InvalidKind,
};
- using CategoryType = TemplateAssetCategory;
- static constinit const TemplateAssetCategory Category;
+ using CategoryType = TemplateAssetList;
private:
Kind mKind;
@@ -45,12 +44,20 @@ public:
virtual void WriteTo(std::ostream& stream) const = 0;
};
-class TemplateAssetCategory : public AssetCategory
+class TemplateAssetList final : public AssetListTyped<Template>
{
-public:
+protected:
virtual void DiscoverFiles(const std::function<void(SavedAsset)>& callback) const override;
- virtual Template* CreateEmpty(const SavedAsset& diskForm) const override;
- virtual Template* Load(const SavedAsset& diskForm) const override;
+
+ virtual std::string RetrieveNameFromFile(const std::filesystem::path& file) const override;
+ virtual uuids::uuid RetrieveUuidFromFile(const std::filesystem::path& file) const override;
+ virtual std::filesystem::path RetrievePathFromAsset(const SavedAsset& asset) const override;
+
+ virtual void SaveEmptyInstance(const SavedAsset& asset) const override;
+ virtual Template* CreateEmptyInstance(const SavedAsset& diskForm) const override;
+
+ virtual Template* LoadImpl(const SavedAsset& diskForm) const override;
+
virtual void SetupDetailsTable(const char* tableId) const override;
virtual void DrawBigIcon(const SavedAsset& asset) const override;
virtual void DrawDetailsTableRow(const SavedAsset& asset) const override;
diff --git a/core/src/Model/Template/Template_Main.cpp b/core/src/Model/Template/Template_Main.cpp
index 9efbeae..92ad050 100644
--- a/core/src/Model/Template/Template_Main.cpp
+++ b/core/src/Model/Template/Template_Main.cpp
@@ -4,11 +4,11 @@
#include "Model/Project.hpp"
#include <imgui.h>
+#include <uuid.h>
#include <fstream>
using namespace std::literals::string_view_literals;
-
-constinit const TemplateAssetCategory Template::Category{};
+namespace fs = std::filesystem;
Template::Template(Kind kind)
: mKind{ kind }
@@ -20,26 +20,62 @@ Template::Kind Template::GetKind() const
return mKind;
}
-void TemplateAssetCategory::DiscoverFiles(const std::function<void(SavedAsset)>& callback) const
+void TemplateAssetList::DiscoverFiles(const std::function<void(SavedAsset)>& callback) const
{
auto& gs = GlobalStates::GetInstance();
DiscoverFilesByExtension(callback, gs.GetCurrentProject()->GetTemplatesDirectory(), ".cplt-template"sv);
}
-Template* TemplateAssetCategory::CreateEmpty(const SavedAsset& diskForm) const
+std::string TemplateAssetList::RetrieveNameFromFile(const fs::path& file) const
{
- // TODO
+ std::ifstream ifs(file);
+ if (!ifs) return "";
+
+ std::string name;
+ ifs >> name;
+ return name;
+}
+
+uuids::uuid TemplateAssetList::RetrieveUuidFromFile(const fs::path& file) const
+{
+ return uuids::uuid::from_string(file.stem().string());
}
-Template* TemplateAssetCategory::Load(const SavedAsset& diskForm) const
+fs::path TemplateAssetList::RetrievePathFromAsset(const SavedAsset& asset) const
{
- std::ifstream ifs(diskForm.Path);
+ auto uuid = uuids::uuid_random_generator{}();
+ auto fileName = uuids::to_string(uuid);
+ fileName.append(".cplt-template");
+
+ auto& gs = GlobalStates::GetInstance();
+ return gs.GetCurrentProject()->GetTemplatePath(fileName);
+}
+
+void TemplateAssetList::SaveEmptyInstance(const SavedAsset& asset) const
+{
+ auto path = RetrievePathFromAsset(asset);
+
+ std::ofstream ofs(path);
+ if (!ofs) return;
+ ofs << asset.Name;
+ ofs << static_cast<Template::Kind>(asset.Payload);
+}
+
+Template* TemplateAssetList::CreateEmptyInstance(const SavedAsset& asset) const
+{
+ auto kind = static_cast<Template::Kind>(asset.Payload);
+ return Template::CreateByKind(kind).release();
+}
+
+Template* TemplateAssetList::LoadImpl(const SavedAsset& asset) const
+{
+ std::ifstream ifs(RetrievePathFromAsset(asset));
if (!ifs) return nullptr;
uint32_t iKind;
ifs >> iKind;
- auto kind = (Template::Kind)iKind;
+ auto kind = static_cast<Template::Kind>(iKind);
auto tmpl = Template::CreateByKind(kind);
auto res = tmpl->ReadFrom(ifs);
@@ -50,7 +86,7 @@ Template* TemplateAssetCategory::Load(const SavedAsset& diskForm) const
return tmpl.release();
}
-void TemplateAssetCategory::SetupDetailsTable(const char* tableId) const
+void TemplateAssetList::SetupDetailsTable(const char* tableId) const
{
ImGui::BeginTable(tableId, 3);
@@ -60,19 +96,19 @@ void TemplateAssetCategory::SetupDetailsTable(const char* tableId) const
ImGui::TableHeadersRow();
}
-void TemplateAssetCategory::DrawBigIcon(const SavedAsset& asset) const
+void TemplateAssetList::DrawBigIcon(const SavedAsset& asset) const
{
// TODO
}
-void TemplateAssetCategory::DrawDetailsTableRow(const SavedAsset& asset) const
+void TemplateAssetList::DrawDetailsTableRow(const SavedAsset& asset) const
{
ImGui::TableNextColumn();
ImGui::TextUnformatted(asset.Name.c_str());
ImGui::TableNextColumn();
- // TODO
- //ImGui::TextUnformatted(Template::FormatKind(asset.));
+ auto kind = static_cast<Template::Kind>(asset.Payload);
+ ImGui::TextUnformatted(Template::FormatKind(kind));
ImGui::TableNextColumn();
// TODO
diff --git a/core/src/Model/Template/fwd.hpp b/core/src/Model/Template/fwd.hpp
index aad9f14..b0acb28 100644
--- a/core/src/Model/Template/fwd.hpp
+++ b/core/src/Model/Template/fwd.hpp
@@ -8,4 +8,4 @@ class TableTemplate;
// Template.hpp
class Template;
-class TemplateAssetCategory;
+class TemplateAssetList;