summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mainsbridge <beatroute@iprimus.com.au>2008-10-04 08:23:29 +0000
committerNick Mainsbridge <beatroute@iprimus.com.au>2008-10-04 08:23:29 +0000
commitf138091f7e6413623390cd2168aaac7d0a7d71c2 (patch)
tree2ac78d0cba4edaab208bb2724ddc13d28c819093
parent51f2a5fc4ee73752cb635db913769f9d47941933 (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/2.0-ongoing@3853 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/automation_time_axis.cc10
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_canvas.cc79
-rw-r--r--gtk2_ardour/editor_route_list.cc1
-rw-r--r--gtk2_ardour/time_axis_view.cc35
-rw-r--r--gtk2_ardour/time_axis_view.h2
6 files changed, 51 insertions, 77 deletions
diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc
index 12a0f8a86a..f67dd96034 100644
--- a/gtk2_ardour/automation_time_axis.cc
+++ b/gtk2_ardour/automation_time_axis.cc
@@ -367,11 +367,11 @@ AutomationTimeAxisView::set_height (uint32_t h)
clear_button.hide();
hide_button.hide();
}
- } else if (h >= hNormal){
- auto_button.show();
- height_button.show();
- clear_button.show();
- hide_button.show_all();
+ } else if (h >= hNormal){
+ auto_button.show();
+ height_button.show();
+ clear_button.show();
+ hide_button.show_all();
}
if (changed) {
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 4afce621cf..019ffcadc1 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -838,6 +838,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 53f114c962..870f195bae 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -333,6 +333,8 @@ Editor::track_canvas_size_allocated ()
update_fixed_rulers();
+ last_trackview_group_vertical_offset = get_trackview_group_vertical_offset ();
+
Resized (); /* EMIT_SIGNAL */
return false;
@@ -350,6 +352,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 ();
}
}
@@ -511,29 +514,17 @@ Editor::drop_regions (const 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;
}
@@ -622,44 +613,21 @@ Editor::autoscroll_canvas ()
double target_pixel;
if (autoscroll_x_distance != 0) {
+ 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_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_y > 0) {
+ autoscroll_y_distance = (drag_info.current_pointer_y - (get_trackview_group_vertical_offset() + canvas_height)) / 3;
+ } else if (autoscroll_y < 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;
- }
+ autoscroll_y_distance = (vertical_adjustment.get_value () - drag_info.current_pointer_y) / 3;
+ }
}
if (autoscroll_x < 0) {
@@ -716,8 +684,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;
@@ -843,13 +809,16 @@ 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 ();
}
@@ -938,10 +907,12 @@ 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
diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc
index 78a7754e5a..659876407d 100644
--- a/gtk2_ardour/editor_route_list.cc
+++ b/gtk2_ardour/editor_route_list.cc
@@ -301,6 +301,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 0ca20e4670..88d585ddc2 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -222,29 +222,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;
+ /* silly canvas */
+ canvas_display->move (0.0, 0.0);
y_position = y;
-
}
canvas_display->raise_to_top ();
if (_marked_for_display) {
- canvas_display->show();
controls_frame.show ();
controls_ebox.show ();
}
@@ -266,6 +252,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)
{
@@ -380,8 +379,8 @@ TimeAxisView::set_height(uint32_t h)
if (h == height) {
return;
}
- controls_frame.property_height_request () = h;
height = h;
+ controls_frame.property_height_request () = h;
if (canvas_item_visible (selection_group)) {
/* resize the selection rect */
diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h
index 2f014c7a16..059312c16b 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 Stateful
*/
virtual guint32 show_at (double y, int& nth, Gtk::VBox *parent);
+ void clip_to_viewport ();
+
bool touched (double top, double bot);
/**