All the obvious MementoCommand grunt work. Now there's some
add_undo/add_redo_no_execute sprinkled around where one is separated from the
other (e.g. in different callbacks) or perhaps even where there's only an undo
and no redo. Also some sigc-based undo/redo pairs that probably need their own
Command class.
git-svn-id: svn://localhost/ardour2/branches/undo@692 d708f5d6-7413-0410-9779-e7cbd77b26cf
Enum and namespace syntax fixes to satisfy -pedantic
Resolved a couple "code never reached" areas to satisfy -Wextra
git-svn-id: svn://localhost/ardour2/trunk@688 d708f5d6-7413-0410-9779-e7cbd77b26cf
Added mac specific ardour2_mac_ui.rc file
Fixed some memory leaks in add_instant_xml() usage.
Added EXTRA_WARN scons option for pedants.
Reformatted xml++.cc into something that wouldn't drive me insane.
git-svn-id: svn://localhost/ardour2/trunk@686 d708f5d6-7413-0410-9779-e7cbd77b26cf
This is the first swath of changes, replacing add_undo with MementoCommand
pattern, through most of the editor_mouse.cc file. However there were a few
places that weren't symmetrical that I need to think about. The question is
whether to tweak things so that they are symmetrical (add_undo paired with
add_redo*), or to allow Commands to not be undoable or not be redoable. Your
thoughts are welcome.
git-svn-id: svn://localhost/ardour2/branches/undo@685 d708f5d6-7413-0410-9779-e7cbd77b26cf
I just had an epiphany. I tried so many ways to make saving function name and
args work, it never occured to me that you could just as easily save undo
information as a pair of mementos, even in the Command-based structure we
agreed on.
Since many (read: almost all) existing undo commands take this form:
begin_reversible_command (_("change fade in length"));
session->add_undo (arv->region.get_memento());
arv->region.set_fade_in_length (fade_length);
session->add_redo_no_execute (arv->region.get_memento());
commit_reversible_command ();
We are already doing the save a memento before and after work. All we need to
do is instantiate an appropriate instance of MementoCommand. So the above
becomes:
begin_reversible_command (_("change fade in length"));
MementoCommand<arv_region_t, arv_region_memento_t> before, after;
before = arv->region.get_memento();
arv->region.set_fade_in_length (fade_length);
after = arv->region.get_memento();
session->add_command(arv->region, before, after);
commit_reversible_command ();
(With apologies for being too lazy to go look up what arv_region_t and
arv_region_memento_t are)
Note that the true command approach is still possible, and encouraged (both by
dictate and design).
git-svn-id: svn://localhost/ardour2/branches/undo@680 d708f5d6-7413-0410-9779-e7cbd77b26cf
Renamed pbd3 back to pbd, since it's version 4.1 now.
Very minor fixes
git-svn-id: svn://localhost/ardour2/trunk@656 d708f5d6-7413-0410-9779-e7cbd77b26cf
Coding for undo/redo starts in earnest. Paul and I decided to go with a
standard gang of four Command pattern, with serialization. This overcomes the
terrible difficulties we were having with static type checking and the sigc++
approach. I'm adding the requirement that each command support undo,
simplifying undo/redo. NOTE that an important fallout here is that
Command::operator()() is the opposite of the old UndoAction::operator()(), i.e.
Command::operator()() is execute/redo, and Command::undo() is undo.
This commit is a reworking of the infrastructure, and won't compile until
creating Command subclasses for the various commands being performed. That is
primarily where you find get_memento and/or calls to add_(undo|redo.*).
git-svn-id: svn://localhost/ardour2/branches/undo@655 d708f5d6-7413-0410-9779-e7cbd77b26cf