diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index be195622ee..9bf1979f80 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -1480,7 +1480,6 @@ Editor::which_canvas_cursor(ItemType type) const case MinsecRulerItem: case BBTRulerItem: case SamplesRulerItem: - case SelectionMarkerItem: cursor = _cursors->timebar; break; @@ -1498,6 +1497,7 @@ Editor::which_canvas_cursor(ItemType type) const case VideoBarItem: case TransportMarkerBarItem: case DropZoneItem: + case SelectionMarkerItem: cursor = _cursors->grabber; break; diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index f172590291..3680138246 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -5805,6 +5805,64 @@ SelectionDrag::aborted (bool) /* XXX: TODO */ } +SelectionMarkerDrag::SelectionMarkerDrag (Editor* e, ArdourCanvas::Item* i) + : Drag (e, i, e->default_time_domain ()) + , _edit_start (true) +{ + DEBUG_TRACE (DEBUG::Drags, "New SelectionMarkerDrag\n"); + bool ok = _editor->get_selection_extents (_start_at_start, _end_at_start); + assert (ok); + + // SelectionStart, SelectionEnd + cout << " SelectionMarkerDrag " << _start_at_start << " - " << _end_at_start << " " << i->whoami() << "\n"; +} + +void +SelectionMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor*) +{ + Drag::start_grab (event); + timepos_t const pos = adjusted_current_time (event, false); + _edit_start = pos.distance (_start_at_start).abs () < pos.distance (_end_at_start).abs (); +} + +void +SelectionMarkerDrag::motion (GdkEvent* event, bool first_move) +{ + if (first_move) { + _editor->begin_reversible_selection_op (X_("set time selection")); + } + timepos_t const pos = adjusted_current_time (event, true); + if (_edit_start) { + if (pos < _end_at_start) { + _editor->get_selection ().clear_time (); + _editor->get_selection ().add (pos, _end_at_start); + } + } else { + if (pos > _start_at_start) { + _editor->get_selection ().clear_time (); + _editor->get_selection ().add (_start_at_start, pos); + } + } +} + +void +SelectionMarkerDrag::finished (GdkEvent* event, bool movement_occurred) +{ + if (movement_occurred) { + _editor->commit_reversible_selection_op (); + } +} + +void +SelectionMarkerDrag::aborted (bool movement_occurred) +{ + if (movement_occurred) { + _editor->abort_reversible_selection_op (); + } + _editor->get_selection ().clear_time (); + _editor->get_selection ().add (_start_at_start, _end_at_start); +} + RangeMarkerBarDrag::RangeMarkerBarDrag (Editor* e, ArdourCanvas::Item* i, Operation o) : Drag (e, i, e->default_time_domain (), false) , _operation (o) diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 7629563124..1f91c21a0e 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -1378,6 +1378,23 @@ private: Temporal::timepos_t end_at_start; }; +/** Drag time-selection markers */ +class SelectionMarkerDrag : public Drag +{ +public: + SelectionMarkerDrag (Editor*, ArdourCanvas::Item*); + + void start_grab (GdkEvent*, Gdk::Cursor* c = 0); + void motion (GdkEvent*, bool); + void finished (GdkEvent *, bool); + void aborted (bool); + +private: + bool _edit_start; + Temporal::timepos_t _start_at_start; + Temporal::timepos_t _end_at_start; +}; + /** Range marker drag */ class RangeMarkerBarDrag : public Drag { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 29d7f9a2dc..4d8fddcf5e 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -800,6 +800,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT _drags->set (new BBTMarkerDrag (this, item), event); return true; + case SelectionMarkerItem: + _drags->set (new SelectionMarkerDrag (this, item), event); + return true; + case MeterMarkerItem: _drags->set ( new MeterMarkerDrag ( @@ -849,7 +853,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SamplesRulerItem: case MinsecRulerItem: case MarkerBarItem: - case SelectionMarkerItem: if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier) && !ArdourKeyboard::indicates_constraint (event->button.state)) { _drags->set (new CursorDrag (this, *_playhead_cursor, false), event); @@ -1794,6 +1797,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case AutomationLineItem: case StartSelectionTrimItem: case EndSelectionTrimItem: + case SelectionMarkerItem: return true; case MarkerBarItem: @@ -1841,7 +1845,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SamplesRulerItem: case MinsecRulerItem: case BBTRulerItem: - case SelectionMarkerItem: return true; break;