diff options
author | nick_m <mainsbridge@gmail.com> | 2016-12-14 02:08:59 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-12-14 02:08:59 +1100 |
commit | c518bc3fb7a016ad2d45a1805fbba81e56673177 (patch) | |
tree | 6e73604e0fa3f4fac6940352f2d5dbb751450031 | |
parent | 545f5bee87062c33ce5aa7bb0fecfbdd1cb1a83b (diff) | |
download | ardour-master.zip ardour-master.tar.gz ardour-master.tar.bz2 |
when dragging or copying multiple regions, respect position lock style.HEADorigin/masterorigin/HEADmaster
- 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.
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index d29b9b7..6555ec9 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())); } |