LibGUI: Fix undo stack reporting wrong modified state

Since the `redo` action never goes back to `index: 0`,
we have to mark the clean index as being the current
non-empty index for the undo/redo navigation to work properly.

The problem is that if we never `undo`, the stack index stays at zero,
which is the empty container waiting for commands. In that situation,
if we save the document, it registers the clean index as being 1
(the non-empty index) but because the stack index has never left zero,
the document was being reported as modified, being out of sync with
the window modified state.
This commit is contained in:
Carlos César Neves Enumo 2021-05-08 04:51:52 -03:00 committed by Linus Groh
parent 3c01de4f0b
commit 0b7e19e2bb
Notes: sideshowbarker 2024-07-18 18:31:46 +09:00
2 changed files with 12 additions and 6 deletions

View File

@ -92,16 +92,12 @@ void UndoStack::finalize_current_combo()
void UndoStack::set_current_unmodified()
{
// Skip empty container
if (can_undo() && m_stack[m_stack_index].commands.is_empty())
m_clean_index = m_stack_index + 1;
else
m_clean_index = m_stack_index;
m_clean_index = non_empty_stack_index();
}
bool UndoStack::is_current_modified() const
{
return !m_clean_index.has_value() || m_stack_index != m_clean_index.value();
return !m_clean_index.has_value() || non_empty_stack_index() != m_clean_index.value();
}
void UndoStack::clear()
@ -111,4 +107,12 @@ void UndoStack::clear()
m_clean_index.clear();
}
size_t UndoStack::non_empty_stack_index() const
{
if (can_undo() && m_stack[m_stack_index].commands.is_empty())
return m_stack_index + 1;
else
return m_stack_index;
}
}

View File

@ -32,6 +32,8 @@ public:
void clear();
private:
size_t non_empty_stack_index() const;
struct Combo {
NonnullOwnPtrVector<Command> commands;
};