summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorNick Mainsbridge <beatroute@iprimus.com.au>2008-10-04 10:38:20 +0000
committerNick Mainsbridge <beatroute@iprimus.com.au>2008-10-04 10:38:20 +0000
commit12cbe6d5023c0a994998feb0177be8b699356848 (patch)
treed5355ac295afe7c4bdbafa9f0fb0aa9d22243a96 /gtk2_ardour
parentad4919ce920a1a588c9ecd3d822dacfb93d74bb7 (diff)
Improve scrolling performance for sessions containing hundreds of regions over many tracks by hiding offscreen tracks (scroll faster by making tracks larger, exposing fewer of them). Use distance from screen edges to drive autoscrolling distance. Avoid using canvas coordinates for displacement calculations where possible. Don't redisplay tempo in the colour handler.
git-svn-id: svn://localhost/ardour2/branches/3.0@3854 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_canvas.cc94
-rw-r--r--gtk2_ardour/editor_route_list.cc1
-rw-r--r--gtk2_ardour/time_axis_view.cc34
-rw-r--r--gtk2_ardour/time_axis_view.h2
5 files changed, 50 insertions, 82 deletions
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index d62057f308..4793770071 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -893,6 +893,7 @@ class Editor : public PublicEditor
gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
+ double last_trackview_group_vertical_offset;
void tie_vertical_scrolling ();
void scroll_canvas_horizontally ();
void scroll_canvas_vertically ();
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index ef6dc25777..045ed9926f 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -346,6 +346,8 @@ Editor::track_canvas_size_allocated ()
reset_hscrollbar_stepping ();
update_fixed_rulers();
redisplay_tempo (false);
+
+ last_trackview_group_vertical_offset = get_trackview_group_vertical_offset ();
Resized (); /* EMIT_SIGNAL */
@@ -364,6 +366,7 @@ Editor::controls_layout_size_request (Requisition* req)
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0) {
pos += tv->effective_height;
+ tv->clip_to_viewport ();
}
}
@@ -542,29 +545,17 @@ Editor::drop_routes (const Glib::RefPtr<Gdk::DragContext>& context,
void
Editor::maybe_autoscroll (GdkEventMotion* event)
{
+
nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
nframes64_t frame = drag_info.current_pointer_frame;
bool startit = false;
- double vertical_pos = vertical_adjustment.get_value();
- double upper = vertical_adjustment.get_upper();
-
- /*
- adjust the event.y to take account of the bounds
- of the _trackview_group
- */
-
- double vsx1, vsx2, vsy1, vsy2;
- _trackview_group->get_bounds (vsx1, vsy1, vsx2, vsy2);
autoscroll_y = 0;
autoscroll_x = 0;
-
- if ((event->y - vsy1) < vertical_pos) {
+ if (event->y < canvas_timebars_vsize) {
autoscroll_y = -1;
startit = true;
- }
-
- if ((event->y - vsy1) > (vertical_pos + canvas_height - canvas_timebars_vsize) && vertical_pos <= upper) {
+ } else if (event->y > canvas_height) {
autoscroll_y = 1;
startit = true;
}
@@ -652,47 +643,20 @@ Editor::autoscroll_canvas ()
double new_pixel;
double target_pixel;
- if (autoscroll_x_distance != 0) {
-
- if (autoscroll_cnt == 50) { /* 0.5 seconds */
-
- /* after about a while, speed up a bit by changing the timeout interval */
-
- autoscroll_x_distance = (nframes64_t) floor (current_page_frames()/30.0f);
-
- } else if (autoscroll_cnt == 150) { /* 1.0 seconds */
-
- autoscroll_x_distance = (nframes64_t) floor (current_page_frames()/20.0f);
-
- } else if (autoscroll_cnt == 300) { /* 1.5 seconds */
-
- /* after about another while, speed up by increasing the shift per callback */
-
- autoscroll_x_distance = (nframes64_t) floor (current_page_frames()/10.0f);
-
- }
- }
-
- if (autoscroll_y_distance != 0) {
-
- if (autoscroll_cnt == 50) { /* 0.5 seconds */
-
- /* after about a while, speed up a bit by changing the timeout interval */
-
- autoscroll_y_distance = 10;
-
- } else if (autoscroll_cnt == 150) { /* 1.0 seconds */
-
- autoscroll_y_distance = 20;
-
- } else if (autoscroll_cnt == 300) { /* 1.5 seconds */
-
- /* after about another while, speed up by increasing the shift per callback */
-
- autoscroll_y_distance = 40;
- }
+ if (autoscroll_x > 0) {
+ autoscroll_x_distance = (unit_to_frame (drag_info.current_pointer_x) - (leftmost_frame + current_page_frames())) / 3;
+ } else if (autoscroll_x < 0) {
+ autoscroll_x_distance = (leftmost_frame - unit_to_frame (drag_info.current_pointer_x)) / 3;
+
}
-
+
+ if (autoscroll_y > 0) {
+ autoscroll_y_distance = (drag_info.current_pointer_y - (get_trackview_group_vertical_offset() + canvas_height)) / 3;
+ } else if (autoscroll_y < 0) {
+
+ autoscroll_y_distance = (vertical_adjustment.get_value () - drag_info.current_pointer_y) / 3;
+ }
+
if (autoscroll_x < 0) {
if (leftmost_frame < autoscroll_x_distance) {
new_frame = 0;
@@ -747,8 +711,6 @@ Editor::autoscroll_canvas ()
new_pixel = vertical_pos;
}
-
-
if ((new_frame == 0 || new_frame == limit) && (new_pixel == 0 || new_pixel == DBL_MAX)) {
/* we are done */
return false;
@@ -758,8 +720,6 @@ Editor::autoscroll_canvas ()
reset_x_origin (new_frame);
}
- vertical_adjustment.set_value (new_pixel);
-
/* fake an event. */
Glib::RefPtr<Gdk::Window> canvas_window = const_cast<Editor*>(this)->track_canvas->get_window();
@@ -773,6 +733,8 @@ Editor::autoscroll_canvas ()
motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true);
+ vertical_adjustment.set_value (new_pixel);
+
autoscroll_cnt++;
if (autoscroll_cnt == 1) {
@@ -872,13 +834,16 @@ void
Editor::scroll_canvas_vertically ()
{
/* vertical scrolling only */
- double x1, x2, y1, y2, y_delta;
+ double y_delta;
- _trackview_group->get_bounds(x1, y1, x2, y2);
- y_delta = y1 + get_trackview_group_vertical_offset ();
+ y_delta = last_trackview_group_vertical_offset - get_trackview_group_vertical_offset ();
- _trackview_group->move (0, -y_delta);
+ _trackview_group->move (0, y_delta);
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+ (*i)->clip_to_viewport ();
+ }
+ last_trackview_group_vertical_offset = get_trackview_group_vertical_offset ();
/* required to keep the controls_layout in lock step with the canvas group */
track_canvas->update_now ();
}
@@ -966,13 +931,14 @@ Editor::color_handler()
location_punch_color = ARDOUR_UI::config()->canvasvar_LocationPunch.get();
refresh_location_display ();
+/*
redisplay_tempo (true);
if (session)
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
+*/
}
-
void
Editor::flush_canvas ()
{
diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc
index 6dde6bfab1..c051ef3c61 100644
--- a/gtk2_ardour/editor_route_list.cc
+++ b/gtk2_ardour/editor_route_list.cc
@@ -344,6 +344,7 @@ Editor::redisplay_route_list ()
if (visible) {
tv->set_marked_for_display (true);
position += tv->show_at (position, n, &edit_controls_vbox);
+ tv->clip_to_viewport ();
} else {
tv->hide ();
}
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index 8e0463d769..9db77c1649 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -235,30 +235,15 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
order = nth;
if (y_position != y) {
- /* the coordinates used here are in the system of the
- item's parent ...
- */
-
- Group* pg;
- double ix1, iy1, ix2, iy2;
- canvas_display->get_bounds (ix1, iy1, ix2, iy2);
- iy1 += editor.get_trackview_group_vertical_offset ();
- pg = canvas_display->property_parent();
- pg->i2w (ix1, iy1);
-
- if (iy1 < 0) {
- iy1 = 0;
- }
-
- canvas_display->move (0.0, y - iy1);
-
+ canvas_display->property_y () = y;
+ canvas_display->move (0.0, 0.0);
y_position = y;
}
+
canvas_display->raise_to_top ();
if (_marked_for_display) {
- canvas_display->show();
controls_hbox.show ();
controls_ebox.show ();
}
@@ -279,6 +264,19 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
return effective_height;
}
+void
+TimeAxisView::clip_to_viewport ()
+{
+ if (_marked_for_display) {
+ if (y_position + effective_height < editor.get_trackview_group_vertical_offset () || y_position > editor.get_trackview_group_vertical_offset () + canvas_display->get_canvas()->get_height()) {
+ canvas_display->hide ();
+ return;
+ }
+ canvas_display->show ();
+ }
+ return;
+}
+
bool
TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
{
diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h
index 9d0c536a8f..277e4dba44 100644
--- a/gtk2_ardour/time_axis_view.h
+++ b/gtk2_ardour/time_axis_view.h
@@ -143,6 +143,8 @@ class TimeAxisView : public virtual AxisView, public PBD::Stateful
*/
virtual guint32 show_at (double y, int& nth, Gtk::VBox *parent);
+ void clip_to_viewport ();
+
bool touched (double top, double bot);
/** Hides this TrackView */