diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index bf52948b4b..948b8847f9 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -352,6 +352,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void ensure_time_axis_view_is_visible (const TimeAxisView& tav); void scroll_tracks_down_line (); void scroll_tracks_up_line (); + bool scroll_up_one_track (); + bool scroll_down_one_track (); void prepare_for_cleanup (); void finish_cleanup (); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index a4927192fe..69b63ecb7b 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -477,11 +477,11 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers) XXX this can go away once the two canvases are unified. */ - - Gdk::Rectangle timebars = time_canvas_event_box.get_allocation (); - alloc.set_y (timebars.get_y()); - alloc.set_height (alloc.get_height() + timebars.get_height()); - + + // Gdk::Rectangle timebars = _time_bars_canvas_viewport->get_allocation (); + //alloc.set_y (timebars.get_y()); + //alloc.set_height (alloc.get_height() + timebars.get_height()); + /* if there is no other widget on the right side of the canvas, reduce the effective width of the autoscroll boundary so that we start scrolling @@ -507,11 +507,10 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers) get_window()->get_pointer (x, y, mask); - if (!autoscroll_boundary.contains (ArdourCanvas::Duple (x, y))) { - if (!autoscroll_active()) { - start_canvas_autoscroll (allow_horiz, allow_vert); - } - } + if ((allow_horiz && (x < autoscroll_boundary.x0 || x >= autoscroll_boundary.x1)) || + (allow_vert && (y < autoscroll_boundary.y0 || y >= autoscroll_boundary.y1))) { + start_canvas_autoscroll (allow_horiz, allow_vert); + } } bool @@ -526,8 +525,8 @@ Editor::autoscroll_canvas () int x, y; Gdk::ModifierType mask; frameoffset_t dx = 0; - double dy = 0; bool no_stop = false; + bool y_motion = false; get_window()->get_pointer (x, y, mask); @@ -581,55 +580,34 @@ Editor::autoscroll_canvas () const double vertical_pos = vertical_adjustment.get_value(); double new_pixel = vertical_pos; + const int speed_factor = 20; /* vertical */ new_pixel = vertical_pos; - + if (y < autoscroll_boundary.y0) { /* scroll to make higher tracks visible */ - const int step_size = _visible_canvas_height / 100; - - dy = autoscroll_boundary.y0 - y; - dy += step_size + (step_size * (autoscroll_cnt/10)); - - if (vertical_pos > dy) { - new_pixel = vertical_pos - dy; - } else { - new_pixel = 0; + if (autoscroll_cnt && (autoscroll_cnt % speed_factor == 0)) { + y_motion = scroll_up_one_track (); } - no_stop = true; - } else if (y > autoscroll_boundary.y1) { - /* scroll to make lower tracks visible */ - - const int step_size = _visible_canvas_height / 100; - - dy = y - autoscroll_boundary.y1; - dy += step_size + (step_size * (autoscroll_cnt/10)); - - /* unlike horizontally, we never want to scroll past the lower edge of the full canvas as defined by all visible tracks - */ - new_pixel = min (_full_canvas_height - _visible_canvas_height, min (_full_canvas_height, vertical_pos + dy)); - /* adjust dy to match */ - dy = vertical_pos - new_pixel; - - no_stop = true; - } - - if (new_pixel != vertical_pos) { - vc.add (VisualChange::YOrigin); - vc.y_origin = new_pixel; + if (autoscroll_cnt && (autoscroll_cnt % speed_factor == 0)) { + y_motion = scroll_down_one_track (); + + } } + + no_stop = true; } - if (vc.pending) { + if (vc.pending || y_motion) { - /* change horizontal & vertical position first */ + /* change horizontal first */ visual_changer (vc); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c0d26b7b14..abc90d2f59 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -1276,6 +1276,69 @@ Editor::scroll_tracks_up_line () reset_y_origin (vertical_adjustment.get_value() - 60); } +bool +Editor::scroll_down_one_track () +{ + double vertical_pos = vertical_adjustment.get_value () + vertical_adjustment.get_page_size() - 1.0; + + TrackViewList::reverse_iterator next = track_views.rend(); + std::pair res; + + for (TrackViewList::reverse_iterator t = track_views.rbegin(); t != track_views.rend(); ++t) { + if ((*t)->hidden()) { + continue; + } + + res = (*t)->covers_y_position (vertical_pos); + + if (res.first) { + break; + } + + next = t; + } + + /* move to the track below the first one that covers the */ + + if (next != track_views.rend()) { + ensure_track_visible (*next); + return true; + } + + return false; +} + +bool +Editor::scroll_up_one_track () +{ + double vertical_pos = vertical_adjustment.get_value (); + + TrackViewList::iterator prev = track_views.end(); + std::pair res; + + for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) { + + if ((*t)->hidden()) { + continue; + } + + res = (*t)->covers_y_position(vertical_pos); + + if (res.first) { + break; + } + + prev = t; + } + + if (prev != track_views.end()) { + ensure_track_visible (*prev); + return true; + } + + return false; +} + /* ZOOM */ void diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index d2f0f9c49b..47d08af7f1 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -270,6 +270,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void ensure_time_axis_view_is_visible (const TimeAxisView& tav) = 0; virtual void scroll_tracks_down_line () = 0; virtual void scroll_tracks_up_line () = 0; + virtual bool scroll_down_one_track () = 0; + virtual bool scroll_up_one_track () = 0; virtual void prepare_for_cleanup () = 0; virtual void finish_cleanup () = 0; virtual void reset_x_origin (framepos_t frame) = 0; diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index d373d3f31b..cbd2b995fe 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -298,7 +298,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) e.stepping_axis_view()->step_height (false); return true; } else if (Keyboard::no_modifiers_active (ev->state)) { - _editor.scroll_tracks_up_line(); + _editor.scroll_up_one_track(); return true; } break; @@ -313,7 +313,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) e.stepping_axis_view()->step_height (true); return true; } else if (Keyboard::no_modifiers_active (ev->state)) { - _editor.scroll_tracks_down_line(); + _editor.scroll_down_one_track(); return true; } break;