From dc09ba073744292a4d4af0445e5095f424fffa22 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Wed, 9 Jun 2021 22:18:32 -0700 Subject: Refactor asset management UI into AssetList --- core/src/Model/Template/Template_Main.cpp | 96 ++++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 8 deletions(-) (limited to 'core/src/Model/Template/Template_Main.cpp') 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 +#include #include 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(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(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(asset.Payload); ImGui::TextUnformatted(Template::FormatKind(kind)); - - ImGui::TableNextColumn(); - // TODO } -- cgit v1.2.3-70-g09d2