diff options
author | rtk0c <[email protected]> | 2021-06-09 22:18:32 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-06-09 22:18:32 -0700 |
commit | dc09ba073744292a4d4af0445e5095f424fffa22 (patch) | |
tree | 999b3d641502805ddaa6291e95f0443113b8859a /core/src/Model/Template/Template_Main.cpp | |
parent | 19d8aeb010ffc967bf82986b7586b161364ab82f (diff) |
Refactor asset management UI into AssetList
Diffstat (limited to 'core/src/Model/Template/Template_Main.cpp')
-rw-r--r-- | core/src/Model/Template/Template_Main.cpp | 96 |
1 files changed, 88 insertions, 8 deletions
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 } |