colinf's vertical double arrow track resize cursor patch
[ardour.git] / gtk2_ardour / editor_ops.cc
index f4e40f4120239bcad07822299b5db80b50a37d00..2bb91fe229d341281dc293525a3d27c09176682b 100644 (file)
@@ -32,6 +32,7 @@
 #include "pbd/pthread_utils.h"
 #include "pbd/memento_command.h"
 #include "pbd/whitespace.h"
+#include "pbd/stateful_diff_command.h"
 
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/choice.h>
@@ -820,7 +821,6 @@ Editor::cursor_to_region_boundary (bool with_selection, int32_t dir)
                return;
        }
 
-
        _session->request_locate (target);
 }
 
@@ -1587,11 +1587,8 @@ Editor::temporal_zoom (gdouble fpu)
                break;
 
        case ZoomFocusPlayhead:
-               /* try to keep the playhead in the same place */
-
-               where = playhead_cursor->current_frame;
-
-               l = - ((new_page_size * ((where - current_leftmost)/(double)current_page)) - where);
+               /* centre playhead */
+               l = playhead_cursor->current_frame - (new_page_size * 0.5);
 
                if (l < 0) {
                        leftmost_after_zoom = 0;
@@ -2671,8 +2668,15 @@ Editor::region_from_selection ()
 
                internal_start = start - current->position();
                _session->region_name (new_name, current->name(), true);
-               boost::shared_ptr<Region> region (RegionFactory::create (current,
-                               internal_start, selection_cnt, new_name));
+
+               PropertyList plist; 
+               
+               plist.add (ARDOUR::Properties::start, internal_start);
+               plist.add (ARDOUR::Properties::length, selection_cnt);
+               plist.add (ARDOUR::Properties::name, new_name);
+               plist.add (ARDOUR::Properties::layer, 0);
+
+               boost::shared_ptr<Region> region (RegionFactory::create (current, plist));
        }
 }
 
@@ -2705,8 +2709,13 @@ Editor::create_region_from_selection (vector<boost::shared_ptr<Region> >& new_re
                internal_start = start - current->position();
                _session->region_name (new_name, current->name(), true);
 
-               new_regions.push_back (RegionFactory::create (current,
-                                       internal_start, end - start + 1, new_name));
+               PropertyList plist; 
+               
+               plist.add (ARDOUR::Properties::start, internal_start);
+               plist.add (ARDOUR::Properties::length, end - start + 1);
+               plist.add (ARDOUR::Properties::name, new_name);
+
+               new_regions.push_back (RegionFactory::create (current, plist));
        }
 }
 
@@ -3181,10 +3190,9 @@ Editor::naturalize ()
 
        begin_reversible_command (_("naturalize"));
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
-                XMLNode &before = (*i)->region()->get_state();
+               (*i)->region()->clear_history ();
                (*i)->region()->move_to_natural_position (this);
-                XMLNode &after = (*i)->region()->get_state();
-               _session->add_command (new MementoCommand<Region>(*((*i)->region().get()), &before, &after));
+               _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
        commit_reversible_command ();
 }
@@ -3608,7 +3616,7 @@ Editor::trim_to_region(bool forward)
                    }
 
                    region->trim_end((nframes64_t) (next_region->first_frame() * speed), this);
-                   arv->region_changed (Change (LengthChanged));
+                   arv->region_changed (PropertyChange (ARDOUR::Properties::length));
                }
                else {
 
@@ -3619,7 +3627,8 @@ Editor::trim_to_region(bool forward)
                    }
 
                    region->trim_front((nframes64_t) ((next_region->last_frame() + 1) * speed), this);
-                   arv->region_changed (Change (LengthChanged|PositionChanged|StartChanged));
+
+                   arv->region_changed (ARDOUR::bounds_change);
                }
 
                XMLNode &after = playlist->get_state();
@@ -3826,10 +3835,8 @@ Editor::cut_copy (CutCopyOp op)
        */
 
        if (op == Cut || op == Clear) {
-               if (_drag) {
-                       _drag->item()->ungrab (0);
-                       delete _drag;
-                       _drag = 0;
+               if (_drags->active ()) {
+                       _drags->abort ();
                }
        }
 
@@ -3846,10 +3853,7 @@ Editor::cut_copy (CutCopyOp op)
                        Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::really_remove_marker), loc));
                }
 
-               break_drag ();
-               delete _drag;
-               _drag = 0;
-
+               _drags->break_drag ();
                return;
        }
 
