From 17088ee3ea5af1e6174b098bb5bcfdaec6ebf9b0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 2 Mar 2010 18:05:26 +0000 Subject: (1) remove most uses of MementoCommand for Playlist and Region (2) move frozen state from Region into Stateful, renamed "suspend property changes" (3) successive changes to a Property (scalar) after clear_history() do not keep resetting the old value (fixes region trim) git-svn-id: svn://localhost/ardour2/branches/3.0@6720 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_region_editor.cc | 26 ++-- gtk2_ardour/audio_region_view.cc | 10 +- gtk2_ardour/audio_streamview.cc | 8 +- gtk2_ardour/editor_audio_import.cc | 5 +- gtk2_ardour/editor_drag.cc | 14 +-- gtk2_ardour/editor_keyboard.cc | 19 ++- gtk2_ardour/editor_mouse.cc | 41 +++---- gtk2_ardour/editor_ops.cc | 235 ++++++++++++++++--------------------- gtk2_ardour/editor_timefx.cc | 11 +- gtk2_ardour/midi_region_view.cc | 5 +- gtk2_ardour/midi_streamview.cc | 8 +- gtk2_ardour/midi_time_axis.cc | 6 +- gtk2_ardour/region_gain_line.cc | 8 +- 13 files changed, 174 insertions(+), 222 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc index e246c04391..adbb1e04ea 100644 --- a/gtk2_ardour/audio_region_editor.cc +++ b/gtk2_ardour/audio_region_editor.cc @@ -18,6 +18,7 @@ */ #include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" #include "ardour/session.h" #include "ardour/audioregion.h" @@ -256,10 +257,9 @@ AudioRegionEditor::position_clock_changed () boost::shared_ptr pl = _region->playlist(); if (pl) { - XMLNode &before = pl->get_state(); + _region->clear_history (); _region->set_position (position_clock.current_time(), this); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl, &before, &after)); + _session->add_command(new StatefulDiffCommand (_region)); } _session->commit_reversible_command (); @@ -273,10 +273,9 @@ AudioRegionEditor::end_clock_changed () boost::shared_ptr pl = _region->playlist(); if (pl) { - XMLNode &before = pl->get_state(); + _region->clear_history (); _region->trim_end (end_clock.current_time(), this); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl, &before, &after)); + _session->add_command(new StatefulDiffCommand (_region)); } _session->commit_reversible_command (); @@ -294,10 +293,9 @@ AudioRegionEditor::length_clock_changed () boost::shared_ptr pl = _region->playlist(); if (pl) { - XMLNode &before = pl->get_state(); + _region->clear_history (); _region->trim_end (_region->position() + frames - 1, this); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl, &before, &after)); + _session->add_command(new StatefulDiffCommand (_region)); } _session->commit_reversible_command (); @@ -404,10 +402,9 @@ AudioRegionEditor::sync_offset_absolute_clock_changed () { _session->begin_reversible_command (_("change region sync point")); - XMLNode& before = _region->get_state (); + _region->clear_history (); _region->set_sync_position (sync_offset_absolute_clock.current_time()); - XMLNode& after = _region->get_state (); - _session->add_command (new MementoCommand (*_region.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (_region)); _session->commit_reversible_command (); } @@ -417,10 +414,9 @@ AudioRegionEditor::sync_offset_relative_clock_changed () { _session->begin_reversible_command (_("change region sync point")); - XMLNode& before = _region->get_state (); + _region->clear_history (); _region->set_sync_position (sync_offset_relative_clock.current_time() + _region->position ()); - XMLNode& after = _region->get_state (); - _session->add_command (new MementoCommand (*_region.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (_region)); _session->commit_reversible_command (); } diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 438867c9dc..7a0e76606e 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -267,8 +267,8 @@ AudioRegionView::audio_region() const void AudioRegionView::region_changed (const PropertyChange& what_changed) { - ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed) - //cerr << "AudioRegionView::region_changed() called" << endl; + ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed); + // cerr << "AudioRegionView::region_changed() called" << endl; RegionView::region_changed (what_changed); @@ -276,7 +276,7 @@ AudioRegionView::region_changed (const PropertyChange& what_changed) region_scale_amplitude_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_in)) { - fade_in_changed (); + fade_in_changed (); } if (what_changed.contains (ARDOUR::Properties::fade_out)) { fade_out_changed (); @@ -1022,6 +1022,10 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev) gain_line->view_to_model_coord (x, y); + /* XXX STATEFUL: can't convert to stateful diff until we + can represent automation data with it. + */ + trackview.session()->begin_reversible_command (_("add gain control point")); XMLNode &before = audio_region()->envelope()->get_state(); diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 640120516c..ac95bf63c2 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -660,10 +660,10 @@ AudioStreamView::update_rec_regions () if (nlen != region->length()) { - region->freeze (); + region->suspend_property_changes (); region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); region->set_length (nlen, this); - region->thaw (); + region->resume_property_changes (); if (origlen == 1) { /* our special initial length */ @@ -685,10 +685,10 @@ AudioStreamView::update_rec_regions () if (region->source_length(0) >= region->start() + nlen) { - region->freeze (); + region->suspend_property_changes (); region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); region->set_length (nlen, this); - region->thaw (); + region->resume_property_changes (); if (origlen == 1) { /* our special initial length */ diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 05056f3829..201659d7b4 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -29,6 +29,7 @@ #include "pbd/pthread_utils.h" #include "pbd/basename.h" #include "pbd/shortpath.h" +#include "pbd/stateful_diff_command.h" #include @@ -840,9 +841,9 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, uint32_t boost::shared_ptr playlist = existing_track->diskstream()->playlist(); boost::shared_ptr copy (RegionFactory::create (region, region->properties())); begin_reversible_command (_("insert file")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region (copy, pos); - _session->add_command (new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command (new StatefulDiffCommand (playlist)); commit_reversible_command (); break; } diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 2922ad19bb..cd6e5148f6 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1425,9 +1425,9 @@ RegionInsertDrag::finished (GdkEvent* /*event*/, bool /*movement_occurred*/) boost::shared_ptr playlist = dest_rtv->playlist(); _editor->begin_reversible_command (_("insert region")); - XMLNode& before = playlist->get_state (); + playlist->clear_history (); playlist->add_region (_primary->region (), _last_frame_position); - _editor->session()->add_command (new MementoCommand (*playlist, &before, &playlist->get_state())); + _editor->session()->add_command (new StatefulDiffCommand (playlist)); _editor->commit_reversible_command (); delete _primary; @@ -1772,7 +1772,8 @@ TrimDrag::motion (GdkEvent* event, bool first_move) for (list::const_iterator i = _views.begin(); i != _views.end(); ++i) { (*i)->fake_set_opaque(false); - (*i)->region()->freeze (); + (*i)->region()->clear_history (); + (*i)->region()->suspend_property_changes (); AudioRegionView* const arv = dynamic_cast(*i); @@ -1784,7 +1785,6 @@ TrimDrag::motion (GdkEvent* event, bool first_move) insert_result = _editor->motion_frozen_playlists.insert (pl); if (insert_result.second) { - _editor->session()->add_command(new MementoCommand(*pl, &pl->get_state(), 0)); pl->freeze(); } } @@ -1867,13 +1867,13 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred) for (list::const_iterator i = _views.begin(); i != _views.end(); ++i) { _editor->thaw_region_after_trim (**i); (*i)->fake_set_opaque (true); + if (_have_transaction) { + _editor->session()->add_command (new StatefulDiffCommand ((*i)->region())); + } } } for (set >::iterator p = _editor->motion_frozen_playlists.begin(); p != _editor->motion_frozen_playlists.end(); ++p) { (*p)->thaw (); - if (_have_transaction) { - _editor->session()->add_command (new MementoCommand(*(*p).get(), 0, &(*p)->get_state())); - } } _editor->motion_frozen_playlists.clear (); diff --git a/gtk2_ardour/editor_keyboard.cc b/gtk2_ardour/editor_keyboard.cc index ea40b43f50..e6936232cd 100644 --- a/gtk2_ardour/editor_keyboard.cc +++ b/gtk2_ardour/editor_keyboard.cc @@ -17,13 +17,14 @@ */ +#include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" + #include "ardour/audioregion.h" #include "ardour/playlist.h" #include "ardour/session.h" #include "ardour/location.h" -#include "pbd/memento_command.h" - #include "editor.h" #include "region_view.h" #include "selection.h" @@ -33,6 +34,7 @@ #include "i18n.h" using namespace ARDOUR; +using namespace PBD; void Editor::kbd_driver (sigc::slot theslot, bool use_track_canvas, bool use_time_canvas, bool can_select) @@ -89,11 +91,9 @@ Editor::kbd_mute_unmute_region () for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - XMLNode &before = (*i)->region()->playlist()->get_state (); + (*i)->region()->playlist()->clear_history (); (*i)->region()->set_muted (!(*i)->region()->muted ()); - XMLNode &after = (*i)->region()->playlist()->get_state (); - - _session->add_command (new MementoCommand(*((*i)->region()->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand ((*i)->region()->playlist())); } @@ -102,12 +102,9 @@ Editor::kbd_mute_unmute_region () } else if (entered_regionview) { begin_reversible_command (_("mute region")); - XMLNode &before = entered_regionview->region()->playlist()->get_state(); - + entered_regionview->region()->playlist()->clear_history (); entered_regionview->region()->set_muted (!entered_regionview->region()->muted()); - - XMLNode &after = entered_regionview->region()->playlist()->get_state(); - _session->add_command (new MementoCommand(*(entered_regionview->region()->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand (entered_regionview->region()->playlist())); commit_reversible_command(); } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 5820218a2a..ee28ff6804 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -31,6 +31,7 @@ #include #include "pbd/memento_command.h" #include "pbd/basename.h" +#include "pbd/stateful_diff_command.h" #include "ardour_ui.h" #include "actions.h" @@ -2287,23 +2288,17 @@ Editor::point_trim (GdkEvent* event, nframes64_t new_bound) } if (!(*i)->region()->locked()) { - boost::shared_ptr pl = (*i)->region()->playlist(); - XMLNode &before = pl->get_state(); - + (*i)->region()->clear_history (); (*i)->region()->trim_front (new_bound, this); - - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } } } else { if (!rv->region()->locked()) { - boost::shared_ptr pl = rv->region()->playlist(); - XMLNode &before = pl->get_state(); + rv->region()->clear_history (); rv->region()->trim_front (new_bound, this); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } } @@ -2318,22 +2313,18 @@ Editor::point_trim (GdkEvent* event, nframes64_t new_bound) for (list::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) { if (!(*i)->region()->locked()) { - boost::shared_ptr pl = (*i)->region()->playlist(); - XMLNode &before = pl->get_state(); + (*i)->region()->clear_history(); (*i)->region()->trim_end (new_bound, this); - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl.get(), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } } } else { if (!rv->region()->locked()) { - boost::shared_ptr pl = rv->region()->playlist(); - XMLNode &before = pl->get_state(); + rv->region()->clear_history (); rv->region()->trim_end (new_bound, this); - XMLNode &after = pl->get_state(); - _session->add_command (new MementoCommand(*pl.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (rv->region())); } } @@ -2354,7 +2345,7 @@ Editor::thaw_region_after_trim (RegionView& rv) return; } - region->thaw (); + region->resume_property_changes (); AudioRegionView* arv = dynamic_cast(&rv); @@ -2453,11 +2444,10 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos) boost::shared_ptr playlist = rtv->playlist(); double speed = rtv->get_diskstream()->speed(); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); boost::shared_ptr new_region (RegionFactory::create (rv->region())); - playlist->add_region (new_region, (nframes64_t) (pos * speed)); - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist.get(), &before, &after)); + playlist->add_region (new_region, (nframes64_t) (pos * speed)); + _session->add_command (new StatefulDiffCommand (playlist)); // playlist is frozen, so we have to update manually XXX this is disgusting @@ -2560,10 +2550,9 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) boost::shared_ptr playlist = clicked_axisview->playlist(); - XMLNode *before = &(playlist->get_state()); + playlist->clear_history (); clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start); - XMLNode *after = &(playlist->get_state()); - _session->add_command(new MementoCommand(*playlist, before, after)); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c3800b21fb..6eaf1fb41a 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -323,10 +323,9 @@ Editor::nudge_forward (bool next, bool force_playhead) distance = next_distance; } - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (r->position() + distance, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command (new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -403,16 +402,15 @@ Editor::nudge_backward (bool next, bool force_playhead) if (next) { distance = next_distance; } - - XMLNode &before = r->playlist()->get_state(); + + r->clear_history (); if (r->position() > distance) { r->set_position (r->position() - distance, this); } else { r->set_position (0, this); } - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command (new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -493,10 +491,9 @@ Editor::nudge_forward_capture_offset () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { boost::shared_ptr r ((*i)->region()); - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (r->position() + distance, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -523,15 +520,14 @@ Editor::nudge_backward_capture_offset () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { boost::shared_ptr r ((*i)->region()); - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); if (r->position() > distance) { r->set_position (r->position() - distance, this); } else { r->set_position (0, this); } - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); } commit_reversible_command (); @@ -2225,9 +2221,9 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) snap_to (where); begin_reversible_command (_("insert dragged region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region (RegionFactory::create (region), where, 1.0); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -2303,9 +2299,9 @@ Editor::insert_region_list_selection (float times) } begin_reversible_command (_("insert region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -2818,11 +2814,7 @@ Editor::separate_regions_between (const TimeSelection& ts) if ((playlist = rtv->playlist()) != 0) { - XMLNode *before; - bool got_some; - - before = &(playlist->get_state()); - got_some = false; + playlist->clear_history (); /* XXX need to consider musical time selections here at some point */ @@ -2842,25 +2834,18 @@ Editor::separate_regions_between (const TimeSelection& ts) if (!latest_regionviews.empty()) { - got_some = true; - rtv->view()->foreach_regionview (sigc::bind ( sigc::ptr_fun (add_if_covered), &(*t), &new_selection)); - + if (!in_command) { begin_reversible_command (_("separate")); in_command = true; } - _session->add_command(new MementoCommand( - *playlist, before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); } } - - if (!got_some) { - delete before; - } } } } @@ -3022,10 +3007,9 @@ Editor::crop_region_to (nframes64_t start, nframes64_t end) the_end = min (end, the_end); cnt = the_end - the_start + 1; - XMLNode &before = (*i)->get_state(); + region->clear_history (); region->trim_to (the_start, cnt, this); - XMLNode &after = (*i)->get_state(); - _session->add_command (new MementoCommand(*(*i), &before, &after)); + _session->add_command (new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -3063,9 +3047,9 @@ Editor::region_fill_track () return; } - XMLNode &before = pl->get_state(); + pl->clear_history (); pl->add_region (RegionFactory::create (region), region->last_frame(), times); - _session->add_command (new MementoCommand(*pl, &before, &pl->get_state())); + _session->add_command (new StatefulDiffCommand (pl)); } commit_reversible_command (); @@ -3107,9 +3091,9 @@ Editor::region_fill_selection () continue; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->add_region (RegionFactory::create (region), start, times); - _session->add_command (new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -3142,10 +3126,9 @@ Editor::set_sync_point (nframes64_t where, const RegionSelection& rs) in_command = true; } - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); region->set_sync_position (where); - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } if (in_command) { @@ -3168,10 +3151,9 @@ Editor::remove_region_sync () begin_reversible_command (_("remove sync")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - XMLNode &before = (*i)->region()->playlist()->get_state(); + (*i)->region()->clear_history (); (*i)->region()->clear_sync_position (); - XMLNode &after = (*i)->region()->playlist()->get_state(); - _session->add_command(new MementoCommand(*((*i)->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand ((*i)->region())); } commit_reversible_command (); } @@ -3290,10 +3272,9 @@ Editor::align_selection_relative (RegionPoint point, nframes64_t position, const /* move first one specially */ - XMLNode &before = r->playlist()->get_state(); + r->clear_history (); r->set_position (pos, this); - XMLNode &after = r->playlist()->get_state(); - _session->add_command(new MementoCommand(*(r->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (r)); /* move rest by the same amount */ @@ -3303,16 +3284,15 @@ Editor::align_selection_relative (RegionPoint point, nframes64_t position, const boost::shared_ptr region ((*i)->region()); - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); if (dir > 0) { region->set_position (region->position() + distance, this); } else { region->set_position (region->position() - distance, this); } - - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + + _session->add_command(new StatefulDiffCommand (region)); } @@ -3346,7 +3326,7 @@ Editor::align_region (boost::shared_ptr region, RegionPoint point, nfram void Editor::align_region_internal (boost::shared_ptr region, RegionPoint point, nframes64_t position) { - XMLNode &before = region->playlist()->get_state(); + region->clear_history (); switch (point) { case SyncPoint: @@ -3364,8 +3344,7 @@ Editor::align_region_internal (boost::shared_ptr region, RegionPoint poi break; } - XMLNode &after = region->playlist()->get_state(); - _session->add_command(new MementoCommand(*(region->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } void @@ -3396,15 +3375,13 @@ Editor::trim_region (bool front) for (list::const_iterator i = rs.by_layer().begin(); i != rs.by_layer().end(); ++i) { if (!(*i)->region()->locked()) { - boost::shared_ptr pl = (*i)->region()->playlist(); - XMLNode &before = pl->get_state(); + (*i)->region()->clear_history (); if (front) { (*i)->region()->trim_front (where, this); } else { (*i)->region()->trim_end (where, this); } - XMLNode &after = pl->get_state(); - _session->add_command(new MementoCommand(*pl.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand ((*i)->region())); } } @@ -3466,12 +3443,10 @@ Editor::trim_region_to_location (const Location& loc, const char* str) start = session_frame_to_track_frame (loc.start(), speed); end = session_frame_to_track_frame (loc.end(), speed); - - XMLNode &before = rv->region()->playlist()->get_state(); + + rv->region()->clear_history (); rv->region()->trim_to (start, (end - start), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3507,11 +3482,9 @@ Editor::trim_region_to_edit_point () speed = tav->get_diskstream()->speed(); } - XMLNode &before = rv->region()->playlist()->get_state(); + rv->region()->clear_history (); rv->region()->trim_end (session_frame_to_track_frame(where, speed), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3547,11 +3520,9 @@ Editor::trim_region_from_edit_point () speed = tav->get_diskstream()->speed(); } - XMLNode &before = rv->region()->playlist()->get_state(); + rv->region()->clear_history (); rv->region()->trim_front (session_frame_to_track_frame(where, speed), this); - XMLNode &after = rv->region()->playlist()->get_state(); - _session->add_command(new MementoCommand( - *(rv->region()->playlist()), &before, &after)); + _session->add_command(new StatefulDiffCommand (rv->region())); } commit_reversible_command (); @@ -3604,7 +3575,7 @@ Editor::trim_to_region(bool forward) boost::shared_ptr region = arv->region(); boost::shared_ptr playlist (region->playlist()); - XMLNode &before = playlist->get_state(); + region->clear_history (); if(forward){ @@ -3630,8 +3601,7 @@ Editor::trim_to_region(bool forward) arv->region_changed (ARDOUR::bounds_change); } - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -3658,7 +3628,7 @@ Editor::_freeze_thread (void* arg) void* Editor::freeze_thread () { - clicked_routeview->audio_track()->freeze (*current_interthread_info); + clicked_routeview->audio_track()->freeze_me (*current_interthread_info); current_interthread_info->done = true; return 0; } @@ -3747,7 +3717,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) itt.cancel = false; itt.progress = false; - XMLNode &before = playlist->get_state(); + playlist->clear_history (); boost::shared_ptr r = rtv->track()->bounce_range (start, start+cnt, itt, enable_processing); if (replace) { @@ -3757,8 +3727,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing) playlist->add_region (r, start); } - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand (*playlist, &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); } commit_reversible_command (); @@ -3994,10 +3963,9 @@ Editor::remove_clicked_region () boost::shared_ptr playlist = clicked_routeview->playlist(); begin_reversible_command (_("remove region")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->remove_region (clicked_regionview->region()); - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -4034,7 +4002,7 @@ Editor::remove_selected_regions () regions_to_remove.push_back ((*i)->region()); } - vector playlists; + vector > playlists; for (list >::iterator rl = regions_to_remove.begin(); rl != regions_to_remove.end(); ++rl) { @@ -4045,33 +4013,31 @@ Editor::remove_selected_regions () continue; } - vector::iterator i; + vector >::iterator i; - //only take state if this is a new playlist. + //only prep history if this is a new playlist. for (i = playlists.begin(); i != playlists.end(); ++i) { - if ((*i).playlist == playlist) { + if ((*i) == playlist) { break; } } if (i == playlists.end()) { - PlaylistState before; - before.playlist = playlist; - before.before = &playlist->get_state(); - + playlist->clear_history (); playlist->freeze (); - playlists.push_back(before); + + playlists.push_back (playlist); } playlist->remove_region (*rl); } - vector::iterator pl; + vector >::iterator pl; for (pl = playlists.begin(); pl != playlists.end(); ++pl) { - (*pl).playlist->thaw (); - _session->add_command(new MementoCommand(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state())); + (*pl)->thaw (); + _session->add_command(new StatefulDiffCommand (*pl)); } commit_reversible_command (); @@ -4351,9 +4317,9 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times) sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view)); playlist = (*i)->region()->playlist(); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->duplicate (r, end_frame + (r->first_frame() - start_frame) + 1, times); - _session->add_command(new MementoCommand(*playlist, &before, &playlist->get_state())); + _session->add_command(new StatefulDiffCommand (playlist)); c.disconnect (); @@ -4392,10 +4358,9 @@ Editor::duplicate_selection (float times) if ((playlist = (*i)->playlist()) == 0) { continue; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->duplicate (*ri, selection->time[clicked_selection].end, times); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist, &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); ++ri; if (ri == new_regions.end()) { @@ -4439,10 +4404,9 @@ void Editor::clear_playlist (boost::shared_ptr playlist) { begin_reversible_command (_("clear playlist")); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->clear (); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist.get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -4476,6 +4440,9 @@ Editor::nudge_track (bool use_edit, bool forwards) continue; } + /* XXX STATEFUL this won't capture region moves if don't as a stateful diff + */ + XMLNode &before = playlist->get_state(); playlist->nudge_after (start, distance, forwards); XMLNode &after = playlist->get_state(); @@ -4555,9 +4522,10 @@ Editor::normalize_region () AudioRegionView* const arv = dynamic_cast(*r); if (!arv) continue; - XMLNode &before = arv->region()->get_state(); + arv->region()->clear_history (); arv->audio_region()->normalize_to (spin.get_value()); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); + } commit_reversible_command (); @@ -4588,9 +4556,9 @@ Editor::reset_region_scale_amplitude () AudioRegionView* const arv = dynamic_cast(*r); if (!arv) continue; - XMLNode &before = arv->region()->get_state(); + arv->region()->clear_history (); arv->audio_region()->set_scale_amplitude (1.0f); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); } commit_reversible_command (); @@ -4615,10 +4583,12 @@ Editor::adjust_region_scale_amplitude (bool up) for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast(*r); - if (!arv) + if (!arv) { continue; - XMLNode &before = arv->region()->get_state(); + } + arv->region()->clear_history (); + double fraction = gain_to_slider_position (arv->audio_region()->scale_amplitude ()); if (up) { @@ -4640,7 +4610,7 @@ Editor::adjust_region_scale_amplitude (bool up) } arv->audio_region()->set_scale_amplitude (fraction); - _session->add_command (new MementoCommand(*(arv->region().get()), &before, &arv->region()->get_state())); + _session->add_command (new StatefulDiffCommand (arv->region())); } commit_reversible_command (); @@ -4786,8 +4756,8 @@ Editor::apply_filter (Filter& filter, string command) if (arv->audio_region()->apply (filter) == 0) { - XMLNode &before = playlist->get_state(); - + playlist->clear_history (); + if (filter.results.empty ()) { /* no regions returned; remove the old one */ @@ -4809,8 +4779,7 @@ Editor::apply_filter (Filter& filter, string command) } - XMLNode &after = playlist->get_state(); - _session->add_command(new MementoCommand(*playlist, &before, &after)); + _session->add_command(new StatefulDiffCommand (playlist)); } else { goto out; } @@ -4918,10 +4887,9 @@ Editor::toggle_gain_envelope_visibility () for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { AudioRegionView* const arv = dynamic_cast(*i); if (arv) { - XMLNode &before = arv->region()->get_state (); + arv->region()->clear_history (); arv->set_envelope_visible (!arv->envelope_visible()); - XMLNode &after = arv->region()->get_state (); - _session->add_command (new MementoCommand (*(arv->region().get()), &before, &after)); + _session->add_command (new StatefulDiffCommand (arv->region())); } } @@ -4983,10 +4951,9 @@ Editor::set_region_lock_style (Region::PositionLockStyle ps) _session->begin_reversible_command (_("region lock style")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - XMLNode &before = (*i)->region()->get_state (); + (*i)->region()->clear_history (); (*i)->region()->set_position_lock_style (ps); - XMLNode &after = (*i)->region()->get_state (); - _session->add_command (new MementoCommand (*((*i)->region().get()), &before, &after)); + _session->add_command (new StatefulDiffCommand ((*i)->region())); } _session->commit_reversible_command (); @@ -5165,14 +5132,15 @@ Editor::toggle_fade_active (bool in) have_switch = true; } - XMLNode &before = region->get_state(); + region->clear_history (); + if (in) { region->set_fade_in_active (!yn); } else { region->set_fade_out_active (!yn); } - XMLNode &after = region->get_state(); - _session->add_command(new MementoCommand(*region.get(), &before, &after)); + + _session->add_command(new StatefulDiffCommand (region)); } commit_reversible_command (); @@ -5265,13 +5233,10 @@ Editor::set_fade_in_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - - XMLNode &before = ar->get_state(); - + + ar->clear_history (); ar->set_fade_in_active (yn); - - XMLNode &after = ar->get_state(); - _session->add_command(new MementoCommand(*ar, &before, &after)); + _session->add_command (new StatefulDiffCommand (ar)); } commit_reversible_command (); @@ -5299,12 +5264,9 @@ Editor::set_fade_out_active (bool yn) boost::shared_ptr ar (tmp->audio_region()); - XMLNode &before = ar->get_state(); - + ar->clear_history (); ar->set_fade_out_active (yn); - - XMLNode &after = ar->get_state(); - _session->add_command(new MementoCommand(*ar, &before, &after)); + _session->add_command(new StatefulDiffCommand (ar)); } commit_reversible_command (); @@ -5925,7 +5887,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList nframes64_t pos = r->position(); - XMLNode& before (pl->get_state()); + pl->clear_history (); x = positions.begin(); @@ -6007,9 +5969,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList pl->thaw (); - XMLNode& after (pl->get_state()); - - _session->add_command (new MementoCommand(*pl, &before, &after)); + _session->add_command (new StatefulDiffCommand (pl)); } void @@ -6330,6 +6290,9 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, if (pl) { + /* XXX STATEFUL this won't capture region motion if done as stateful diff + */ + XMLNode &before = pl->get_state(); if (opt == SplitIntersected) { diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index aab6b67658..fcd7e9baf4 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -26,6 +26,7 @@ #include "pbd/error.h" #include "pbd/pthread_utils.h" #include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" #include @@ -80,11 +81,10 @@ Editor::time_stretch (RegionSelection& regions, float fraction) MidiStretch stretch(*_session, request); begin_reversible_command ("midi stretch"); stretch.run(regions.front()->region()); - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->replace_region (regions.front()->region(), stretch.results[0], regions.front()->region()->position()); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist, &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -315,10 +315,9 @@ Editor::do_timefx (TimeFXDialog& dialog) in_command = true; } - XMLNode &before = playlist->get_state(); + playlist->clear_history (); playlist->replace_region (region, new_region, region->position()); - XMLNode &after = playlist->get_state(); - _session->add_command (new MementoCommand(*playlist, &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist)); } i = tmp; diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 4ea7aba4fa..aec77df8c0 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -29,6 +29,7 @@ #include #include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" #include "ardour/playlist.h" #include "ardour/tempo.h" @@ -2530,9 +2531,9 @@ MidiRegionView::paste (nframes64_t pos, float times, const MidiCutBuffer& mcb) trackview.session()->begin_reversible_command (_("paste")); - XMLNode& before (_region->get_state()); + _region->clear_history (); _region->set_length (end_frame, this); - trackview.session()->add_command (new MementoCommand(*_region, &before, &_region->get_state())); + trackview.session()->add_command (new StatefulDiffCommand (_region)); } apply_delta (); diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 19c1a53b39..1ca63d0f53 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -558,10 +558,10 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t if (nlen != region->length()) { - region->freeze (); + region->suspend_property_changes (); region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); region->set_length (start + dur - region->position(), this); - region->thaw (); + region->resume_property_changes (); if (origlen == 1) { /* our special initial length */ @@ -622,10 +622,10 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t if (region->source_length(0) >= region->position() + nlen) { - region->freeze (); + region->suspend_property_changes (); region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this); region->set_length (nlen, this); - region->thaw (); + region->resume_property_changes (); if (origlen == 1) { /* our special initial length */ diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index b1adb7c67e..5949541e56 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -31,6 +31,7 @@ #include "pbd/basename.h" #include "pbd/enumwriter.h" #include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" #include #include @@ -966,7 +967,7 @@ MidiTimeAxisView::add_region (nframes64_t pos) Editor* real_editor = dynamic_cast (&_editor); real_editor->begin_reversible_command (_("create region")); - XMLNode &before = playlist()->get_state(); + playlist()->clear_history (); framepos_t start = pos; real_editor->snap_to (start, -1); @@ -988,8 +989,7 @@ MidiTimeAxisView::add_region (nframes64_t pos) boost::shared_ptr region = (RegionFactory::create (src, plist)); playlist()->add_region (region, start); - XMLNode &after = playlist()->get_state(); - _session->add_command (new MementoCommand (*playlist().get(), &before, &after)); + _session->add_command (new StatefulDiffCommand (playlist())); real_editor->commit_reversible_command(); diff --git a/gtk2_ardour/region_gain_line.cc b/gtk2_ardour/region_gain_line.cc index 827562524e..30e19ec24a 100644 --- a/gtk2_ardour/region_gain_line.cc +++ b/gtk2_ardour/region_gain_line.cc @@ -19,6 +19,7 @@ #include "evoral/Curve.hpp" #include "pbd/memento_command.h" +#include "pbd/stateful_diff_command.h" #include "ardour/audioregion.h" #include "ardour/session.h" @@ -53,6 +54,8 @@ void AudioRegionGainLine::start_drag_single (ControlPoint* cp, double x, float fraction) { AutomationLine::start_drag_single (cp, x, fraction); + + // XXX Stateful need to capture automation curve data if (!rv.audio_region()->envelope_active()) { trackview.session()->add_command(new MementoCommand(*(rv.audio_region().get()), &rv.audio_region()->get_state(), 0)); @@ -72,10 +75,9 @@ AudioRegionGainLine::remove_point (ControlPoint& cp) XMLNode &before = alist->get_state(); if (!rv.audio_region()->envelope_active()) { - XMLNode ®ion_before = rv.audio_region()->get_state(); + rv.audio_region()->clear_history (); rv.audio_region()->set_envelope_active(true); - XMLNode ®ion_after = rv.audio_region()->get_state(); - trackview.session()->add_command(new MementoCommand(*(rv.audio_region().get()), ®ion_before, ®ion_after)); + trackview.session()->add_command(new StatefulDiffCommand (rv.audio_region())); } alist->erase (mr.start, mr.end); -- cgit v1.2.3