From 4d8a3dc0e9d7ff80a64511e6c17652fa095ad4d0 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sun, 12 Jan 2025 02:56:07 -0600 Subject: [PATCH] [jasper/world] Make obj frames default to SubSheet children count --- .../worldobjectseteditor/CMakeLists.txt | 1 + .../commands/editobject.cpp | 43 +++++++++++++++++++ .../commands/editobject.hpp | 29 ++++++++++--- .../worldobjectseteditor-imgui.cpp | 15 +++++-- 4 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/CMakeLists.txt b/src/jasper/modules/world/src/studio/worldobjectseteditor/CMakeLists.txt index 0771f7d..0f3f318 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/CMakeLists.txt +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/CMakeLists.txt @@ -1,5 +1,6 @@ target_sources( JasperWorld-Studio PRIVATE + commands/editobject.cpp commands/addobject.cpp commands/rmobject.cpp commands/addpalette.cpp diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp new file mode 100644 index 0000000..f1d531f --- /dev/null +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2023 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved. + */ + +#include "editobject.hpp" + +namespace jasper::world { + +EditObjectSubSheet::EditObjectSubSheet( + WorldObjectSet &doc, + size_t const objIdx, + ncore::SubSheetId const newSubSheet, + uint8_t const newFrames) noexcept: + m_doc{doc}, + m_objIdx{objIdx}, + m_oldSubSheet{m_doc.objects[objIdx].subsheetId}, + m_newSubSheet{newSubSheet}, + m_oldFrames{m_doc.objects[objIdx].frames}, + m_newFrames{newFrames} { + setObsolete( + m_newSubSheet == m_oldSubSheet && + m_newFrames == m_oldFrames); +} + +ox::Error EditObjectSubSheet::redo() noexcept { + auto &obj = m_doc.objects[m_objIdx]; + obj.subsheetId = m_newSubSheet; + obj.frames = m_newFrames; + return {}; +} + +ox::Error EditObjectSubSheet::undo() noexcept { + auto &obj = m_doc.objects[m_objIdx]; + obj.subsheetId = m_oldSubSheet; + obj.frames = m_oldFrames; + return {}; +} + +int EditObjectSubSheet::commandId() const noexcept { + return static_cast(WorldObjCommand::EditObjectSubSheet); +} + +} \ No newline at end of file diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp index fd2393d..3780af0 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp @@ -87,12 +87,6 @@ using EditObjectInterval = EditObject< return obj.intervalMs; }>; -using EditObjectSubSheet = EditObject< - WorldObjCommand::EditObjectSubSheet, - [](WorldObject &obj) -> auto& { - return obj.subsheetId; - }>; - using EditObjectPalette = EditObject< WorldObjCommand::EditObjectPalette, [](WorldObject &obj) -> auto& { @@ -106,4 +100,27 @@ using EditObjectCollisionMap = EditObject< }>; +class EditObjectSubSheet: public studio::UndoCommand { + private: + WorldObjectSet &m_doc; + size_t const m_objIdx{}; + ncore::SubSheetId const m_oldSubSheet{}; + ncore::SubSheetId m_newSubSheet{}; + uint8_t const m_oldFrames{}; + uint8_t m_newFrames{}; + public: + EditObjectSubSheet( + WorldObjectSet &doc, + size_t objIdx, + ncore::SubSheetId newSubSheet, + uint8_t newFrames) noexcept; + + ox::Error redo() noexcept override; + + ox::Error undo() noexcept override; + + [[nodiscard]] + int commandId() const noexcept override; +}; + } diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp index 1632069..db26fb4 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp @@ -233,19 +233,28 @@ void WorldObjectSetEditorImGui::drawObjEditor() noexcept { void WorldObjectSetEditorImGui::drawSubSheetNode(ncore::TileSheet::SubSheet const&ss) noexcept { auto constexpr dirFlags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; - auto &obj = activeObj(); + auto const&obj = activeObj(); auto const selected = ss.id == obj.subsheetId ? ImGuiTreeNodeFlags_Selected : 0; ig::IDStackItem const idStackItem{ss.name}; if (!ss.subsheets.empty()) { - if (ImGui::TreeNodeEx(ss.name.c_str(), dirFlags)) { + if (ImGui::TreeNodeEx(ss.name.c_str(), dirFlags | selected)) { + if (ImGui::IsItemClicked()) { + std::ignore = pushCommand( + m_doc, m_selectedObj, ss.id, static_cast(ss.subsheets.size())); + } for (auto const&child : ss.subsheets) { drawSubSheetNode(child); } ImGui::TreePop(); + } else { + if (ImGui::IsItemClicked()) { + std::ignore = pushCommand( + m_doc, m_selectedObj, ss.id, static_cast(ss.subsheets.size())); + } } } else if (ImGui::TreeNodeEx(ss.name.c_str(), ImGuiTreeNodeFlags_Leaf | selected)) { if (ImGui::IsItemClicked()) { - std::ignore = pushCommand(m_doc, m_selectedObj, ss.id); + std::ignore = pushCommand(m_doc, m_selectedObj, ss.id, static_cast(1)); } ImGui::TreePop(); }