diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 9bcbe4fc98..06ab772133 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1728,6 +1728,7 @@ private: bool canvas_ruler_event (GdkEvent* event, ArdourCanvas::Item*, ItemType); bool canvas_ruler_bar_event (GdkEvent* event, ArdourCanvas::Item*, ItemType, std::string const&); + bool canvas_selection_marker_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*); void update_video_timeline (bool flush = false); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 67c53584d8..a109166e31 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -1480,6 +1480,7 @@ Editor::which_canvas_cursor(ItemType type) const case MinsecRulerItem: case BBTRulerItem: case SamplesRulerItem: + case SelectionMarkerItem: cursor = _cursors->timebar; break; diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 66923f875a..e45e9f8875 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -978,6 +978,12 @@ Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, ArdourMa return typed_event (item, event, MarkerItem); } +bool +Editor::canvas_selection_marker_event (GdkEvent *event, ArdourCanvas::Item* item) +{ + return typed_event (item, event, SelectionMarkerItem); +} + bool Editor::canvas_videotl_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h index 088f3030d8..abe2acbe77 100644 --- a/gtk2_ardour/editor_items.h +++ b/gtk2_ardour/editor_items.h @@ -66,6 +66,7 @@ enum ItemType { MinsecRulerItem, BBTRulerItem, SamplesRulerItem, + SelectionMarkerItem, DropZoneItem, /* don't remove this */ diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 389b71aea0..79012d4dd6 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -849,6 +849,7 @@ 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); @@ -1698,6 +1699,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SamplesRulerItem: case MinsecRulerItem: case BBTRulerItem: + case SelectionMarkerItem: popup_ruler_menu (where, item_type); break; @@ -1839,6 +1841,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SamplesRulerItem: case MinsecRulerItem: case BBTRulerItem: + case SelectionMarkerItem: return true; break; diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 8d46cd355c..15ed3cb59a 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -716,6 +716,17 @@ MetricMarker::MetricMarker (PublicEditor& ed, ArdourCanvas::Item& parent, guint3 { } +/***********************************************************************/ +SelectionMarker::SelectionMarker (PublicEditor& editor, ArdourCanvas::Item& parent, guint32 rgba, Type type) + : ArdourMarker (editor, parent, rgba, "", type, timepos_t(0), false) +{ + assert (type == SelectionStart || type == SelectionEnd); +#ifdef CANVAS_DEBUG + group->name = string_compose ("Marker::group for %1", type == SelectionStart ? "SelectionStart" : "SelectionEnd"); +#endif + group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_selection_marker_event), group)); +} + /***********************************************************************/ TempoMarker::TempoMarker (PublicEditor& editor, ArdourCanvas::Item& parent, ArdourCanvas::Item& text_parent, guint32 rgba, const string& text, Temporal::TempoPoint const & temp, samplepos_t sample, uint32_t curve_color) diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index 3ee3cb4c45..f2c4aaa582 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -171,6 +171,12 @@ private: ArdourMarker & operator= (ArdourMarker const &); }; +class SelectionMarker : public ArdourMarker +{ + public: + SelectionMarker (PublicEditor& ed, ArdourCanvas::Item& parent, guint32 rgba, Type); +}; + class MetricMarker : public ArdourMarker { public: diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 449d6aed50..5d9887aeb3 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -469,6 +469,7 @@ public: virtual bool canvas_stream_view_event (GdkEvent* event, ArdourCanvas::Item*, RouteTimeAxisView*) = 0; virtual bool canvas_marker_event (GdkEvent* event, ArdourCanvas::Item*, ArdourMarker*) = 0; virtual bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*) = 0; + virtual bool canvas_selection_marker_event (GdkEvent* event, ArdourCanvas::Item*) = 0; virtual bool canvas_tempo_marker_event (GdkEvent* event, ArdourCanvas::Item*, TempoMarker*) = 0; virtual bool canvas_tempo_curve_event (GdkEvent* event, ArdourCanvas::Item*, TempoCurve*) = 0; virtual bool canvas_meter_marker_event (GdkEvent* event, ArdourCanvas::Item*, MeterMarker*) = 0;