summaryrefslogtreecommitdiff
path: root/core/src/Model/Template
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Model/Template')
-rw-r--r--core/src/Model/Template/Template.hpp12
-rw-r--r--core/src/Model/Template/Template_Main.cpp96
2 files changed, 98 insertions, 10 deletions
diff --git a/core/src/Model/Template/Template.hpp b/core/src/Model/Template/Template.hpp
index 600bb26..fdac574 100644
--- a/core/src/Model/Template/Template.hpp
+++ b/core/src/Model/Template/Template.hpp
@@ -46,6 +46,12 @@ public:
class TemplateAssetList final : public AssetListTyped<Template>
{
+private:
+ // AC = Asset Creator
+ std::string mACNewName;
+ NameSelectionError mACNewNameError = NameSelectionError::Empty;
+ Template::Kind mACNewKind = Template::InvalidKind;
+
protected:
virtual void DiscoverFiles(const std::function<void(SavedAsset)>& callback) const override;
@@ -58,7 +64,9 @@ protected:
virtual Template* LoadImpl(const SavedAsset& diskForm) const override;
+ virtual void DisplayAssetCreator(PopupState& state) 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;
+ virtual void DrawBigIcon(ListState& state, const SavedAsset& asset) const override;
+ virtual void DrawDetailsTableRow(ListState& state, const SavedAsset& asset) const override;
};
diff --git a/core/src/Model/Template/Template_Main.cpp b/core/src/Model/Template/Template_Main.cpp
index 9bebc21..ebec490 100644
--- a/core/src/Model/Template/Template_Main.cpp
+++ b/core/src/Model/Template/Template_Main.cpp
@@ -2,9 +2,12 @@
#include "Model/GlobalStates.hpp"
#include "Model/Project.hpp"
+#include "UI/Localization.hpp"
+#include "UI/UI.hpp"
#include "Utils/UUID.hpp"
#include <imgui.h>
+#include <imgui_stdlib.h>
#include <fstream>
using namespace std::literals::string_view_literals;
@@ -86,30 +89,107 @@ Template* TemplateAssetList::LoadImpl(const SavedAsset& asset) const
return tmpl.release();
}
+void TemplateAssetList::DisplayAssetCreator(PopupState& state)
+{
+ auto ls = LocaleStrings::Instance.get();
+
+ auto ValidateNewName = [&]() -> void {
+ if (mACNewName.empty()) {
+ mACNewNameError = NameSelectionError::Empty;
+ return;
+ }
+
+ if (FindByName(mACNewName)) {
+ mACNewNameError = NameSelectionError::Duplicated;
+ return;
+ }
+
+ mACNewNameError = NameSelectionError::None;
+ };
+
+ auto ShowNewNameErrors = [&]() -> void {
+ switch (mACNewNameError) {
+ case NameSelectionError::None: break;
+ case NameSelectionError::Duplicated:
+ ImGui::ErrorMessage("Duplicate template name");
+ break;
+ case NameSelectionError::Empty:
+ ImGui::ErrorMessage("Template name cannot be empty");
+ break;
+ }
+ };
+
+ auto ShowNewKindErrors = [&]() -> void {
+ if (mACNewKind == Template::InvalidKind) {
+ ImGui::ErrorMessage("Must select a valid template type");
+ }
+ };
+
+ auto IsInputValid = [&]() -> bool {
+ return mACNewNameError == NameSelectionError::None &&
+ mACNewKind != Template::InvalidKind;
+ };
+
+ auto ResetState = [&]() -> void {
+ mACNewName.clear();
+ mACNewKind = Template::InvalidKind;
+ ValidateNewName();
+ };
+
+ if (ImGui::InputText("Name", &mACNewName)) {
+ ValidateNewName();
+ }
+
+ if (ImGui::BeginCombo("Type", Template::FormatKind(mACNewKind))) {
+ for (int i = 0; i < Template::KindCount; ++i) {
+ auto kind = static_cast<Template::Kind>(i);
+ if (ImGui::Selectable(Template::FormatKind(kind), mACNewKind == kind)) {
+ mACNewKind = kind;
+ }
+ }
+ ImGui::EndCombo();
+ }
+
+ ShowNewNameErrors();
+ ShowNewKindErrors();
+
+ if (ImGui::Button(ls->DialogConfirm.Get(), !IsInputValid())) {
+ ImGui::CloseCurrentPopup();
+
+ Create(SavedAsset{
+ .Name = mACNewName,
+ .Payload = static_cast<uint64_t>(mACNewKind),
+ });
+ ResetState();
+ }
+ ImGui::SameLine();
+ if (ImGui::Button(ls->DialogCancel.Get())) {
+ ImGui::CloseCurrentPopup();
+ }
+}
+
void TemplateAssetList::SetupDetailsTable(const char* tableId) const
{
- ImGui::BeginTable(tableId, 3);
+ ImGui::BeginTable(tableId, 2, ImGuiTableFlags_Borders);
ImGui::TableSetupColumn("Name");
ImGui::TableSetupColumn("Type");
- ImGui::TableSetupColumn("Modified time");
ImGui::TableHeadersRow();
}
-void TemplateAssetList::DrawBigIcon(const SavedAsset& asset) const
+void TemplateAssetList::DrawBigIcon(ListState& state, const SavedAsset& asset) const
{
// TODO
}
-void TemplateAssetList::DrawDetailsTableRow(const SavedAsset& asset) const
+void TemplateAssetList::DrawDetailsTableRow(ListState& state, const SavedAsset& asset) const
{
ImGui::TableNextColumn();
- ImGui::TextUnformatted(asset.Name.c_str());
+ if (ImGui::Selectable(asset.Name.c_str(), state.SelectedAsset == &asset, ImGuiSelectableFlags_SpanAllColumns)) {
+ state.SelectedAsset = &asset;
+ }
ImGui::TableNextColumn();
auto kind = static_cast<Template::Kind>(asset.Payload);
ImGui::TextUnformatted(Template::FormatKind(kind));
-
- ImGui::TableNextColumn();
- // TODO
}