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: |
18 | virtual ~UndoHistoryDelegate() { } |
19 | virtual void onDeleteUndoState(UndoState* state) { } |
20 | }; |
21 | |
22 | class UndoHistory { |
23 | public: |
24 | UndoHistory(UndoHistoryDelegate* delegate = nullptr); |
25 | virtual ~UndoHistory(); |
26 | |
27 | const UndoState* firstState() const { return m_first; } |
28 | const UndoState* lastState() const { return m_last; } |
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 | |