fix session loading
[ardour.git] / gtk2_ardour / audio_region_editor.cc
index 2c26f562ff165f92658b0e8c072a7cf69e7d5149..79baf33541834878e0c531869943be09a0abc817 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "pbd/memento_command.h"
+#include "pbd/stateful_diff_command.h"
 
 #include "ardour/session.h"
 #include "ardour/audioregion.h"
@@ -72,7 +73,7 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
        name_hbox.pack_start (name_label, false, false);
        name_hbox.pack_start (name_entry, false, false);
 
-       ARDOUR_UI::instance()->tooltips().set_tip (audition_button, _("audition this region"));
+       ARDOUR_UI::instance()->set_tip (audition_button, _("audition this region"));
 
        audition_button.unset_flags (Gtk::CAN_FOCUS);
 
@@ -152,10 +153,19 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
        show_all();
 
        name_changed ();
-       bounds_changed (Change (StartChanged|LengthChanged|PositionChanged|Region::SyncOffsetChanged));
+
+       PropertyChange change;
+
+       change.add (ARDOUR::Properties::start);
+       change.add (ARDOUR::Properties::length);
+       change.add (ARDOUR::Properties::position);
+       change.add (ARDOUR::Properties::sync_position);
+
+       bounds_changed (change);
+
        gain_changed ();
 
-       _region->StateChanged.connect (sigc::mem_fun(*this, &AudioRegionEditor::region_changed));
+       _region->PropertyChanged.connect (state_connection, invalidator (*this), ui_bind (&AudioRegionEditor::region_changed, this, _1), gui_context());
 
        spin_arrow_grab = false;
 
@@ -167,17 +177,24 @@ AudioRegionEditor::~AudioRegionEditor ()
 }
 
 void
-AudioRegionEditor::region_changed (Change what_changed)
+AudioRegionEditor::region_changed (const PBD::PropertyChange& what_changed)
 {
-       if (what_changed & NameChanged) {
+       if (what_changed.contains (ARDOUR::Properties::name)) {
                name_changed ();
        }
 
-       if (what_changed & Change (BoundsChanged|StartChanged|Region::SyncOffsetChanged)) {
+       PropertyChange interesting_stuff;
+
+       interesting_stuff.add (ARDOUR::Properties::position);
+       interesting_stuff.add (ARDOUR::Properties::length);
+       interesting_stuff.add (ARDOUR::Properties::start);
+       interesting_stuff.add (ARDOUR::Properties::sync_position);
+
+       if (what_changed.contains (interesting_stuff)) {
                bounds_changed (what_changed);
        }
 
-       if (what_changed & AudioRegion::ScaleAmplitudeChanged) {
+       if (what_changed.contains (ARDOUR::Properties::scale_amplitude)) {
                gain_changed ();
        }
 }
@@ -228,7 +245,8 @@ AudioRegionEditor::connect_editor_events ()
        gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &AudioRegionEditor::gain_adjustment_changed));
 
        audition_button.signal_toggled().connect (sigc::mem_fun(*this, &AudioRegionEditor::audition_button_toggled));
-       _session->AuditionActive.connect (sigc::mem_fun(*this, &AudioRegionEditor::audition_state_changed));
+
+       _session->AuditionActive.connect (audition_connection, invalidator (*this), ui_bind (&AudioRegionEditor::audition_state_changed, this, _1), gui_context());
 }
 
 void
@@ -239,10 +257,9 @@ AudioRegionEditor::position_clock_changed ()
        boost::shared_ptr<Playlist> 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<Playlist>(*pl, &before, &after));
+               _session->add_command(new StatefulDiffCommand (_region));
        }
 
        _session->commit_reversible_command ();
@@ -256,10 +273,9 @@ AudioRegionEditor::end_clock_changed ()
        boost::shared_ptr<Playlist> 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<Playlist>(*pl, &before, &after));
+               _session->add_command(new StatefulDiffCommand (_region));
        }
 
        _session->commit_reversible_command ();
@@ -277,10 +293,9 @@ AudioRegionEditor::length_clock_changed ()
        boost::shared_ptr<Playlist> 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<Playlist>(*pl, &before, &after));
+               _session->add_command(new StatefulDiffCommand (_region));
        }
 
        _session->commit_reversible_command ();
@@ -325,35 +340,35 @@ AudioRegionEditor::name_changed ()
 }
 
 void
-AudioRegionEditor::bounds_changed (Change what_changed)
+AudioRegionEditor::bounds_changed (const PropertyChange& what_changed)
 {
-       if ((what_changed & Change (PositionChanged|LengthChanged)) == Change (PositionChanged|LengthChanged)) {
+       if (what_changed.contains (ARDOUR::Properties::position) && what_changed.contains (ARDOUR::Properties::length)) {
                position_clock.set (_region->position(), true);
                end_clock.set (_region->position() + _region->length() - 1, true);
                length_clock.set (_region->length(), true);
-       } else if (what_changed & Change (PositionChanged)) {
+       } else if (what_changed.contains (ARDOUR::Properties::position)) {
                position_clock.set (_region->position(), true);
                end_clock.set (_region->position() + _region->length() - 1, true);
-       } else if (what_changed & Change (LengthChanged)) {
+       } else if (what_changed.contains (ARDOUR::Properties::length)) {
                end_clock.set (_region->position() + _region->length() - 1, true);
                length_clock.set (_region->length(), true);
        }
 
-       if ((what_changed & Region::SyncOffsetChanged) || (what_changed & PositionChanged)) {
+       if (what_changed.contains (ARDOUR::Properties::sync_position) || what_changed.contains (ARDOUR::Properties::position)) {
                int dir;
                nframes_t off = _region->sync_offset (dir);
                if (dir == -1) {
                        off = -off;
                }
 
-               if (what_changed & Region::SyncOffsetChanged) {
+               if (what_changed.contains (ARDOUR::Properties::sync_position)) {
                        sync_offset_relative_clock.set (off, true);
                }
 
                sync_offset_absolute_clock.set (off + _region->position (), true);
        }
 
-       if (what_changed & StartChanged) {
+       if (what_changed.contains (ARDOUR::Properties::start)) {
                start_clock.set (_region->start(), true);
        }
 }
@@ -387,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<AudioRegion> (*_region.get(), &before, &after));
+       _session->add_command (new StatefulDiffCommand (_region));
        
        _session->commit_reversible_command ();
 }
@@ -400,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<AudioRegion> (*_region.get(), &before, &after));
+       _session->add_command (new StatefulDiffCommand (_region));
        
        _session->commit_reversible_command ();
 }
@@ -411,6 +424,14 @@ AudioRegionEditor::sync_offset_relative_clock_changed ()
 bool
 AudioRegionEditor::on_delete_event (GdkEventAny* ev)
 {
-       bounds_changed (Change (StartChanged|LengthChanged|PositionChanged|Region::SyncOffsetChanged));
+       PropertyChange change;
+
+       change.add (ARDOUR::Properties::start);
+       change.add (ARDOUR::Properties::length);
+       change.add (ARDOUR::Properties::position);
+       change.add (ARDOUR::Properties::sync_position);
+
+       bounds_changed (change);
+
        return RegionEditor::on_delete_event (ev);
 }