summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-06-12 15:58:05 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-06-12 15:58:05 -0400
commitea355bfe15c8490ebc81fd093eeae8359fed77fa (patch)
tree4145762cef368ab69b0f2ec7676fb201b740a156
parent590882f3c8e063528452d71daffb36d3151da05e (diff)
add canvas rulers event dispatch and reinstate scrolling behaviour
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_canvas_events.cc57
-rw-r--r--gtk2_ardour/editor_items.h6
-rw-r--r--gtk2_ardour/editor_rulers.cc10
-rw-r--r--gtk2_ardour/enums.cc4
5 files changed, 73 insertions, 5 deletions
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);
}
@@ -980,6 +984,59 @@ Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Me
}
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)
{
return typed_event (item, event, TempoBarItem);
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);
}