From 268d1d33c7244952f7e1f20b8b01f297088f9eb0 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Tue, 5 Sep 2023 11:29:26 -0500 Subject: [PATCH] Add invisible Rectangle to initiates Tempo(grid) drags --- gtk2_ardour/editor.cc | 1 + gtk2_ardour/editor.h | 3 ++ gtk2_ardour/editor_canvas.cc | 16 ++++++++-- gtk2_ardour/editor_canvas_events.cc | 48 +++++++++++++++++++++++++++-- gtk2_ardour/editor_items.h | 1 + gtk2_ardour/editor_mouse.cc | 5 +++ 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 7844362339..8c74ada03c 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -300,6 +300,7 @@ Editor::Editor () , _trackview_group (0) , _drag_motion_group (0) , _canvas_drop_zone (0) + , _canvas_grid_zone (0) , no_ruler_shown_update (false) , ruler_grabbed_widget (0) , ruler_dialog (0) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 676c918d80..5185687c48 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -968,6 +968,9 @@ private: ArdourCanvas::Rectangle* _canvas_drop_zone; bool canvas_drop_zone_event (GdkEvent* event); + ArdourCanvas::Rectangle* _canvas_grid_zone; + bool canvas_grid_zone_event (GdkEvent* event); + Glib::RefPtr ruler_minsec_action; Glib::RefPtr ruler_timecode_action; Glib::RefPtr ruler_samples_action; diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index bd0e732b7f..79fb331558 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -292,9 +292,16 @@ Editor::initialize_canvas () _canvas_drop_zone->set_outline (false); _canvas_drop_zone->Event.connect (sigc::mem_fun (*this, &Editor::canvas_drop_zone_event)); - /* these signals will initially be delivered to the canvas itself, but if they end up remaining unhandled, they are passed to Editor-level - handlers. - */ + _canvas_grid_zone = new ArdourCanvas::Rectangle (hv_scroll_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, 0.0)); + /* this thing is transparent */ + _canvas_grid_zone->set_fill (false); + _canvas_grid_zone->set_outline (false); + _canvas_grid_zone->Event.connect (sigc::mem_fun (*this, &Editor::canvas_grid_zone_event)); + _canvas_grid_zone->set_ignore_events (true); + + /* these signals will initially be delivered to the canvas itself, but if they end up remaining unhandled, + * they are passed to Editor-level handlers. + */ _track_canvas->signal_scroll_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_scroll_event), true)); _track_canvas->signal_motion_notify_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_motion_notify_event)); @@ -350,6 +357,8 @@ Editor::track_canvas_viewport_size_allocated () _canvas_drop_zone->set_y1 (_canvas_drop_zone->y0() + (_visible_canvas_height - 20.0)); + _canvas_grid_zone->set_y1 (_visible_canvas_height); + // SHOWTRACKS if (height_changed) { @@ -1508,6 +1517,7 @@ Editor::which_canvas_cursor(ItemType type) const case VideoBarItem: case TransportMarkerBarItem: case DropZoneItem: + case GridZoneItem: case SelectionMarkerItem: cursor = _cursors->grabber; break; diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 8f97062b4f..b9eb57766c 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -1160,8 +1160,8 @@ Editor::canvas_drop_zone_event (GdkEvent* event) case GDK_SCROLL: /* convert coordinates back into window space so that - we can just call canvas_scroll_event(). - */ + * we can just call canvas_scroll_event(). + */ winpos = _track_canvas->canvas_to_window (Duple (event->scroll.x, event->scroll.y)); scroll = event->scroll; scroll.x = winpos.x; @@ -1186,6 +1186,50 @@ Editor::canvas_drop_zone_event (GdkEvent* event) return true; } +bool +Editor::canvas_grid_zone_event (GdkEvent* event) +{ + GdkEventScroll scroll; + ArdourCanvas::Duple winpos; + + switch (event->type) { + + case GDK_BUTTON_PRESS: + choose_mapping_drag (_canvas_grid_zone, event); + break; + + case GDK_BUTTON_RELEASE: + return typed_event (_canvas_grid_zone, event, GridZoneItem); + break; + + case GDK_SCROLL: + /* convert coordinates back into window space so that + * we can just call canvas_scroll_event(). + */ + winpos = _track_canvas->canvas_to_window (Duple (event->scroll.x, event->scroll.y)); + scroll = event->scroll; + scroll.x = winpos.x; + scroll.y = winpos.y; + return canvas_scroll_event (&scroll, true); + break; + + case GDK_ENTER_NOTIFY: + return typed_event (_canvas_grid_zone, event, GridZoneItem); + + case GDK_LEAVE_NOTIFY: + return typed_event (_canvas_grid_zone, event, GridZoneItem); + + case GDK_MOTION_NOTIFY: + return motion_handler (_canvas_grid_zone, event); + break; + + default: + break; + } + + return true; +} + bool Editor::track_canvas_drag_motion (Glib::RefPtr const& context, int x, int y, guint time) { diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h index 3f1a456ba4..07a40261b4 100644 --- a/gtk2_ardour/editor_items.h +++ b/gtk2_ardour/editor_items.h @@ -69,6 +69,7 @@ enum ItemType { SamplesRulerItem, SelectionMarkerItem, DropZoneItem, + GridZoneItem, VelocityItem, VelocityBaseItem, diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index c6fec87be9..4e157e2e45 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1759,6 +1759,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } break; + case GridZoneItem: default: break; } @@ -1854,6 +1855,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } return true; + case GridZoneItem: case MappingBarItem: return true; @@ -2020,6 +2022,8 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ switch (item_type) { case MappingBarItem: break; + case GridZoneItem: + break; case ControlPointItem: if (mouse_mode == MouseDraw || mouse_mode == MouseObject || mouse_mode == MouseContent) { @@ -2167,6 +2171,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) switch (item_type) { case MappingBarItem: + case GridZoneItem: break; case ControlPointItem: