[jasper/world/studio/worldobjectseteditor] Make palette removal update object palette refs

This commit is contained in:
Gary Talent 2025-01-13 21:33:29 -06:00
parent dc9d7f2082
commit d16a6e1659
2 changed files with 26 additions and 1 deletions

View File

@ -9,14 +9,30 @@
namespace jasper::world { namespace jasper::world {
RmPalette::RmPalette(WorldObjectSet &doc, size_t rmIdx) noexcept: RmPalette::RmPalette(WorldObjectSet &doc, size_t const rmIdx) noexcept:
m_doc(doc), m_doc(doc),
m_rmIdx(rmIdx) { m_rmIdx(rmIdx) {
m_objUpdates.reserve(m_doc.objects.size());
for (size_t i = 0; auto const&obj : m_doc.objects) {
if (obj.palBank >= m_rmIdx) {
auto const newPalBank = static_cast<uint16_t>(obj.palBank == m_rmIdx ?
0 : obj.palBank - 1);
m_objUpdates.emplace_back(ObjUpdate{
.idx = i,
.oldPalBank = obj.palBank,
.newPalBank = newPalBank,
});
}
++i;
}
} }
ox::Error RmPalette::redo() noexcept { ox::Error RmPalette::redo() noexcept {
m_pal = std::move(m_doc.palettes[m_rmIdx]); m_pal = std::move(m_doc.palettes[m_rmIdx]);
std::ignore = m_doc.palettes.erase(m_rmIdx); std::ignore = m_doc.palettes.erase(m_rmIdx);
for (auto const&u : m_objUpdates) {
m_doc.objects[u.idx].palBank = u.newPalBank;
}
return {}; return {};
} }
@ -26,6 +42,9 @@ ox::Error RmPalette::undo() noexcept {
[](ox::FileAddress const&a, ox::FileAddress const&b) { [](ox::FileAddress const&a, ox::FileAddress const&b) {
return a.getPath().or_value("") < b.getPath().or_value(""); return a.getPath().or_value("") < b.getPath().or_value("");
}); });
for (auto const&u : m_objUpdates) {
m_doc.objects[u.idx].palBank = u.oldPalBank;
}
return {}; return {};
} }

View File

@ -17,6 +17,12 @@ class RmPalette: public studio::UndoCommand {
WorldObjectSet &m_doc; WorldObjectSet &m_doc;
ox::FileAddress m_pal; ox::FileAddress m_pal;
size_t const m_rmIdx = 0; size_t const m_rmIdx = 0;
struct ObjUpdate {
size_t idx{};
uint16_t oldPalBank{};
uint16_t newPalBank{};
};
ox::Vector<ObjUpdate> m_objUpdates;
public: public:
RmPalette(WorldObjectSet &doc, size_t rmIdx) noexcept; RmPalette(WorldObjectSet &doc, size_t rmIdx) noexcept;
ox::Error redo() noexcept override; ox::Error redo() noexcept override;