diff --git a/src/olympic/studio/modlib/src/undostack.cpp b/src/olympic/studio/modlib/src/undostack.cpp index f6725017..81ef2f46 100644 --- a/src/olympic/studio/modlib/src/undostack.cpp +++ b/src/olympic/studio/modlib/src/undostack.cpp @@ -7,9 +7,7 @@ namespace studio { ox::Error UndoStack::push(ox::UPtr &&cmd) noexcept { - for (auto const i = m_stackIdx; i < m_stack.size();) { - std::ignore = m_stack.erase(i); - } + m_stack.resize(m_stackIdx); OX_RETURN_ERROR(cmd->redo()); redoTriggered.emit(cmd.get()); changeTriggered.emit(cmd.get()); @@ -25,22 +23,29 @@ ox::Error UndoStack::push(ox::UPtr &&cmd) noexcept { } ox::Error UndoStack::redo() noexcept { - if (m_stackIdx < m_stack.size()) { - auto &c = m_stack[m_stackIdx]; - OX_RETURN_ERROR(c->redo()); + while (m_stackIdx < m_stack.size()) { + auto const &c = m_stack[m_stackIdx]; ++m_stackIdx; - redoTriggered.emit(c.get()); - changeTriggered.emit(c.get()); + if (!c->isObsolete()) { + OX_RETURN_ERROR(c->redo()); + redoTriggered.emit(c.get()); + changeTriggered.emit(c.get()); + break; + } } return {}; } ox::Error UndoStack::undo() noexcept { - if (m_stackIdx) { - auto &c = m_stack[--m_stackIdx]; - OX_RETURN_ERROR(c->undo()); - undoTriggered.emit(c.get()); - changeTriggered.emit(c.get()); + while (m_stackIdx) { + --m_stackIdx; + auto const &c = m_stack[m_stackIdx]; + if (!c->isObsolete()) { + OX_RETURN_ERROR(c->undo()); + undoTriggered.emit(c.get()); + changeTriggered.emit(c.get()); + break; + } } return {}; }