r189@gandalf: fugalh | 2006-07-18 17:54:25 -0600

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
This commit is contained in:
Hans Fugal
2006-07-18 23:54:31 +00:00
parent d819b922e1
commit 55159005b9
3 changed files with 69 additions and 38 deletions

View File

@@ -1812,9 +1812,15 @@ Editor::fade_in_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* even
}
begin_reversible_command (_("change fade in length"));
session->add_undo (arv->region.get_memento());
XMLNode &before, &after;
before = arv->region.get_state();
arv->region.set_fade_in_length (fade_length);
session->add_redo_no_execute (arv->region.get_memento());
after = arv->region.get_state();
session->add_command(MementoCommand<ARDOUR::AudioRegion>(arv->region,
before,
after));
commit_reversible_command ();
fade_in_drag_motion_callback (item, event);
}
@@ -1904,9 +1910,13 @@ Editor::fade_out_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* eve
}
begin_reversible_command (_("change fade out length"));
session->add_undo (arv->region.get_memento());
XMLNode &before, &after;
before = arv->region.get_state();
arv->region.set_fade_out_length (fade_length);
session->add_redo_no_execute (arv->region.get_memento());
after = arv->region.get_state();
session->add_command(MementoCommand<ARDOUR::AudioRegion>(arv->region, before, after));
commit_reversible_command ();
fade_out_drag_motion_callback (item, event);
@@ -2140,7 +2150,8 @@ Editor::marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
begin_reversible_command ( _("move marker") );
session->add_undo( session->locations()->get_memento() );
XMLNode &before, &after;
before = session->locations()->get_state();
Location * location = find_location_from_marker (marker, is_start);
@@ -2148,7 +2159,8 @@ Editor::marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
location->set (drag_info.copied_location->start(), drag_info.copied_location->end());
}
session->add_redo_no_execute( session->locations()->get_memento() );
after = session->locations()->get_state();
session->add_command(MementoCommand<Locations>(session->locations(), before, after));
commit_reversible_command ();
marker_drag_line->hide();
@@ -2260,11 +2272,14 @@ Editor::meter_marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent*
TempoMap& map (session->tempo_map());
map.bbt_time (drag_info.last_pointer_frame, when);
XMLNode &before, &after;
if (drag_info.copy == true) {
begin_reversible_command (_("copy meter mark"));
session->add_undo (map.get_memento());
before = map.get_state();
map.add_meter (marker->meter(), when);
session->add_redo_no_execute (map.get_memento());
after = map.get_state();
session->add_command(MementoCommand<TempoMap>(map, before, after));
commit_reversible_command ();
// delete the dummy marker we used for visual representation of copying.
@@ -2272,9 +2287,10 @@ Editor::meter_marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent*
delete marker;
} else {
begin_reversible_command (_("move meter mark"));
session->add_undo (map.get_memento());
before = map.get_state();
map.move_meter (marker->meter(), when);
session->add_redo_no_execute (map.get_memento());
after = map.get_state();
session->add_command(MementoCommand<TempoMap>(map, before, after));
commit_reversible_command ();
}
}
@@ -2389,12 +2405,15 @@ Editor::tempo_marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent*
TempoMap& map (session->tempo_map());
map.bbt_time (drag_info.last_pointer_frame, when);
XMLNode &before, &after;
if (drag_info.copy == true) {
begin_reversible_command (_("copy tempo mark"));
session->add_undo (map.get_memento());
before = map.get_state();
map.add_tempo (marker->tempo(), when);
session->add_redo_no_execute (map.get_memento());
after = map.get_state();
session->add_command (MementoCommand<TempoMap>(map, before, after));
commit_reversible_command ();
// delete the dummy marker we used for visual representation of copying.
@@ -2402,9 +2421,10 @@ Editor::tempo_marker_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent*
delete marker;
} else {
begin_reversible_command (_("move tempo mark"));
session->add_undo (map.get_memento());
before = map.get_state();
map.move_tempo (marker->tempo(), when);
session->add_redo_no_execute (map.get_memento());
after = map.get_state();
session->add_command (MementoCommand<TempoMap>(map, before, after));
commit_reversible_command ();
}
}
@@ -3610,9 +3630,10 @@ Editor::start_selection_grab (ArdourCanvas::Item* item, GdkEvent* event)
Playlist* playlist = clicked_trackview->playlist();
session->add_undo (playlist->get_memento ());
before = playlist->get_state();
clicked_trackview->playlist()->add_region (*region, selection->time[clicked_selection].start);
session->add_redo_no_execute (playlist->get_memento ());
after = playlist->get_state();
session->add_command(MementoCommand<Playlist>(*playlist, before, after));
commit_reversible_command ();
@@ -4200,18 +4221,24 @@ Editor::point_trim (GdkEvent* event)
i != selection->audio_regions.by_layer().end(); ++i)
{
if (!(*i)->region.locked()) {
session->add_undo ((*i)->region.playlist()->get_memento());
XMLNode &before, &after;
Playlist *pl = (*i)->region.playlist();
before = pl->get_state();
(*i)->region.trim_front (new_bound, this);
session->add_redo_no_execute ((*i)->region.playlist()->get_memento());
after = pl->get_state();
session->add_command(MementoCommand<Playlist>(*pl, before, after));
}
}
} else {
if (!rv->region.locked()) {
session->add_undo (rv->region.playlist()->get_memento());
XMLNode &before, &after;
Playlist *pl = rv->region.playlist();
before = pl->get_state();
rv->region.trim_front (new_bound, this);
session->add_redo_no_execute (rv->region.playlist()->get_memento());
after = pl->get_state();
session->add_command(MementoCommand<Playlist>(*pl, before, after));
}
}
@@ -4227,18 +4254,24 @@ Editor::point_trim (GdkEvent* event)
for (list<AudioRegionView*>::const_iterator i = selection->audio_regions.by_layer().begin(); i != selection->audio_regions.by_layer().end(); ++i)
{
if (!(*i)->region.locked()) {
session->add_undo ((*i)->region.playlist()->get_memento());
XMLNode &before, &after;
Playlist *pl = (*i)->region.playlist();
before = pl->get_state();
(*i)->region.trim_end (new_bound, this);
session->add_redo_no_execute ((*i)->region.playlist()->get_memento());
after = pl->get_state();
session->add_command(MementoCommand<Playlist>(*pl, before, after));
}
}
} else {
if (!rv->region.locked()) {
session->add_undo (rv->region.playlist()->get_memento());
XMLNode &before, &after;
Playlist *pl = rv->region.playlist();
before = pl->get_state();
rv->region.trim_end (new_bound, this);
session->add_redo_no_execute (rv->region.playlist()->get_memento());
after = pl->get_state();
session->add_command (MementoCommand<Playlist>(*pl, before, after));
}
}
@@ -4398,10 +4431,12 @@ Editor::end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
switch (range_marker_op) {
case CreateRangeMarker:
begin_reversible_command (_("new range marker"));
session->add_undo (session->locations()->get_memento());
XMLNode &before, &after;
before = session->locations()->get_state();
newloc = new Location(temp_location->start(), temp_location->end(), "unnamed", Location::IsRangeMarker);
session->locations()->add (newloc, true);
session->add_redo_no_execute (session->locations()->get_memento());
after = session->locations()->get_state();
session->add_command(MementoCommand<Locations>(session->locations(), before, after));
commit_reversible_command ();
range_bar_drag_rect->hide();
@@ -4776,9 +4811,11 @@ Editor::mouse_brush_insert_region (AudioRegionView* rv, jack_nframes_t pos)
Playlist* playlist = atv->playlist();
double speed = atv->get_diskstream()->speed();
session->add_undo (playlist->get_memento());
XMLNode &before, &after;
before = playlist->get_state();
playlist->add_region (*(new AudioRegion (rv->region)), (jack_nframes_t) (pos * speed));
session->add_redo_no_execute (playlist->get_memento());
after = playlist->get_state();
session->add_command(MementoCommand<Playlist>(*playlist, before, after));
// playlist is frozen, so we have to update manually

View File

@@ -844,14 +844,8 @@ class Session : public sigc::trackable, public Stateful
void begin_reversible_command (string cmd_name);
void commit_reversible_command (Command* cmd = 0);
void add_undo (const UndoAction& ua) {
current_trans.add_undo (ua);
}
void add_redo (const UndoAction& ua) {
current_trans.add_redo (ua);
}
void add_redo_no_execute (const UndoAction& ua) {
current_trans.add_redo_no_execute (ua);
void add_command (const Command& cmd) {
current_trans.add_command (cmd);
}
UndoAction global_solo_memento (void *src);

View File

@@ -37,8 +37,8 @@ class MementoCommand : public Command
XMLNode &after
)
: obj(obj), before(before), after(after) {}
void operator() () { obj.set_memento(after); }
void undo() { obj.set_memento(before); }
void operator() () { obj.set_state(after); }
void undo() { obj.set_state(before); }
virtual XMLNode &serialize()
{
// obj.id