summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_drag.cc
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2016-12-14 02:08:59 +1100
committernick_m <mainsbridge@gmail.com>2016-12-14 02:08:59 +1100
commitc518bc3fb7a016ad2d45a1805fbba81e56673177 (patch)
tree6e73604e0fa3f4fac6940352f2d5dbb751450031 /gtk2_ardour/editor_drag.cc
parent545f5bee87062c33ce5aa7bb0fecfbdd1cb1a83b (diff)
when dragging or copying multiple regions, respect position lock style.
- music-locked regions are moved by drag beat distance (will conform to tempo changes over the drag distance) audio-locked regions are moved by frame distance.
Diffstat (limited to 'gtk2_ardour/editor_drag.cc')
-rw-r--r--gtk2_ardour/editor_drag.cc42
1 files changed, 35 insertions, 7 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index d29b9b78c4..6555ec9c52 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1467,6 +1467,10 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
PlaylistSet modified_playlists;
RouteTimeAxisView* new_time_axis_view = 0;
+ int32_t divisor = current_music_divisor (_primary->region()->position() - drag_delta, ev_state);
+ TempoMap& tmap (_editor->session()->tempo_map());
+ double qn_delta = _primary->region()->quarter_note() - tmap.exact_qn_at_frame (_primary->region()->position() - drag_delta, divisor);
+
if (_brushing) {
/* all changes were made during motion event handlers */
@@ -1527,8 +1531,14 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
modified_playlists, current_music_divisor (where, ev_state));
} else {
- new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
- modified_playlists, 0);
+ if (i->view->region()->position_lock_style() == AudioTime) {
+ new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+ modified_playlists, 0);
+ } else {
+ where = tmap.frame_at_quarter_note (i->view->region()->quarter_note() - qn_delta);
+ new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+ modified_playlists, 0);
+ }
}
if (new_view != 0) {
@@ -1577,6 +1587,10 @@ RegionMoveDrag::finished_no_copy (
typedef map<boost::shared_ptr<Playlist>, RouteTimeAxisView*> PlaylistMapping;
PlaylistMapping playlist_mapping;
+ int32_t divisor = current_music_divisor (_primary->region()->position() - drag_delta, ev_state);
+ TempoMap& tmap (_editor->session()->tempo_map());
+ double qn_delta = _primary->region()->quarter_note() - tmap.exact_qn_at_frame (_primary->region()->position() - drag_delta, divisor);
+
std::set<boost::shared_ptr<const Region> > uniq;
for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ) {
@@ -1643,10 +1657,19 @@ RegionMoveDrag::finished_no_copy (
modified_playlists, current_music_divisor (where, ev_state)
);
} else {
- new_view = insert_region_into_playlist (
- RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
- modified_playlists, 0
- );
+ if (rv->region()->position_lock_style() == AudioTime) {
+
+ new_view = insert_region_into_playlist (
+ RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+ modified_playlists, 0
+ );
+ } else {
+ where = tmap.frame_at_quarter_note (rv->region()->quarter_note() - qn_delta);
+ new_view = insert_region_into_playlist (
+ RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+ modified_playlists, 0
+ );
+ }
}
if (new_view == 0) {
@@ -1708,7 +1731,12 @@ RegionMoveDrag::finished_no_copy (
if (rv == _primary) {
rv->region()->set_position (where, current_music_divisor (where, ev_state));
} else {
- rv->region()->set_position (where, 0);
+ if (rv->region()->position_lock_style() == AudioTime) {
+ rv->region()->set_position (where, 0);
+ } else {
+ rv->region()->set_position (tmap.frame_at_quarter_note (rv->region()->quarter_note() - qn_delta), 0);
+
+ }
}
_editor->session()->add_command (new StatefulDiffCommand (rv->region()));
}