Sto facendo un'applicazione (wxPython) per elaborare alcuni dati da documenti Excel. Voglio che l'utente sia in grado di annullare e ripetere azioni, anche azioni gigantesche come l'elaborazione simultanea dei contenuti di 10.000 celle. Ho cercato su Google l'argomento e tutte le soluzioni che ho trovato riguardano un sacco di magia nera o sono eccessivamente complicate.
Ecco come immagino il mio semplice schema di annullamento / ripristino. Scrivo due classi, una chiamata ActionStack
e una astratta chiamata Action
. Ogni operazione "annullabile" deve essere una sottoclasse di Action
e definire i metodi do
e undo
. La sottoclasse Action
riceve l'istanza del "documento" o modello di dati ed è responsabile per l'operazione e per ricordare come annullare la modifica.
Ora, ogni documento è associato a un'istanza di ActionStack
. Il ActionStack
mantiene una pila di azioni (sorpresa!). Ogni volta che le azioni vengono annullate e vengono eseguite nuove azioni, tutte le azioni annullate vengono rimosse per sempre. Anche ActionStack
rimuoverà automaticamente il più vecchio Action
quando lo stack raggiunge il valore massimo configurabile.
Immagino che il flusso di lavoro produca codice simile a questo:
class TableDocument(object):
def __init__(self, table):
self.table = table
self.action_stack = ActionStack(history_limit=50)
# ...
def delete_cells(self, cells):
self.action_stack.push(
DeleteAction(self, cells)
)
def add_column(self, index, name=''):
self.action_stack.push(
AddColumnAction(self, index, name)
)
# ...
def undo(self, count=1):
self.action_stack.undo(count)
def redo(self, count=1):
self.action_stack.redo(count)
Dato che nessuno dei metodi che ho trovato sono così semplici, ho pensato di ottenere l'opinione degli esperti prima di andare avanti con questo piano. Più nello specifico, ciò di cui mi sto chiedendo è: ci sono dei buchi evidenti in questo piano che non vedo?