48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
|
|
from copy import deepcopy
|
|
|
|
|
|
class UndoManager():
|
|
def __init__(self, data):
|
|
self._current_state = deepcopy(data)
|
|
self._modified = False
|
|
self._undo_stack = []
|
|
self._redo_stack = []
|
|
|
|
@property
|
|
def data(self):
|
|
return deepcopy(self._current_state)
|
|
|
|
def undo(self):
|
|
if not self._undo_stack:
|
|
return False
|
|
self._redo_stack.append(self.data)
|
|
self._current_state = deepcopy(self._undo_stack[-1])
|
|
del self._undo_stack[-1]
|
|
return True
|
|
|
|
def redo(self):
|
|
if not self._redo_stack:
|
|
return False
|
|
self._undo_stack.append(deepcopy(self._current_state))
|
|
self._current_state = deepcopy(self._redo_stack[-1])
|
|
del self._redo_stack[-1]
|
|
return True
|
|
|
|
def set_data_modified(self, data):
|
|
self._redo_stack = []
|
|
self._undo_stack.append(self.data)
|
|
self._current_state = deepcopy(data)
|
|
self._modified = True
|
|
|
|
def set_data_saved(self):
|
|
self._modified = False
|
|
|
|
@property
|
|
def data_saved(self):
|
|
return not self._modified
|
|
|
|
def reset_stacks(self):
|
|
self._undo_stack = []
|
|
self._redo_stack = []
|