summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_ops.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-08-10 01:22:45 +0000
committerDavid Robillard <d@drobilla.net>2006-08-10 01:22:45 +0000
commitab6f1ed9bafa869648b6e94ee5186ff317b32c3e (patch)
treed61dba7f9b6f1ae755803afc4b79bcff06a36005 /gtk2_ardour/editor_ops.cc
parent38c7d34d8c449c7ce5f7da9575c24e60c6b31b1a (diff)
Merged with trunk R776
git-svn-id: svn://localhost/ardour2/branches/midi@777 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_ops.cc')
-rw-r--r--gtk2_ardour/editor_ops.cc182
1 files changed, 108 insertions, 74 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index af366e18d0..9b69026a01 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -28,6 +28,7 @@
#include <pbd/error.h>
#include <pbd/basename.h>
#include <pbd/pthread_utils.h>
+#include <pbd/memento_command.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/choice.h>
@@ -209,9 +210,10 @@ Editor::split_regions_at (jack_nframes_t where, RegionSelection& regions)
_new_regionviews_show_envelope = arv->envelope_visible();
if (pl) {
- session->add_undo (pl->get_memento());
+ XMLNode &before = pl->get_state();
pl->split_region ((*a)->region(), where);
- session->add_redo_no_execute (pl->get_memento());
+ XMLNode &after = pl->get_state();
+ session->add_command(new MementoCommand<Playlist>(*pl, before, after));
}
a = tmp;
@@ -231,9 +233,10 @@ Editor::remove_clicked_region ()
Playlist* playlist = clicked_audio_trackview->playlist();
begin_reversible_command (_("remove region"));
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->remove_region (&clicked_regionview->region());
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &after = playlist->get_state();
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, after));
commit_reversible_command ();
}
@@ -406,9 +409,10 @@ Editor::nudge_forward (bool next)
distance = next_distance;
}
- session->add_undo (r.playlist()->get_memento());
+ XMLNode &before = r.playlist()->get_state();
r.set_position (r.position() + distance, this);
- session->add_redo_no_execute (r.playlist()->get_memento());
+ XMLNode &after = r.playlist()->get_state();
+ session->add_command (new MementoCommand<Playlist>(*(r.playlist()), before, after));
}
commit_reversible_command ();
@@ -440,14 +444,15 @@ Editor::nudge_backward (bool next)
distance = next_distance;
}
- session->add_undo (r.playlist()->get_memento());
+ XMLNode &before = r.playlist()->get_state();
if (r.position() > distance) {
r.set_position (r.position() - distance, this);
} else {
r.set_position (0, this);
}
- session->add_redo_no_execute (r.playlist()->get_memento());
+ XMLNode &after = r.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(r.playlist()), before, after));
}
commit_reversible_command ();
@@ -480,9 +485,10 @@ Editor::nudge_forward_capture_offset ()
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
Region& r ((*i)->region());
- session->add_undo (r.playlist()->get_memento());
+ XMLNode &before = r.playlist()->get_state();
r.set_position (r.position() + distance, this);
- session->add_redo_no_execute (r.playlist()->get_memento());
+ XMLNode &after = r.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(r.playlist()), before, after));
}
commit_reversible_command ();
@@ -506,14 +512,15 @@ Editor::nudge_backward_capture_offset ()
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
Region& r ((*i)->region());
- session->add_undo (r.playlist()->get_memento());
+ XMLNode &before = r.playlist()->get_state();
if (r.position() > distance) {
r.set_position (r.position() - distance, this);
} else {
r.set_position (0, this);
}
- session->add_redo_no_execute (r.playlist()->get_memento());
+ XMLNode &after = r.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(r.playlist()), before, after));
}
commit_reversible_command ();
@@ -1290,9 +1297,10 @@ Editor::add_location_from_selection ()
Location *location = new Location (start, end, "selection");
session->begin_reversible_command (_("add marker"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
session->locations()->add (location, true);
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
}
@@ -1303,9 +1311,10 @@ Editor::add_location_from_playhead_cursor ()
Location *location = new Location (where, where, "mark", Location::IsMark);
session->begin_reversible_command (_("add marker"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
session->locations()->add (location, true);
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
}
@@ -1321,9 +1330,10 @@ Editor::add_location_from_audio_region ()
Location *location = new Location (region.position(), region.last_frame(), region.name());
session->begin_reversible_command (_("add marker"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
session->locations()->add (location, true);
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
}
@@ -1739,9 +1749,10 @@ Editor::clear_markers ()
{
if (session) {
session->begin_reversible_command (_("clear markers"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
session->locations()->clear_markers ();
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
}
}
@@ -1751,7 +1762,7 @@ Editor::clear_ranges ()
{
if (session) {
session->begin_reversible_command (_("clear ranges"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
Location * looploc = session->locations()->auto_loop_location();
Location * punchloc = session->locations()->auto_punch_location();
@@ -1761,7 +1772,8 @@ Editor::clear_ranges ()
if (looploc) session->locations()->add (looploc);
if (punchloc) session->locations()->add (punchloc);
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
}
}
@@ -1770,9 +1782,10 @@ void
Editor::clear_locations ()
{
session->begin_reversible_command (_("clear locations"));
- session->add_undo (session->locations()->get_memento());
+ XMLNode &before = session->locations()->get_state();
session->locations()->clear ();
- session->add_redo_no_execute (session->locations()->get_memento());
+ XMLNode &after = session->locations()->get_state();
+ session->add_command(new MementoCommand<Locations>(*(session->locations()), before, after));
session->commit_reversible_command ();
session->locations()->clear ();
}
@@ -1820,9 +1833,9 @@ Editor::insert_region_list_drag (AudioRegion& region, int x, int y)
snap_to (where);
begin_reversible_command (_("insert dragged region"));
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->add_region (*(new AudioRegion (region)), where, 1.0);
- session->add_redo_no_execute (playlist->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, playlist->get_state()));
commit_reversible_command ();
}
@@ -1856,9 +1869,9 @@ Editor::insert_region_list_selection (float times)
Region* region = (*i)[region_list_columns.region];
begin_reversible_command (_("insert region"));
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->add_region (*(createRegion (*region)), edit_cursor->current_frame, times);
- session->add_redo_no_execute (playlist->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, playlist->get_state()));
commit_reversible_command ();
}
@@ -2283,7 +2296,9 @@ Editor::separate_region_from_selection ()
begin_reversible_command (_("separate"));
doing_undo = true;
}
- if (doing_undo) session->add_undo ((playlist)->get_memento());
+ XMLNode *before;
+ if (doing_undo)
+ before = &(playlist->get_state());
/* XXX need to consider musical time selections here at some point */
@@ -2293,7 +2308,8 @@ Editor::separate_region_from_selection ()
playlist->partition ((jack_nframes_t)((*t).start * speed), (jack_nframes_t)((*t).end * speed), true);
}
- if (doing_undo) session->add_redo_no_execute (playlist->get_memento());
+ if (doing_undo)
+ session->add_command(new MementoCommand<Playlist>(*playlist, *before, playlist->get_state()));
}
}
}
@@ -2328,11 +2344,14 @@ Editor::separate_regions_using_location (Location& loc)
if (atv->is_audio_track()) {
if ((playlist = atv->playlist()) != 0) {
+ XMLNode *before;
if (!doing_undo) {
begin_reversible_command (_("separate"));
doing_undo = true;
}
- if (doing_undo) session->add_undo ((playlist)->get_memento());
+ if (doing_undo)
+ before = &(playlist->get_state());
+
/* XXX need to consider musical time selections here at some point */
@@ -2340,7 +2359,8 @@ Editor::separate_regions_using_location (Location& loc)
playlist->partition ((jack_nframes_t)(loc.start() * speed), (jack_nframes_t)(loc.end() * speed), true);
- if (doing_undo) session->add_redo_no_execute (playlist->get_memento());
+ if (doing_undo)
+ session->add_command(new MementoCommand<Playlist>(*playlist, *before, playlist->get_state()));
}
}
}
@@ -2411,9 +2431,10 @@ Editor::crop_region_to_selection ()
end = min (selection->time.end_frame(), start + region->length() - 1);
cnt = end - start + 1;
- session->add_undo ((*i)->get_memento());
+ XMLNode &before = (*i)->get_state();
region->trim_to (start, cnt, this);
- session->add_redo_no_execute ((*i)->get_memento());
+ XMLNode &after = (*i)->get_state();
+ session->add_command (new MementoCommand<Playlist>(*(*i), before, after));
}
commit_reversible_command ();
@@ -2454,9 +2475,9 @@ Editor::region_fill_track ()
return;
}
- session->add_undo (pl->get_memento());
+ XMLNode &before = pl->get_state();
pl->add_region (*(new AudioRegion (*ar)), ar->last_frame(), times);
- session->add_redo_no_execute (pl->get_memento());
+ session->add_command (new MementoCommand<Playlist>(*pl, before, pl->get_state()));
}
commit_reversible_command ();
@@ -2504,9 +2525,9 @@ Editor::region_fill_selection ()
continue;
}
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->add_region (*(createRegion (*region)), start, times);
- session->add_redo_no_execute (playlist->get_memento());
+ session->add_command (new MementoCommand<Playlist>(*playlist, before, playlist->get_state()));
}
commit_reversible_command ();
@@ -2521,9 +2542,10 @@ Editor::set_a_regions_sync_position (Region& region, jack_nframes_t position)
return;
}
begin_reversible_command (_("set region sync position"));
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
region.set_sync_position (position);
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
commit_reversible_command ();
}
@@ -2541,9 +2563,10 @@ Editor::set_region_sync_from_edit_cursor ()
Region& region (clicked_regionview->region());
begin_reversible_command (_("set sync from edit cursor"));
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
region.set_sync_position (edit_cursor->current_frame);
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
commit_reversible_command ();
}
@@ -2553,9 +2576,10 @@ Editor::remove_region_sync ()
if (clicked_regionview) {
Region& region (clicked_regionview->region());
begin_reversible_command (_("remove sync"));
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
region.clear_sync_position ();
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
commit_reversible_command ();
}
}
@@ -2568,9 +2592,10 @@ Editor::naturalize ()
}
begin_reversible_command (_("naturalize"));
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- session->add_undo ((*i)->region().get_memento());
+ XMLNode &before = (*i)->region().get_state();
(*i)->region().move_to_natural_position (this);
- session->add_redo_no_execute ((*i)->region().get_memento());
+ XMLNode &after = (*i)->region().get_state();
+ session->add_command (new MementoCommand<Region>((*i)->region(), before, after));
}
commit_reversible_command ();
}
@@ -2636,7 +2661,7 @@ Editor::align_selection_relative (RegionPoint point, jack_nframes_t position)
Region& region ((*i)->region());
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
if (dir > 0) {
region.set_position (region.position() + distance, this);
@@ -2644,7 +2669,8 @@ Editor::align_selection_relative (RegionPoint point, jack_nframes_t position)
region.set_position (region.position() - distance, this);
}
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
}
@@ -2678,7 +2704,7 @@ Editor::align_region (Region& region, RegionPoint point, jack_nframes_t position
void
Editor::align_region_internal (Region& region, RegionPoint point, jack_nframes_t position)
{
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
switch (point) {
case SyncPoint:
@@ -2696,7 +2722,8 @@ Editor::align_region_internal (Region& region, RegionPoint point, jack_nframes_t
break;
}
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
}
void
@@ -2718,9 +2745,10 @@ Editor::trim_region_to_edit_cursor ()
}
begin_reversible_command (_("trim to edit"));
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
region.trim_end( session_frame_to_track_frame(edit_cursor->current_frame, speed), this);
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
commit_reversible_command ();
}
@@ -2743,9 +2771,10 @@ Editor::trim_region_from_edit_cursor ()
}
begin_reversible_command (_("trim to edit"));
- session->add_undo (region.playlist()->get_memento());
+ XMLNode &before = region.playlist()->get_state();
region.trim_front ( session_frame_to_track_frame(edit_cursor->current_frame, speed), this);
- session->add_redo_no_execute (region.playlist()->get_memento());
+ XMLNode &after = region.playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*(region.playlist()), before, after));
commit_reversible_command ();
}
@@ -2857,9 +2886,10 @@ Editor::bounce_range_selection ()
itt.cancel = false;
itt.progress = false;
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
atv->audio_track()->bounce_range (start, cnt, itt);
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &after = playlist->get_state();
+ session->add_command (new MementoCommand<Playlist> (*playlist, before, after));
}
commit_reversible_command ();
@@ -2977,7 +3007,7 @@ Editor::cut_copy_regions (CutCopyOp op)
insert_result = freezelist.insert (pl);
if (insert_result.second) {
pl->freeze ();
- session->add_undo (pl->get_memento());
+ session->add_command (new MementoUndoCommand<Playlist>(*pl, pl->get_state()));
}
}
}
@@ -3041,7 +3071,7 @@ Editor::cut_copy_regions (CutCopyOp op)
for (set<Playlist*>::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) {
(*pl)->thaw ();
- session->add_redo_no_execute ((*pl)->get_memento());
+ session->add_command (new MementoRedoCommand<Playlist>(*(*pl), (*pl)->get_state()));
}
}
@@ -3154,9 +3184,9 @@ Editor::paste_named_selection (float times)
tmp = chunk;
++tmp;
- session->add_undo (apl->get_memento());
+ XMLNode &before = apl->get_state();
apl->paste (**chunk, edit_cursor->current_frame, times);
- session->add_redo_no_execute (apl->get_memento());
+ session->add_command(new MementoCommand<AudioPlaylist>(*apl, before, apl->get_state()));
if (tmp != ns->playlists.end()) {
chunk = tmp;
@@ -3185,9 +3215,9 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times)
sigc::connection c = atv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
playlist = (*i)->region().playlist();
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->duplicate (r, r.last_frame(), times);
- session->add_redo_no_execute (playlist->get_memento());
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, playlist->get_state()));
c.disconnect ();
@@ -3225,9 +3255,10 @@ Editor::duplicate_selection (float times)
if ((playlist = (*i)->playlist()) == 0) {
continue;
}
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->duplicate (**ri, selection->time[clicked_selection].end, times);
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &after = playlist->get_state();
+ session->add_command (new MementoCommand<Playlist>(*playlist, before, after));
++ri;
if (ri == new_regions.end()) {
@@ -3275,9 +3306,10 @@ void
Editor::clear_playlist (Playlist& playlist)
{
begin_reversible_command (_("clear playlist"));
- session->add_undo (playlist.get_memento());
+ XMLNode &before = playlist.get_state();
playlist.clear ();
- session->add_redo_no_execute (playlist.get_memento());
+ XMLNode &after = playlist.get_state();
+ session->add_command (new MementoCommand<Playlist>(playlist, before, after));
commit_reversible_command ();
}
@@ -3311,9 +3343,10 @@ Editor::nudge_track (bool use_edit_cursor, bool forwards)
continue;
}
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->nudge_after (start, distance, forwards);
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &after = playlist->get_state();
+ session->add_command (new MementoCommand<Playlist>(*playlist, before, after));
}
commit_reversible_command ();
@@ -3367,9 +3400,9 @@ Editor::normalize_region ()
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
if (!arv)
continue;
- session->add_undo (arv->region().get_memento());
+ XMLNode &before = arv->region().get_state();
arv->audio_region().normalize_to (0.0f);
- session->add_redo_no_execute (arv->region().get_memento());
+ session->add_command (new MementoCommand<Region>(arv->region(), before, arv->region().get_state()));
}
commit_reversible_command ();
@@ -3394,9 +3427,9 @@ Editor::denormalize_region ()
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
if (!arv)
continue;
- session->add_undo (arv->region().get_memento());
+ XMLNode &before = arv->region().get_state();
arv->audio_region().set_scale_amplitude (1.0f);
- session->add_redo_no_execute (arv->region().get_memento());
+ session->add_command (new MementoCommand<Region>(arv->region(), before, arv->region().get_state()));
}
commit_reversible_command ();
@@ -3440,9 +3473,10 @@ Editor::apply_filter (AudioFilter& filter, string command)
if (arv->audio_region().apply (filter) == 0) {
- session->add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->replace_region (arv->region(), *(filter.results.front()), arv->region().position());
- session->add_redo_no_execute (playlist->get_memento());
+ XMLNode &after = playlist->get_state();
+ session->add_command(new MementoCommand<Playlist>(*playlist, before, after));
} else {
goto out;
}