@@ -3930,9 +3934,7 @@ Editor::cut_copy (CutCopyOp op)
        }
 
        if (op == Cut || op == Clear) {
-               break_drag ();
-               delete _drag;
-               _drag = 0;
+               _drags->break_drag ();
        }
 }
 
@@ -4881,7 +4883,7 @@ Editor::brush (nframes64_t pos)
 void
 Editor::reset_region_gain_envelopes ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -4906,7 +4908,7 @@ Editor::reset_region_gain_envelopes ()
 void
 Editor::toggle_gain_envelope_visibility ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -4930,7 +4932,7 @@ Editor::toggle_gain_envelope_visibility ()
 void
 Editor::toggle_gain_envelope_active ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -4941,10 +4943,9 @@ Editor::toggle_gain_envelope_active ()
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
                AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
                if (arv) {
-                       XMLNode &before = arv->region()->get_state ();
+                       arv->region()->clear_history ();
                        arv->audio_region()->set_envelope_active (!arv->audio_region()->envelope_active());
-                       XMLNode &after = arv->region()->get_state ();
-                       _session->add_command (new MementoCommand<Region> (*(arv->region().get()), &before, &after));
+                       _session->add_command (new StatefulDiffCommand (arv->region()));
                }
        }
 
@@ -4954,7 +4955,7 @@ Editor::toggle_gain_envelope_active ()
 void
 Editor::toggle_region_lock ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -4963,10 +4964,9 @@ Editor::toggle_region_lock ()
        _session->begin_reversible_command (_("region lock"));
 
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
-               XMLNode &before = (*i)->region()->get_state ();
+               (*i)->region()->clear_history ();
                (*i)->region()->set_locked (!(*i)->region()->locked());
-               XMLNode &after = (*i)->region()->get_state ();
-               _session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
+               _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
 
        _session->commit_reversible_command ();
@@ -4975,7 +4975,7 @@ Editor::toggle_region_lock ()
 void
 Editor::set_region_lock_style (Region::PositionLockStyle ps)
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -4997,7 +4997,7 @@ Editor::set_region_lock_style (Region::PositionLockStyle ps)
 void
 Editor::toggle_region_mute ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -5006,10 +5006,9 @@ Editor::toggle_region_mute ()
        _session->begin_reversible_command (_("region mute"));
 
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
-               XMLNode &before = (*i)->region()->get_state ();
+               (*i)->region()->clear_history ();
                (*i)->region()->set_muted (!(*i)->region()->muted());
-               XMLNode &after = (*i)->region()->get_state ();
-               _session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
+               _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
 
        _session->commit_reversible_command ();
@@ -5018,7 +5017,7 @@ Editor::toggle_region_mute ()
 void
 Editor::toggle_region_opaque ()
 {
-       RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
+       RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.id);
 
        if (!_session || rs.empty()) {
                return;
@@ -5027,10 +5026,9 @@ Editor::toggle_region_opaque ()
        _session->begin_reversible_command (_("region opacity"));
 
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
-               XMLNode &before = (*i)->region()->get_state ();
+               (*i)->region()->clear_history ();
                (*i)->region()->set_opaque (!(*i)->region()->opaque());
-               XMLNode &after = (*i)->region()->get_state ();
-               _session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
+               _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
 
        _session->commit_reversible_command ();
@@ -5974,7 +5972,14 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
 
                /* do NOT announce new regions 1 by one, just wait till they are all done */
 
-               boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), file_start, len, new_name, 0, Region::DefaultFlags, false);
+               PropertyList plist; 
+               
+               plist.add (ARDOUR::Properties::start, file_start);
+               plist.add (ARDOUR::Properties::length, len);
+               plist.add (ARDOUR::Properties::name, new_name);
+               plist.add (ARDOUR::Properties::layer, 0);
+
+               boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), plist, false);
                pl->add_region (nr, pos);
 
                pos += len;
@@ -5987,7 +5992,14 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
                        file_start = r->start() + (pos - r->position());
                        len = r->last_frame() - pos;
 
-                       nr = RegionFactory::create (r->sources(), file_start, len, new_name, 0, Region::DefaultFlags);
+                       PropertyList plist2; 
+                       
+                       plist2.add (ARDOUR::Properties::start, file_start);
+                       plist2.add (ARDOUR::Properties::length, len);
+                       plist2.add (ARDOUR::Properties::name, new_name);
+                       plist2.add (ARDOUR::Properties::layer, 0);
+
+                       nr = RegionFactory::create (r->sources(), plist2); 
                        pl->add_region (nr, pos);
 
                        break;