[jasper/world] Make obj frames default to SubSheet children count
All checks were successful
Build / build (push) Successful in 3m40s

This commit is contained in:
Gary Talent 2025-01-12 02:56:07 -06:00
parent 028d98cc41
commit 4d8a3dc0e9
4 changed files with 79 additions and 9 deletions

View File

@ -1,5 +1,6 @@
target_sources(
JasperWorld-Studio PRIVATE
commands/editobject.cpp
commands/addobject.cpp
commands/rmobject.cpp
commands/addpalette.cpp

View File

@ -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<int>(WorldObjCommand::EditObjectSubSheet);
}
}

View File

@ -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;
};
}

View File

@ -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<EditObjectSubSheet>(
m_doc, m_selectedObj, ss.id, static_cast<uint8_t>(ss.subsheets.size()));
}
for (auto const&child : ss.subsheets) {
drawSubSheetNode(child);
}
ImGui::TreePop();
} else {
if (ImGui::IsItemClicked()) {
std::ignore = pushCommand<EditObjectSubSheet>(
m_doc, m_selectedObj, ss.id, static_cast<uint8_t>(ss.subsheets.size()));
}
}
} else if (ImGui::TreeNodeEx(ss.name.c_str(), ImGuiTreeNodeFlags_Leaf | selected)) {
if (ImGui::IsItemClicked()) {
std::ignore = pushCommand<EditObjectSubSheet>(m_doc, m_selectedObj, ss.id);
std::ignore = pushCommand<EditObjectSubSheet>(m_doc, m_selectedObj, ss.id, static_cast<uint8_t>(1));
}
ImGui::TreePop();
}