Fix trim of multiple regions. Fixes #3528.
authorCarl Hetherington <carl@carlh.net>
Tue, 9 Nov 2010 01:58:42 +0000 (01:58 +0000)
committerCarl Hetherington <carl@carlh.net>
Tue, 9 Nov 2010 01:58:42 +0000 (01:58 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7982 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_drag.h

index f9a9283d1b418f65bc42100f54d53ebc235e6460..45d67605b4af0a5e0de5de70527f26f9299800c6 100644 (file)
@@ -1568,11 +1568,6 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 {
        RegionView* rv = _primary;
 
-       /* snap modifier works differently here..
-          its current state has to be passed to the
-          various trim functions in order to work properly
-       */
-
        double speed = 1.0;
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
        RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
@@ -1582,7 +1577,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
                speed = tv->track()->speed();
        }
 
-       framepos_t const pf = adjusted_current_frame (event);
+       framecnt_t const dt = adjusted_current_frame (event) - grab_frame ();
 
        if (first_move) {
 
@@ -1605,13 +1600,13 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
                for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
                        RegionView* rv = i->view;
-                       rv->fake_set_opaque(false);
+                       rv->fake_set_opaque (false);
                        rv->enable_display (false);
                         rv->region()->clear_changes ();
 
                        AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (rv);
 
-                       if (arv){
+                       if (arv) {
                                arv->temporarily_hide_envelope ();
                        }
 
@@ -1633,13 +1628,13 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
        switch (_operation) {
        case StartTrim:
                for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
-                       i->view->trim_start (pf, non_overlap_trim);
+                       i->view->trim_start (i->initial_position + dt, non_overlap_trim);
                }
                break;
 
        case EndTrim:
                for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
-                       i->view->trim_end (pf, non_overlap_trim);
+                       i->view->trim_end (i->initial_end + dt, non_overlap_trim);
                }
                break;
 
@@ -1654,14 +1649,14 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
                        framecnt_t frame_delta = 0;
                        
                        bool left_direction = false;
-                       if (last_pointer_frame() > pf) {
+                       if (last_pointer_frame() > adjusted_current_frame(event)) {
                                left_direction = true;
                        }
 
                        if (left_direction) {
-                               frame_delta = (last_pointer_frame() - pf);
+                               frame_delta = (last_pointer_frame() - adjusted_current_frame(event));
                        } else {
-                               frame_delta = (pf - last_pointer_frame());
+                               frame_delta = (adjusted_current_frame(event) - last_pointer_frame());
                        }
 
                        for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
@@ -1673,13 +1668,13 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
        switch (_operation) {
        case StartTrim:
-               _editor->show_verbose_time_cursor((framepos_t) (rv->region()->position()/speed), 10);
+               _editor->show_verbose_time_cursor ((framepos_t) (rv->region()->position() / speed), 10);
                break;
        case EndTrim:
-               _editor->show_verbose_time_cursor((framepos_t) (rv->region()->last_frame()/speed), 10);
+               _editor->show_verbose_time_cursor ((framepos_t) (rv->region()->last_frame() / speed), 10);
                break;
        case ContentsTrim:
-               _editor->show_verbose_time_cursor (pf, 10);
+               _editor->show_verbose_time_cursor (adjusted_current_frame (event), 10);
                break;
        }
 }
@@ -4013,4 +4008,6 @@ DraggingView::DraggingView (RegionView* v, RegionDrag* parent)
        layer = v->region()->layer ();
        initial_y = v->get_canvas_group()->property_y ();
        initial_playlist = v->region()->playlist ();
+       initial_position = v->region()->position ();
+       initial_end = v->region()->position () + v->region()->length ();
 }
index 67bd43e2b515e8575cfac1eb8e2f44702d54b53b..e0d3d91ee86f6a99775e0dbe2992a491905a6595 100644 (file)
@@ -239,6 +239,8 @@ struct DraggingView
        /** layer that this region is currently being displayed on */
        ARDOUR::layer_t layer;
        double initial_y; ///< the initial y position of the view before any reparenting
+       framepos_t initial_position; ///< initial position of the region
+       framepos_t initial_end; ///< initial end position of the region
        boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
 };