diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 8287bde9f1..1667ce6cd2 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -580,6 +580,7 @@ class Editor : public PublicEditor gint ruler_button_press (GdkEventButton*); gint ruler_button_release (GdkEventButton*); gint ruler_mouse_motion (GdkEventMotion*); + bool ruler_scroll (GdkEventScroll* event); gint ruler_pressed_button; Gtk::Widget * ruler_grabbed_widget; @@ -1279,12 +1280,15 @@ class Editor : public PublicEditor bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*); bool track_canvas_scroll (GdkEventScroll* event); + bool time_canvas_scroll (GdkEventScroll* event); bool track_canvas_scroll_event (GdkEventScroll* event); bool track_canvas_button_press_event (GdkEventButton* event); bool track_canvas_button_release_event (GdkEventButton* event); bool track_canvas_motion_notify_event (GdkEventMotion* event); + bool time_canvas_scroll_event (GdkEventScroll* event); + Gtk::Allocation canvas_allocation; bool canvas_idle_queued; void track_canvas_allocate (Gtk::Allocation alloc); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index b9444205c4..78b54754d9 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -102,6 +102,9 @@ Editor::initialize_canvas () track_canvas.signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event)); track_canvas.signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event)); + /* just scroll stuff for the timecanvas */ + time_canvas.signal_scroll_event().connect (mem_fun (*this, &Editor::time_canvas_scroll_event)); + track_canvas.set_name ("EditorMainCanvas"); track_canvas.add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK); track_canvas.signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas)); diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index f7e7a590dd..e5ef336fd0 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -157,6 +157,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) return false; } + bool Editor::track_canvas_scroll_event (GdkEventScroll *event) { @@ -165,6 +166,58 @@ Editor::track_canvas_scroll_event (GdkEventScroll *event) return false; } +bool +Editor::time_canvas_scroll (GdkEventScroll* ev) +{ + int x, y; + double wx, wy; + nframes_t xdelta; + int direction = ev->direction; + + retry: + switch (direction) { + case GDK_SCROLL_UP: + temporal_zoom_step (true); + break; + + case GDK_SCROLL_DOWN: + temporal_zoom_step (false); + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_frames() / 2); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + break; + + case GDK_SCROLL_RIGHT: + xdelta = (current_page_frames() / 2); + if (max_frames - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_frames - current_page_frames()); + } + break; + + default: + /* what? */ + break; + } + + return false; +} + +bool +Editor::time_canvas_scroll_event (GdkEventScroll *event) +{ + time_canvas.grab_focus(); + time_canvas_scroll (event); + return false; +} + bool Editor::track_canvas_button_press_event (GdkEventButton *event) { diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 149116193a..9b8bf5beeb 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -99,30 +99,56 @@ Editor::initialize_rulers () ruler_shown[ruler_metric_frames] = false; ruler_shown[ruler_metric_minsec] = false; - smpte_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - bbt_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - frames_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - minsec_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - - smpte_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - bbt_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - frames_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - minsec_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - - smpte_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - bbt_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - frames_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - minsec_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - - smpte_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - bbt_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - frames_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - minsec_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - visible_timebars = 7; /* 4 here, 3 in time_canvas */ ruler_pressed_button = 0; } +bool +Editor::ruler_scroll (GdkEventScroll* event) +{ + nframes_t xdelta; + int direction = event->direction; + bool handled = false; + + switch (direction) { + case GDK_SCROLL_UP: + temporal_zoom_step (true); + handled = true; + break; + + case GDK_SCROLL_DOWN: + temporal_zoom_step (false); + handled = true; + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_frames() / 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_frames() / 2); + if (max_frames - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_frames - current_page_frames()); + } + handled = true; + break; + + default: + /* what? */ + break; + } + + return handled; +} + gint Editor::ruler_button_press (GdkEventButton* ev) @@ -621,11 +647,10 @@ Editor::update_ruler_visibility () minsec_ruler->set_size_request (-1, (int)timebar_height); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]); - - smpte_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - bbt_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - frames_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - minsec_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); + smpte_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + bbt_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + frames_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + minsec_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); smpte_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); bbt_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); @@ -642,6 +667,11 @@ Editor::update_ruler_visibility () frames_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); minsec_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); + smpte_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + bbt_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + frames_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + minsec_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START)); if (ruler_shown[ruler_metric_minsec]) {