Add invisible Rectangle to initiates Tempo(grid) drags

This commit is contained in:
Ben Loftis 2023-09-05 11:29:26 -05:00 committed by Robin Gareus
parent f339236c5b
commit 268d1d33c7
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
6 changed files with 69 additions and 5 deletions

View file

@ -300,6 +300,7 @@ Editor::Editor ()
, _trackview_group (0) , _trackview_group (0)
, _drag_motion_group (0) , _drag_motion_group (0)
, _canvas_drop_zone (0) , _canvas_drop_zone (0)
, _canvas_grid_zone (0)
, no_ruler_shown_update (false) , no_ruler_shown_update (false)
, ruler_grabbed_widget (0) , ruler_grabbed_widget (0)
, ruler_dialog (0) , ruler_dialog (0)

View file

@ -968,6 +968,9 @@ private:
ArdourCanvas::Rectangle* _canvas_drop_zone; ArdourCanvas::Rectangle* _canvas_drop_zone;
bool canvas_drop_zone_event (GdkEvent* event); bool canvas_drop_zone_event (GdkEvent* event);
ArdourCanvas::Rectangle* _canvas_grid_zone;
bool canvas_grid_zone_event (GdkEvent* event);
Glib::RefPtr<Gtk::ToggleAction> ruler_minsec_action; Glib::RefPtr<Gtk::ToggleAction> ruler_minsec_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action; Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action; Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;

View file

@ -292,9 +292,16 @@ Editor::initialize_canvas ()
_canvas_drop_zone->set_outline (false); _canvas_drop_zone->set_outline (false);
_canvas_drop_zone->Event.connect (sigc::mem_fun (*this, &Editor::canvas_drop_zone_event)); _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 _canvas_grid_zone = new ArdourCanvas::Rectangle (hv_scroll_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, 0.0));
handlers. /* 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_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)); _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_drop_zone->set_y1 (_canvas_drop_zone->y0() + (_visible_canvas_height - 20.0));
_canvas_grid_zone->set_y1 (_visible_canvas_height);
// SHOWTRACKS // SHOWTRACKS
if (height_changed) { if (height_changed) {
@ -1508,6 +1517,7 @@ Editor::which_canvas_cursor(ItemType type) const
case VideoBarItem: case VideoBarItem:
case TransportMarkerBarItem: case TransportMarkerBarItem:
case DropZoneItem: case DropZoneItem:
case GridZoneItem:
case SelectionMarkerItem: case SelectionMarkerItem:
cursor = _cursors->grabber; cursor = _cursors->grabber;
break; break;

View file

@ -1160,8 +1160,8 @@ Editor::canvas_drop_zone_event (GdkEvent* event)
case GDK_SCROLL: case GDK_SCROLL:
/* convert coordinates back into window space so that /* 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)); winpos = _track_canvas->canvas_to_window (Duple (event->scroll.x, event->scroll.y));
scroll = event->scroll; scroll = event->scroll;
scroll.x = winpos.x; scroll.x = winpos.x;
@ -1186,6 +1186,50 @@ Editor::canvas_drop_zone_event (GdkEvent* event)
return true; 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 bool
Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context, int x, int y, guint time) Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context, int x, int y, guint time)
{ {

View file

@ -69,6 +69,7 @@ enum ItemType {
SamplesRulerItem, SamplesRulerItem,
SelectionMarkerItem, SelectionMarkerItem,
DropZoneItem, DropZoneItem,
GridZoneItem,
VelocityItem, VelocityItem,
VelocityBaseItem, VelocityBaseItem,

View file

@ -1759,6 +1759,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
} }
break; break;
case GridZoneItem:
default: default:
break; break;
} }
@ -1854,6 +1855,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
} }
return true; return true;
case GridZoneItem:
case MappingBarItem: case MappingBarItem:
return true; return true;
@ -2020,6 +2022,8 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
switch (item_type) { switch (item_type) {
case MappingBarItem: case MappingBarItem:
break; break;
case GridZoneItem:
break;
case ControlPointItem: case ControlPointItem:
if (mouse_mode == MouseDraw || mouse_mode == MouseObject || mouse_mode == MouseContent) { 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) { switch (item_type) {
case MappingBarItem: case MappingBarItem:
case GridZoneItem:
break; break;
case ControlPointItem: case ControlPointItem: