Multiple undo and redo
Richard Gaskin
ambassador at fourthworld.com
Mon Feb 19 15:20:53 EST 2007
Jim Ault wrote:
> Couldn't you create a substack "undo" and set a series of custom properties
> to the mainStack as a binary+save this stack. In the beginning of stack
> development, this would be small overhead and the undo series could be
> purged when not needed any more.
>
> Added benefit is that the undo states would be persistent. Just make a tool
> bar button that would be clicked (or a message box command, or other
> trigger)
>
> Agreed that this is not the most elegant solution, but it might be better
> than continually saving versions.
Agreed. What I'm looking for (and I suspect Jacque as well) is a way to
store states for any objects. Sometimes this may be stacks, sometimes
it may be a card, sometimes just a group, and sometimes just the text in
a field.
Text editing is apparently tricky, given the broad variance of such
implementation across programs. I've tried to follow the strictest
interpretation of HIG recommendations (anything between deletes is a
single undoable operation), but I must admit I sometimes appreciate
other more atomic models which use returns, selection changes, or even
pauses as the dividing line for undoing typing.
The other tricky thing to keep in mind with Undo/Redo is the need to
maintain separate queues for each open document window. This adds
another layer of complexity, but is necessary for most traditional apps
which allow any number of documents to be open.
For each of those document windows I maintain three arrays: one
describing the action (delete, create, etc.), one containing the data
(for restoring deletions, locations, etc.), and one for a selection
record to restore the selection to its previous state.
I suppose I could pack all of the related data into a single storage
element as XML or some other delimited format, but I try to save clock
cycles where I can and array access is lightning fast.
Using properties may not be a bad idea, and the performance hit over
globals would not likely be noticeable since it's used in one of the
slowest computing contexts possible, response to a user action.
But I've not needed to restore Undo states between sessions, and in
theory there are additional complications in that; there may well be a
good reason so few apps from bigger publishers bother. I can't say I've
considered it deeply enough to have an opinion either way.
Regardless of whether persistent or not, there certainly is a lot of
overhead involved in crafting a good universal Undo/Redo system. While
I'm content to muddle along toward a solid method that ultimately
supports a History palette, the more time I spend on it the more I begin
to see metapatterns to what needs to be done, and increasingly find
myself with the feeling that if I had Mark Waddingham over here at the
loft for a weekend with a couple computers and a really good scotch we
could probably outline some engine-level support to make universal
Undo/Redo simpler and far more efficient.
I have a dream....
--
Richard Gaskin
Fourth World Media Corporation
___________________________________________________________
Ambassador at FourthWorld.com http://www.FourthWorld.com
More information about the use-livecode
mailing list