[studio] Make undo/redo skip over obsolete commands

This commit is contained in:
Gary Talent 2025-02-05 20:26:03 -06:00
parent b4798fd2ab
commit e002109829

View File

@ -7,9 +7,7 @@
namespace studio { namespace studio {
ox::Error UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept { ox::Error UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept {
for (auto const i = m_stackIdx; i < m_stack.size();) { m_stack.resize(m_stackIdx);
std::ignore = m_stack.erase(i);
}
OX_RETURN_ERROR(cmd->redo()); OX_RETURN_ERROR(cmd->redo());
redoTriggered.emit(cmd.get()); redoTriggered.emit(cmd.get());
changeTriggered.emit(cmd.get()); changeTriggered.emit(cmd.get());
@ -25,22 +23,29 @@ ox::Error UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept {
} }
ox::Error UndoStack::redo() noexcept { ox::Error UndoStack::redo() noexcept {
if (m_stackIdx < m_stack.size()) { while (m_stackIdx < m_stack.size()) {
auto &c = m_stack[m_stackIdx]; auto const &c = m_stack[m_stackIdx];
OX_RETURN_ERROR(c->redo());
++m_stackIdx; ++m_stackIdx;
redoTriggered.emit(c.get()); if (!c->isObsolete()) {
changeTriggered.emit(c.get()); OX_RETURN_ERROR(c->redo());
redoTriggered.emit(c.get());
changeTriggered.emit(c.get());
break;
}
} }
return {}; return {};
} }
ox::Error UndoStack::undo() noexcept { ox::Error UndoStack::undo() noexcept {
if (m_stackIdx) { while (m_stackIdx) {
auto &c = m_stack[--m_stackIdx]; --m_stackIdx;
OX_RETURN_ERROR(c->undo()); auto const &c = m_stack[m_stackIdx];
undoTriggered.emit(c.get()); if (!c->isObsolete()) {
changeTriggered.emit(c.get()); OX_RETURN_ERROR(c->undo());
undoTriggered.emit(c.get());
changeTriggered.emit(c.get());
break;
}
} }
return {}; return {};
} }