From ab2357dfa118c44a80473815adf957eb5c3f2c39 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 24 May 2021 12:28:19 -0600 Subject: [PATCH] implement dragging for region/cue markers --- gtk2_ardour/editor_drag.cc | 27 +++++++++++++++++++++++---- gtk2_ardour/editor_drag.h | 1 + gtk2_ardour/editor_mouse.cc | 7 ++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 765349c578..eda2f71686 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -7158,6 +7158,7 @@ RegionMarkerDrag::RegionMarkerDrag (Editor* ed, RegionView* r, ArdourCanvas::Ite , rv (r) , view (static_cast (i->get_data ("marker"))) , model (rv->find_model_cue_marker (view)) + , dragging_model (model) { assert (view); } @@ -7167,27 +7168,45 @@ RegionMarkerDrag::~RegionMarkerDrag () } void -RegionMarkerDrag::start_grab (GdkEvent *, Gdk::Cursor* c) +RegionMarkerDrag::start_grab (GdkEvent* ev, Gdk::Cursor* c) { + Drag::start_grab (ev, c); + show_verbose_cursor_time (model.position()); + setup_snap_delta (MusicSample (model.position(), 0)); } void -RegionMarkerDrag::motion (GdkEvent *, bool) +RegionMarkerDrag::motion (GdkEvent* ev, bool first_move) { + samplepos_t pos = adjusted_current_sample (ev); + + if (pos < rv->region()->position() || pos >= (rv->region()->position() + rv->region()->length())) { + /* out of bounds */ + return; + } + + dragging_model.set_position (pos); + view->set_position (pos - rv->region()->position()); + show_verbose_cursor_time (dragging_model.position() - rv->region()->position()); /* earlier */ } void -RegionMarkerDrag::finished (GdkEvent *, bool) +RegionMarkerDrag::finished (GdkEvent *, bool did_move) { + if (did_move) { + rv->region()->move_cue_marker (model, dragging_model.position()); + } } void RegionMarkerDrag::aborted (bool) { + view->set_position (model.position()); } void RegionMarkerDrag::setup_pointer_sample_offset () { + const samplepos_t model_abs_pos = rv->region()->position() + (model.position() - rv->region()->start()); /* distance */ + _pointer_sample_offset = raw_grab_sample() - model_abs_pos; /* distance */ } - diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index b57a9a3f2a..8cd67117c3 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -1401,6 +1401,7 @@ class RegionMarkerDrag : public Drag RegionView* rv; ArdourMarker* view; ARDOUR::CueMarker model; + ARDOUR::CueMarker dragging_model; }; #endif /* __gtk2_ardour_editor_drag_h_ */ diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index e5a78ad43d..117fa5b840 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -751,7 +751,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { hide_marker (item, event); } else { - _drags->set (new MarkerDrag (this, item), event); + ArdourMarker* marker = static_cast (item->get_data ("marker")); + if (marker->type() == ArdourMarker::RegionCue) { + _drags->set (new RegionMarkerDrag (this, marker->region_view(), item), event); + } else { + _drags->set (new MarkerDrag (this, item), event); + } } return true;