From 7c7853e4ffe7cf3298941bb130a52d79490c8e1b Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 11 Apr 2011 18:48:44 +0000 Subject: Prevent unnecessary recomputation of horizontal zoom parameters after a summary move drag. git-svn-id: svn://localhost/ardour2/branches/3.0@9341 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_summary.cc | 84 ++++++++++++++++++++++++++----------------- gtk2_ardour/editor_summary.h | 2 ++ 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index 442fca93b6..4efb57ffc4 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -275,25 +275,22 @@ EditorSummary::centre_on_click (GdkEventButton* ev) get_editor (&xr, &yr); double const w = xr.second - xr.first; - - xr.first = ev->x - w / 2; - xr.second = ev->x + w / 2; - - if (xr.first < 0) { - xr.first = 0; - xr.second = w; - } else if (xr.second > _width) { - xr.second = _width; - xr.first = _width - w; + double ex = ev->x - w / 2; + if (ex < 0) { + ex = 0; + } else if ((ex + w) > _width) { + ex = _width - w; } - double ey = summary_y_to_editor (ev->y); - ey -= (_editor->canvas_height() - _editor->get_canvas_timebars_vsize ()) / 2; + double const h = yr.second - yr.first; + double ey = ev->y - h / 2; if (ey < 0) { ey = 0; + } else if ((ey + h) > _height) { + ey = _height - h; } - - set_editor (xr, editor_y_to_summary (ey)); + + set_editor (ex, ey); } /** Handle a button press. @@ -463,6 +460,7 @@ EditorSummary::on_motion_notify_event (GdkEventMotion* ev) { pair xr = _start_editor_x; pair yr = _start_editor_y; + double x = _start_editor_x.first; double y = _start_editor_y.first; if (_move_dragging) { @@ -471,8 +469,7 @@ EditorSummary::on_motion_notify_event (GdkEventMotion* ev) /* don't alter x if we clicked outside and above or below the viewbox */ if (_start_position == INSIDE || _start_position == TO_LEFT_OR_RIGHT || _start_position == OTHERWISE_OUTSIDE) { - xr.first += ev->x - _start_mouse_x; - xr.second += ev->x - _start_mouse_x; + x += ev->x - _start_mouse_x; } /* don't alter y if we clicked outside and to the left or right of the viewbox */ @@ -480,16 +477,15 @@ EditorSummary::on_motion_notify_event (GdkEventMotion* ev) y += ev->y - _start_mouse_y; } - if (xr.first < 0) { - xr.second -= xr.first; - xr.first = 0; + if (x < 0) { + x = 0; } if (y < 0) { y = 0; } - set_editor (xr, y); + set_editor (x, y); set_cursor (_start_position); } else if (_zoom_dragging) { @@ -541,6 +537,7 @@ EditorSummary::on_scroll_event (GdkEventScroll* ev) pair xr; pair yr; get_editor (&xr, &yr); + double x = xr.first; double y = yr.first; double amount = 8; @@ -556,11 +553,9 @@ EditorSummary::on_scroll_event (GdkEventScroll* ev) /* primary-wheel == left-right scrolling */ if (ev->direction == GDK_SCROLL_UP) { - xr.first += amount; - xr.second += amount; + x += amount; } else if (ev->direction == GDK_SCROLL_DOWN) { - xr.first -= amount; - xr.second -= amount; + x -= amount; } } else { @@ -570,24 +565,23 @@ EditorSummary::on_scroll_event (GdkEventScroll* ev) } else if (ev->direction == GDK_SCROLL_UP) { y -= amount; } else if (ev->direction == GDK_SCROLL_LEFT) { - xr.first -= amount; - xr.second -= amount; + x -= amount; } else if (ev->direction == GDK_SCROLL_RIGHT) { - xr.first += amount; - xr.second += amount; + x += amount; } } - set_editor (xr, y); + set_editor (x, y); return true; } -/** Set the editor to display a given x range and a y range with the top at a given position. - * The editor's x zoom is adjusted if necessary, but the y zoom is not changed. +/** Set the editor to display a x range with the left at a given position + * and a y range with the top at a given position. * x and y parameters are specified in summary coordinates. + * Zoom is not changed in either direction. */ void -EditorSummary::set_editor (pair const & x, double const y) +EditorSummary::set_editor (double const x, double const y) { if (_editor->pending_visual_change.idle_handler_id >= 0) { @@ -609,6 +603,22 @@ EditorSummary::set_editor (pair const & x, double const y) set_editor_y (y); } +/** Set the editor to display a given x range and a y range with the top at a given position. + * The editor's x zoom is adjusted if necessary, but the y zoom is not changed. + * x and y parameters are specified in summary coordinates. + */ +void +EditorSummary::set_editor (pair const & x, double const y) +{ + if (_editor->pending_visual_change.idle_handler_id >= 0) { + /* see comment in other set_editor () */ + return; + } + + set_editor_x (x); + set_editor_y (y); +} + /** Set the editor to display given x and y ranges. x zoom and track heights are * adjusted if necessary. * x and y parameters are specified in summary coordinates. @@ -625,6 +635,16 @@ EditorSummary::set_editor (pair const & x, pair c set_editor_y (y); } +/** Set the left of the x range visible in the editor. + * Caller should have checked that Editor::pending_visual_change.idle_handler_id is < 0 + * @param x new x left position in summary coordinates. + */ +void +EditorSummary::set_editor_x (double const x) +{ + _editor->reset_x_origin (x / _x_scale + _start); +} + /** Set the x range visible in the editor. * Caller should have checked that Editor::pending_visual_change.idle_handler_id is < 0 * @param x new x range in summary coordinates. diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h index 2b1e5be791..3085f70c49 100644 --- a/gtk2_ardour/editor_summary.h +++ b/gtk2_ardour/editor_summary.h @@ -69,8 +69,10 @@ private: void render (cairo_t *); void render_region (RegionView*, cairo_t*, double) const; void get_editor (std::pair *, std::pair *) const; + void set_editor (double, double); void set_editor (std::pair const &, double); void set_editor (std::pair const &, std::pair const &); + void set_editor_x (double); void set_editor_x (std::pair const &); void set_editor_y (double); void set_editor_y (std::pair const &); -- cgit v1.2.3