diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index dbcb9c5107..c7022b5203 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1413,6 +1413,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*); bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *); + bool canvas_ruler_event (GdkEvent* event, ArdourCanvas::Item *, ItemType); bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 34c81597be..f8fb2f3511 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -162,6 +162,10 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) bool Editor::canvas_scroll_event (GdkEventScroll *event) { + if (h_scroll_group->covers (Duple (event->x, event->y))) { + return canvas_ruler_event ((GdkEvent*) event, timecode_ruler, TimecodeRulerItem); + } + _track_canvas->grab_focus(); return track_canvas_scroll (event); } @@ -979,6 +983,59 @@ Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Me return typed_event (item, event, MeterMarkerItem); } +bool +Editor::canvas_ruler_event (GdkEvent *event, ArdourCanvas::Item* item, ItemType type) +{ + framepos_t xdelta; + bool handled = false; + + if (event->type == GDK_SCROLL) { + + /* scroll events in the rulers are handled a little differently from + scrolling elsewhere in the canvas. + */ + + switch (event->scroll.direction) { + case GDK_SCROLL_UP: + temporal_zoom_step (false); + handled = true; + break; + + case GDK_SCROLL_DOWN: + temporal_zoom_step (true); + handled = true; + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_samples() / 2); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + handled = true; + break; + + case GDK_SCROLL_RIGHT: + xdelta = (current_page_samples() / 2); + if (max_framepos - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_framepos - current_page_samples()); + } + handled = true; + break; + + default: + /* what? */ + break; + } + return handled; + } + + return typed_event (item, event, type); +} + bool Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h index 0e5f367d51..211b0d0212 100644 --- a/gtk2_ardour/editor_items.h +++ b/gtk2_ardour/editor_items.h @@ -56,7 +56,11 @@ enum ItemType { StartCrossFadeItem, EndCrossFadeItem, CrossfadeViewItem, - + TimecodeRulerItem, + MinsecRulerItem, + BBTRulerItem, + SamplesRulerItem, + /* don't remove this */ NoItem diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 13e406e0f0..19a20a7da3 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -164,10 +164,12 @@ Editor::initialize_rulers () lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(videotl_label, PACK_SHRINK, PACK_START)); - // timecode_ruler->Event.connect (...); - // samples_ruler->Event.connect (...); - // bbt_ruler->Event.connect (...); - // minsec_ruler->Event.connect (...); + /* 1 event handler to bind them all ... */ + + timecode_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), timecode_ruler, TimecodeRulerItem)); + minsec_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), minsec_ruler, MinsecRulerItem)); + bbt_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), bbt_ruler, BBTRulerItem)); + samples_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), samples_ruler, SamplesRulerItem)); visible_timebars = 0; /*this will be changed below */ } diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index 75e2cc9df5..867a21dde2 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -167,5 +167,9 @@ setup_gtk_ardour_enums () REGISTER_ENUM (StartCrossFadeItem); REGISTER_ENUM (EndCrossFadeItem); REGISTER_ENUM (CrossfadeViewItem); + REGISTER_ENUM (TimecodeRulerItem); + REGISTER_ENUM (MinsecRulerItem); + REGISTER_ENUM (BBTRulerItem); + REGISTER_ENUM (SamplesRulerItem); REGISTER (item_type); }