add canvas rulers event dispatch and reinstate scrolling behaviour

This commit is contained in:
Paul Davis 2014-06-12 15:58:05 -04:00
parent 590882f3c8
commit ea355bfe15
5 changed files with 73 additions and 5 deletions

View File

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

View File

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

View File

@ -56,7 +56,11 @@ enum ItemType {
StartCrossFadeItem,
EndCrossFadeItem,
CrossfadeViewItem,
TimecodeRulerItem,
MinsecRulerItem,
BBTRulerItem,
SamplesRulerItem,
/* don't remove this */
NoItem

View File

@ -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 */
}

View File

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