diff options
author | nick_m <mainsbridge@gmail.com> | 2017-06-17 05:11:38 +1000 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2017-07-22 02:15:20 +1000 |
commit | cadb5c481c9aabebe9a6801dca3d00f0b15d989c (patch) | |
tree | 67d0697a835257d5b02684e17880966bf772852c /gtk2_ardour/editor_drag.cc | |
parent | 0d9c4986e9c74f0edbd8794e21834b6018a00853 (diff) |
Disable tempo end/twist drag for meter-locked tempi
It was assumed that the drag takes place within an area of musical time.
This is not true for the space before any non-initial
meter-locked tempo.
In the case of the initial tempo, there is no previous section
to perform an end-drag on.
Diffstat (limited to 'gtk2_ardour/editor_drag.cc')
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index b65c0825ef..e59e047f1c 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3701,6 +3701,11 @@ TempoTwistDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) _before_state = &map.get_state(); _tempo = const_cast<TempoSection*> (&map.tempo_section_at_frame (raw_grab_frame())); + if (_tempo->locked_to_meter()) { + _drag_valid = false; + return; + } + _next_tempo = map.next_tempo_section (_tempo); if (_next_tempo) { if (!map.next_tempo_section (_next_tempo)) { @@ -3784,8 +3789,6 @@ TempoTwistDrag::motion (GdkEvent* event, bool first_move) void TempoTwistDrag::finished (GdkEvent* event, bool movement_occurred) { - TempoMap& map (_editor->session()->tempo_map()); - if (!movement_occurred || !_drag_valid) { return; } @@ -3793,6 +3796,7 @@ TempoTwistDrag::finished (GdkEvent* event, bool movement_occurred) _editor->tempo_curve_selected (_tempo, false); _editor->tempo_curve_selected (_next_tempo, false); + TempoMap& map (_editor->session()->tempo_map()); XMLNode &after = map.get_state(); _editor->session()->add_command(new MementoCommand<TempoMap>(map, _before_state, &after)); _editor->commit_reversible_command (); @@ -3811,6 +3815,7 @@ TempoEndDrag::TempoEndDrag (Editor* e, ArdourCanvas::Item* i) , _grab_qn (0.0) , _tempo (0) , _before_state (0) + , _drag_valid (true) { DEBUG_TRACE (DEBUG::Drags, "New TempoEndDrag\n"); TempoMarker* marker = reinterpret_cast<TempoMarker*> (_item->get_data ("marker")); @@ -3827,6 +3832,10 @@ TempoEndDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) /* get current state */ _before_state = &tmap.get_state(); + if (_tempo->locked_to_meter()) { + _drag_valid = false; + return; + } ostringstream sstr; @@ -3856,14 +3865,16 @@ TempoEndDrag::setup_pointer_frame_offset () void TempoEndDrag::motion (GdkEvent* event, bool first_move) { + if (!_drag_valid) { + return; + } + TempoMap& map (_editor->session()->tempo_map()); if (first_move) { _editor->begin_reversible_command (_("stretch end tempo")); } - - framepos_t const pf = adjusted_current_frame (event, false); map.gui_stretch_tempo_end (&map.tempo_section_at_frame (_tempo->frame() - 1), map.frame_at_quarter_note (_grab_qn), pf); @@ -3880,7 +3891,7 @@ TempoEndDrag::motion (GdkEvent* event, bool first_move) void TempoEndDrag::finished (GdkEvent* event, bool movement_occurred) { - if (!movement_occurred) { + if (!movement_occurred || !_drag_valid) { return; } |