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