summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-11-09 01:58:42 +0000
committerCarl Hetherington <carl@carlh.net>2010-11-09 01:58:42 +0000
commitd29f14bf33bc807be7b95015e4f011f4ad741cc6 (patch)
tree45e3dfea78a108a9ab06a3c4c3dbb5c47cc72e01
parentc246926e4148e9996060bd6865ff03a962ddab2e (diff)
Fix trim of multiple regions. Fixes #3528.
git-svn-id: svn://localhost/ardour2/branches/3.0@7982 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/editor_drag.cc29
-rw-r--r--gtk2_ardour/editor_drag.h2
2 files changed, 15 insertions, 16 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index f9a9283d1b..45d67605b4 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -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 ();
}
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index 67bd43e2b5..e0d3d91ee8 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -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;
};