From 131934df1a5c099305b31db8f51fedbc8f22547a Mon Sep 17 00:00:00 2001 From: shweet Date: Sun, 16 Nov 2025 00:11:27 -0500 Subject: [PATCH] Fixed issues with renaming/synchronizing state --- CMakeLists.txt | 1 + src/imgui/imgui_.cpp | 32 ++++++++++++++++++-------------- src/imgui/imgui_.h | 13 +++++++++++-- src/imgui/window/animations.cpp | 14 ++++++++++---- src/imgui/window/animations.h | 1 + src/imgui/window/events.cpp | 15 ++++++++++++--- src/imgui/window/events.h | 1 + 7 files changed, 54 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bafa6a..d693281 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,6 +138,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE external/lunasvg external/SDL external/SDL_mixer + external/SDL_mixer/include include include/glad src diff --git a/src/imgui/imgui_.cpp b/src/imgui/imgui_.cpp index eded6f1..ed8727c 100644 --- a/src/imgui/imgui_.cpp +++ b/src/imgui/imgui_.cpp @@ -12,6 +12,7 @@ using namespace glm; namespace anm2ed::imgui { + void theme_set(theme::Type theme) { switch (theme) @@ -79,39 +80,42 @@ namespace anm2ed::imgui } bool selectable_input_text(const std::string& label, const std::string& id, std::string& text, bool isSelected, - ImGuiSelectableFlags flags, bool* isRenamed, bool isBeginEditing) + ImGuiSelectableFlags flags, RenameState& state) { static std::string editID{}; - static bool isJustEdit{}; - const bool isEditing = editID == id; + auto isRename = editID == id; bool isActivated{}; - if (isEditing) + if (isRename) { - if (isJustEdit) + auto finish = [&]() + { + editID.clear(); + isActivated = true; + state = RENAME_FINISHED; + }; + + if (state == RENAME_BEGIN) { ImGui::SetKeyboardFocusHere(); - isJustEdit = false; + state = RENAME_EDITING; } ImGui::SetNextItemWidth(-FLT_MIN); if (input_text_string("##Edit", &text, ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) - { - editID.clear(); - isActivated = true; - if (isRenamed) *isRenamed = true; - } - if (ImGui::IsItemDeactivatedAfterEdit() || ImGui::IsKeyPressed(ImGuiKey_Escape)) editID.clear(); + finish(); + if (ImGui::IsItemDeactivatedAfterEdit() || ImGui::IsKeyPressed(ImGuiKey_Escape)) finish(); } else { if (ImGui::Selectable(label.c_str(), isSelected, flags)) isActivated = true; - if (isBeginEditing || (ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_F2) && isSelected) || + if (state == RENAME_FORCE_EDIT || (ImGui::IsWindowFocused() && ImGui::IsKeyPressed(ImGuiKey_F2)) || (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))) { + state = RENAME_BEGIN; editID = id; - isJustEdit = true; + isActivated = true; } } diff --git a/src/imgui/imgui_.h b/src/imgui/imgui_.h index 7f3edc1..a1d83b3 100644 --- a/src/imgui/imgui_.h +++ b/src/imgui/imgui_.h @@ -36,6 +36,15 @@ namespace anm2ed::imgui POPUP_BY_CURSOR }; + enum RenameState + { + RENAME_SELECTABLE, + RENAME_BEGIN, + RENAME_EDITING, + RENAME_FINISHED, + RENAME_FORCE_EDIT + }; + constexpr float POPUP_MULTIPLIERS[] = { #define X(name, multiplier, isHeightSet) multiplier, POPUP_LIST @@ -170,8 +179,8 @@ namespace anm2ed::imgui bool input_float_range(const char*, float&, float, float, float = STEP, float = STEP_FAST, const char* = "%.3f", ImGuiInputTextFlags = 0); bool combo_negative_one_indexed(const std::string&, int*, std::vector&); - bool selectable_input_text(const std::string&, const std::string&, std::string&, bool = false, - ImGuiSelectableFlags = 0, bool* = nullptr, bool = false); + bool selectable_input_text(const std::string& label, const std::string& id, std::string& text, bool isSelected, + ImGuiSelectableFlags flags, RenameState& state); void set_item_tooltip_shortcut(const char*, const std::string& = {}); void external_storage_set(ImGuiSelectionExternalStorage*, int, bool); void render_checker_background(ImDrawList*, ImVec2, ImVec2, glm::vec2, float); diff --git a/src/imgui/window/animations.cpp b/src/imgui/window/animations.cpp index b5b5b30..d0cf0ab 100644 --- a/src/imgui/window/animations.cpp +++ b/src/imgui/window/animations.cpp @@ -54,7 +54,7 @@ namespace anm2ed::imgui auto isDefault = anm2.animations.defaultAnimation == animation.name; auto isReferenced = reference.animationIndex == (int)i; - auto isNewSelection = newAnimationSelectedIndex == (int)i; + auto isNewAnimation = newAnimationSelectedIndex == (int)i; auto font = isDefault && isReferenced ? font::BOLD_ITALICS : isDefault ? font::BOLD @@ -64,15 +64,21 @@ namespace anm2ed::imgui ImGui::PushFont(resources.fonts[font].get(), font::SIZE); ImGui::SetNextItemSelectionUserData((int)i); + if (isNewAnimation) renameState = RENAME_FORCE_EDIT; if (selectable_input_text(animation.name, std::format("###Document #{} Animation #{}", manager.selected, i), - animation.name, selection.contains((int)i), ImGuiSelectableFlags_None, nullptr, - isNewSelection)) + animation.name, selection.contains((int)i), ImGuiSelectableFlags_None, renameState)) { reference = {(int)i}; document.frames.clear(); + + if (renameState == RENAME_BEGIN) + document.snapshot("Rename Animation"); + else if (renameState == RENAME_FINISHED) + document.change(Document::ANIMATIONS); } if (ImGui::IsItemHovered()) hovered = (int)i; - if (isNewSelection) + + if (isNewAnimation) { ImGui::SetScrollHereY(0.5f); newAnimationSelectedIndex = -1; diff --git a/src/imgui/window/animations.h b/src/imgui/window/animations.h index 2e373c0..6017b91 100644 --- a/src/imgui/window/animations.h +++ b/src/imgui/window/animations.h @@ -11,6 +11,7 @@ namespace anm2ed::imgui { PopupHelper mergePopup{PopupHelper("Merge Animations")}; int newAnimationSelectedIndex{-1}; + RenameState renameState{RENAME_SELECTABLE}; public: void update(Manager&, Settings&, Resources&, Clipboard&); diff --git a/src/imgui/window/events.cpp b/src/imgui/window/events.cpp index e32a0f2..850e22a 100644 --- a/src/imgui/window/events.cpp +++ b/src/imgui/window/events.cpp @@ -32,12 +32,21 @@ namespace anm2ed::imgui for (auto& [id, event] : anm2.content.events) { + auto isNewEvent = (newEventId == id); + ImGui::PushID(id); ImGui::SetNextItemSelectionUserData(id); - const bool isNewEvent = (newEventId == id); + if (isNewEvent) renameState = RENAME_FORCE_EDIT; if (selectable_input_text(event.name, std::format("###Document #{} Event #{}", manager.selected, id), - event.name, selection.contains(id), ImGuiSelectableFlags_None, nullptr, isNewEvent)) - if (ImGui::IsItemHovered()) hovered = id; + event.name, selection.contains(id), ImGuiSelectableFlags_None, renameState)) + { + if (renameState == RENAME_BEGIN) + document.snapshot("Rename Event"); + else if (renameState == RENAME_FINISHED) + document.change(Document::EVENTS); + } + if (ImGui::IsItemHovered()) hovered = id; + if (isNewEvent) { ImGui::SetScrollHereY(0.5f); diff --git a/src/imgui/window/events.h b/src/imgui/window/events.h index 4cdca79..cf62f6b 100644 --- a/src/imgui/window/events.h +++ b/src/imgui/window/events.h @@ -10,6 +10,7 @@ namespace anm2ed::imgui class Events { int newEventId{-1}; + RenameState renameState{RENAME_SELECTABLE}; public: void update(Manager&, Settings&, Resources&, Clipboard&);