Rozdział 18 · Historia i dokument
Powtarzanie czynności (Redo)
Redo jest drugim stosem obok Undo. Nowa akcja po anulowaniu powinna go opróżnić.
Redo — drugi stos, a nie „cofnij cofnięcie”
Rozdział 18.24 uchyla powództwo, usuwając je z undo_stack. Aby
przywrócić go z powrotem, samo działanie trzeba tymczasowo gdzieś umieścić — na drugi stos,
redo_stack:
redo.py
def redo(self):
if not self.redo_stack:
return
shapes = self.redo_stack.pop()
self.document.extend(shapes)
self.undo_stack.append(shapes)
self.render_document()
Nowe działanie musi zniszczyć redo_stack
Jeśli po Undo użytkownik narysuje coś NOWEGO, stara gałąź „to może być
powtarzać” _commit_action() (Rozdział 18.24)
zawsze oczyszcza redo_stack:
commit_ochischaet_redo.py
def _commit_action(self, shapes):
self.document.extend(shapes)
self.undo_stack.append(shapes)
self.redo_stack.clear() # nowa akcja sprawia, że stara gałąź redo nieważna
self.render_document()
Forgotten redo_stack.clear() to niezauważalny, ale realny błąd
Bez tej linii Redo mógłby "wskrzeszić" kształt, który nie ma nic wspólnego z aktualnym stanem dokumentu, ponieważ po Undo użytkownik zdołał narysować coś innego, a stara akcja cofnięta nadal znajduje się w kolejce "redo". Rozdział 18.31 traktuje ten przypadek jako osobny Debug Lab.
Praktyka: Stack powtórki i wyczyszczenie nowej akcji
Auto Check – redo przywraca akcję, nowa akcja resetuje redo