From 8f3c6669226a59994df488851ae0a540f060b5be Mon Sep 17 00:00:00 2001 From: shweet Date: Thu, 28 Aug 2025 10:27:47 -0400 Subject: [PATCH] Need to save anm2 first before doing anything, should eliminate a few problems --- src/anm2.cpp | 4 +++- src/anm2.h | 2 +- src/imgui.cpp | 34 ++++++++++++++++++---------------- src/imgui.h | 2 ++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/anm2.cpp b/src/anm2.cpp index edad3cc..0eef615 100644 --- a/src/anm2.cpp +++ b/src/anm2.cpp @@ -123,7 +123,9 @@ bool anm2_serialize(Anm2* self, const std::string& path) // Animations animationsElement = document.NewElement(ANM2_ELEMENT_STRINGS[ANM2_ELEMENT_ANIMATIONS]); - animationsElement->SetAttribute(ANM2_ATTRIBUTE_STRINGS[ANM2_ATTRIBUTE_DEFAULT_ANIMATION], self->animations[self->defaultAnimationID].name.c_str()); // DefaultAnimation + + if (self->defaultAnimationID != ID_NONE) + animationsElement->SetAttribute(ANM2_ATTRIBUTE_STRINGS[ANM2_ATTRIBUTE_DEFAULT_ANIMATION], self->animations[self->defaultAnimationID].name.c_str()); // DefaultAnimation for (auto& [id, animation] : self->animations) { diff --git a/src/anm2.h b/src/anm2.h index 378c6d1..301140a 100644 --- a/src/anm2.h +++ b/src/anm2.h @@ -211,7 +211,7 @@ struct Anm2 std::map events; std::map animations; std::map layerMap; // index, id - s32 defaultAnimationID{}; + s32 defaultAnimationID = ID_NONE; s32 fps = ANM2_FPS_DEFAULT; s32 version{}; }; diff --git a/src/imgui.cpp b/src/imgui.cpp index 48e7df1..b93f5b6 100644 --- a/src/imgui.cpp +++ b/src/imgui.cpp @@ -35,15 +35,16 @@ static void _imgui_anm2_open(Imgui* self, const std::string& path) static void _imgui_spritesheet_add(Imgui* self, const std::string& path) { - std::filesystem::path workingPath = std::filesystem::current_path(); - std::string spritesheetPath = path; - - if (!self->anm2->path.empty()) + if (self->anm2->path.empty()) { - std::string anm2WorkingPath = working_directory_from_file_set(self->anm2->path); - spritesheetPath = std::filesystem::relative(path, anm2WorkingPath).string(); + imgui_log_push(self, IMGUI_LOG_NO_ANM2_PATH); + return; } + std::filesystem::path workingPath = std::filesystem::current_path(); + std::string spritesheetPath = path; + std::string anm2WorkingPath = working_directory_from_file_set(self->anm2->path); + spritesheetPath = std::filesystem::relative(path, anm2WorkingPath).string(); s32 id = map_next_id_get(self->anm2->spritesheets); self->anm2->spritesheets[id] = Anm2Spritesheet{}; self->anm2->spritesheets[id].path = spritesheetPath; @@ -209,7 +210,8 @@ static void _imgui_item_post(const ImguiItem& self, Imgui* imgui, ImguiItemType if (self.is_undoable()) imgui_snapshot(imgui, self.snapshotAction); - if (self.function) self.function(imgui); + if (self.function) + self.function(imgui); if (self.is_popup()) { @@ -1754,12 +1756,12 @@ static void _imgui_animations(Imgui* self) _imgui_begin_child(IMGUI_FOOTER_CHILD, self); - if (_imgui_button(IMGUI_ANIMATION_ADD, self)) + if (_imgui_button(IMGUI_ANIMATION_ADD.copy({self->anm2->path.empty()}), self)) { s32 id = anm2_animation_add(self->anm2); self->reference->animationID = id; - if (self->anm2->animations.size() == 0) + if (self->anm2->animations.size() == 1) self->anm2->defaultAnimationID = id; } @@ -1924,7 +1926,7 @@ static void _imgui_events(Imgui* self) _imgui_begin_child(IMGUI_FOOTER_CHILD, self); - if (_imgui_button(IMGUI_EVENTS_ADD, self)) + if (_imgui_button(IMGUI_EVENTS_ADD.copy({self->anm2->path.empty()}), self)) { s32 id = map_next_id_get(self->anm2->events); self->anm2->events[id] = Anm2Event{}; @@ -2027,8 +2029,8 @@ static void _imgui_spritesheets(Imgui* self) _imgui_begin_child(IMGUI_SPRITESHEETS_FOOTER_CHILD, self); - if (_imgui_button(IMGUI_SPRITESHEET_ADD, self)) - dialog_spritesheet_add(self->dialog); + if (_imgui_button(IMGUI_SPRITESHEET_ADD.copy({self->anm2->path.empty()}), self)) + dialog_spritesheet_add(self->dialog); if (self->dialog->isSelected && self->dialog->type == DIALOG_SPRITESHEET_ADD) { @@ -2227,8 +2229,8 @@ static void _imgui_animation_preview(Imgui* self) const bool isUp = ImGui::IsKeyPressed(IMGUI_INPUT_UP); const bool isDown = ImGui::IsKeyPressed(IMGUI_INPUT_DOWN); const bool isMod = ImGui::IsKeyDown(IMGUI_INPUT_SHIFT); - const bool isZoomIn = ImGui::IsKeyDown(IMGUI_INPUT_ZOOM_IN); - const bool isZoomOut = ImGui::IsKeyDown(IMGUI_INPUT_ZOOM_OUT); + const bool isZoomIn = ImGui::IsKeyPressed(IMGUI_INPUT_ZOOM_IN); + const bool isZoomOut = ImGui::IsKeyPressed(IMGUI_INPUT_ZOOM_OUT); const bool isMouseClick = ImGui::IsMouseClicked(ImGuiMouseButton_Left); const bool isMouseDown = ImGui::IsMouseDown(ImGuiMouseButton_Left); const bool isMouseMiddleDown = ImGui::IsMouseDown(ImGuiMouseButton_Middle); @@ -2357,8 +2359,8 @@ static void _imgui_spritesheet_editor(Imgui* self) const bool isMouseClick = ImGui::IsMouseClicked(ImGuiMouseButton_Left); const bool isMouseDown = ImGui::IsMouseDown(ImGuiMouseButton_Left); const bool isMouseMiddleDown = ImGui::IsMouseDown(ImGuiMouseButton_Middle); - const bool isZoomIn = ImGui::IsKeyDown(IMGUI_INPUT_ZOOM_IN); - const bool isZoomOut = ImGui::IsKeyDown(IMGUI_INPUT_ZOOM_OUT); + const bool isZoomIn = ImGui::IsKeyPressed(IMGUI_INPUT_ZOOM_IN); + const bool isZoomOut = ImGui::IsKeyPressed(IMGUI_INPUT_ZOOM_OUT); const bool isMod = ImGui::IsKeyDown(IMGUI_INPUT_SHIFT); const f32 mouseWheel = ImGui::GetIO().MouseWheel; const ImVec2 mouseDelta = ImGui::GetIO().MouseDelta; diff --git a/src/imgui.h b/src/imgui.h index a5b30d5..36af4f8 100644 --- a/src/imgui.h +++ b/src/imgui.h @@ -75,6 +75,7 @@ #define IMGUI_POPUP_FLAGS ImGuiWindowFlags_NoMove #define IMGUI_POPUP_MODAL_FLAGS ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize +#define IMGUI_LOG_NO_ANM2_PATH "Please save the .anm2 to a path first!" #define IMGUI_LOG_FILE_OPEN_FORMAT "Opened anm2: {}" #define IMGUI_LOG_FILE_SAVE_FORMAT "Saved anm2 to: {}" #define IMGUI_LOG_SPRITESHEET_RELOAD "Reloaded selected spritesheets" @@ -274,6 +275,7 @@ static inline void imgui_explore(Imgui* self) static inline void imgui_snapshot(Imgui* self, const std::string& action = SNAPSHOT_ACTION) { + self->snapshots->action = action; Snapshot snapshot = snapshot_get(self->snapshots); snapshots_undo_push(self->snapshots, &snapshot); }