1 // Undo Library
2 // Copyright (C) 2015-2017 David Capello
3 //
4 // This file is released under the terms of the MIT license.
5 // Read LICENSE.txt for more information.
6 
7 #ifndef UNDO_HISTORY_H_INCLUDED
8 #define UNDO_HISTORY_H_INCLUDED
9 #pragma once
10 
11 namespace undo {
12 
13   class UndoCommand;
14   class UndoState;
15 
16   class UndoHistoryDelegate {
17   public:
~UndoHistoryDelegate()18     virtual ~UndoHistoryDelegate() { }
onDeleteUndoState(UndoState * state)19     virtual void onDeleteUndoState(UndoState* state) { }
20   };
21 
22   class UndoHistory {
23   public:
24     UndoHistory(UndoHistoryDelegate* delegate = nullptr);
25     virtual ~UndoHistory();
26 
firstState()27     const UndoState* firstState()   const { return m_first; }
lastState()28     const UndoState* lastState()    const { return m_last; }
currentState()29     const UndoState* currentState() const { return m_cur; }
30 
31     void add(UndoCommand* cmd);
32     bool canUndo() const;
33     bool canRedo() const;
34     void undo();
35     void redo();
36 
37     // Deletes the whole redo history. Can be called before an add()
38     // to create a linear undo history.
39     void clearRedo();
40 
41     // Deletes the first UndoState. It can be useful to limit the size
42     // of the undo history.
43     bool deleteFirstState();
44 
45     // This can be used to jump to a specific UndoState in the whole
46     // history.
47     void moveTo(const UndoState* new_state);
48 
49   private:
50     const UndoState* findCommonParent(const UndoState* a,
51                                       const UndoState* b);
52     void deleteState(UndoState* state);
53 
54     UndoHistoryDelegate* m_delegate;
55     UndoState* m_first;
56     UndoState* m_last;
57     UndoState* m_cur;          // Current action that can be undone
58   };
59 
60 } // namespace undo
61 
62 #endif  // HISTORY_H_INCLUDED
63