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
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
6 changed files with 69 additions and 5 deletions

View File

@ -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)

View File

@ -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<Gtk::ToggleAction> ruler_minsec_action;
Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_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->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;

View File

@ -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<Gdk::DragContext> const& context, int x, int y, guint time)
{

View File

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

View File

@ -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: