| 19 | |
| 20 | |
| 21 | class UndoDelegator(Delegator): |
| 22 | |
| 23 | max_undo = 1000 |
| 24 | |
| 25 | def __init__(self): |
| 26 | Delegator.__init__(self) |
| 27 | self.reset_undo() |
| 28 | |
| 29 | def setdelegate(self, delegate): |
| 30 | if self.delegate is not None: |
| 31 | self.unbind("<<undo>>") |
| 32 | self.unbind("<<redo>>") |
| 33 | self.unbind("<<dump-undo-state>>") |
| 34 | Delegator.setdelegate(self, delegate) |
| 35 | if delegate is not None: |
| 36 | self.bind("<<undo>>", self.undo_event) |
| 37 | self.bind("<<redo>>", self.redo_event) |
| 38 | self.bind("<<dump-undo-state>>", self.dump_event) |
| 39 | |
| 40 | def dump_event(self, event): |
| 41 | from pprint import pprint |
| 42 | pprint(self.undolist[:self.pointer]) |
| 43 | print("pointer:", self.pointer, end=' ') |
| 44 | print("saved:", self.saved, end=' ') |
| 45 | print("can_merge:", self.can_merge, end=' ') |
| 46 | print("get_saved():", self.get_saved()) |
| 47 | pprint(self.undolist[self.pointer:]) |
| 48 | return "break" |
| 49 | |
| 50 | def reset_undo(self): |
| 51 | self.was_saved = -1 |
| 52 | self.pointer = 0 |
| 53 | self.undolist = [] |
| 54 | self.undoblock = 0 # or a CommandSequence instance |
| 55 | self.set_saved(1) |
| 56 | |
| 57 | def set_saved(self, flag): |
| 58 | if flag: |
| 59 | self.saved = self.pointer |
| 60 | else: |
| 61 | self.saved = -1 |
| 62 | self.can_merge = False |
| 63 | self.check_saved() |
| 64 | |
| 65 | def get_saved(self): |
| 66 | return self.saved == self.pointer |
| 67 | |
| 68 | saved_change_hook = None |
| 69 | |
| 70 | def set_saved_change_hook(self, hook): |
| 71 | self.saved_change_hook = hook |
| 72 | |
| 73 | was_saved = -1 |
| 74 | |
| 75 | def check_saved(self): |
| 76 | is_saved = self.get_saved() |
| 77 | if is_saved != self.was_saved: |
| 78 | self.was_saved = is_saved |
no outgoing calls
searching dependent graphs…