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()
Real Window: Prostokąt wcześniej usunięty przez Undo ponownie jest widoczny na płótnie po Redo
Realne okno: Po Ctrl+Y - Decyzja cofnięta w sekcji 18.24 została przywrócona.

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
Otwórz praktykę →