Browse Source

LibGUI: Support merging of adjacent commands on the UndoStack

When pushing a new command on an undo stack, we will now attempt to
merge it into the stack's current command.

Merging is implemented by overriding the "merge_with(Command const&)"
virtual on GUI::Command. :^)
Andreas Kling 4 years ago
parent
commit
ff912946ae
2 changed files with 8 additions and 0 deletions
  1. 2 0
      Userland/Libraries/LibGUI/Command.h
  2. 6 0
      Userland/Libraries/LibGUI/UndoStack.cpp

+ 2 - 0
Userland/Libraries/LibGUI/Command.h

@@ -19,6 +19,8 @@ public:
 
     String action_text() const { return m_action_text; }
 
+    virtual bool merge_with(Command const&) { return false; }
+
 protected:
     Command() { }
     void set_action_text(const String& text) { m_action_text = text; }

+ 6 - 0
Userland/Libraries/LibGUI/UndoStack.cpp

@@ -77,6 +77,12 @@ void UndoStack::push(NonnullOwnPtr<Command>&& command)
         finalize_current_combo();
     }
 
+    if (!m_stack.last().commands.is_empty()) {
+        bool merged = m_stack.last().commands.last().merge_with(*command);
+        if (merged)
+            return;
+    }
+
     m_stack.last().commands.append(move(command));
 
     if (on_state_change)