From fb39b47861a69a774a5f9f2029e7644811af7339 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 25 May 2011 16:38:49 +0000 Subject: [PATCH] Zoom session when the mouse pointer is moved up and down during a playhead drag. git-svn-id: svn://localhost/ardour2/branches/3.0@9586 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_drag.cc | 45 ++++++++++++++++++++++++++++++++------ gtk2_ardour/editor_drag.h | 3 ++- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 1784e59944..f8078475d3 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -2082,6 +2082,8 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c) { Drag::start_grab (event, c); + _grab_zoom = _editor->frames_per_unit; + framepos_t where = _editor->event_frame (event, 0, 0); _editor->snap_to_with_modifier (where, event); @@ -2110,17 +2112,46 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c) void CursorDrag::motion (GdkEvent* event, bool) { - framepos_t const adjusted_frame = adjusted_current_frame (event); + if (_drags->current_pointer_y() != last_pointer_y()) { - if (adjusted_frame == last_pointer_frame()) { - return; + /* zoom when we move the pointer up and down */ + + /* y range to operate over (pixels) */ + double const y_range = 256; + /* we will multiply the grab zoom by a factor between scale_range and scale_range^-1 */ + double const scale_range = 4; + /* dead zone around the grab point in which to do no zooming (pixels) */ + double const dead_zone = 16; + + /* current dy */ + double dy = _drags->current_pointer_y() - grab_y(); + + if (dy < -dead_zone || dy > dead_zone) { + /* we are outside the dead zone; remove it from our calculation */ + if (dy < 0) { + dy += dead_zone; + } else { + dy -= dead_zone; + } + + /* get a number from -1 to 1 as dy ranges from -y_range to y_range */ + double udy = max (min (dy / y_range, 1.0), -1.0); + + /* and zoom, using playhead focus temporarily */ + Editing::ZoomFocus const zf = _editor->get_zoom_focus (); + _editor->set_zoom_focus (Editing::ZoomFocusPlayhead); + _editor->temporal_zoom (_grab_zoom * pow (scale_range, -udy)); + _editor->set_zoom_focus (zf); + } } - - fake_locate (adjusted_frame); - + + framepos_t const adjusted_frame = adjusted_current_frame (event); + if (adjusted_frame != last_pointer_frame()) { + fake_locate (adjusted_frame); #ifdef GTKOSX - _editor->update_canvas_now (); + _editor->update_canvas_now (); #endif + } } void diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index b1e99890e7..3277f0334c 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -594,13 +594,14 @@ public: } bool y_movement_matters () const { - return false; + return true; } private: void fake_locate (framepos_t); bool _stop; ///< true to stop the transport on starting the drag, otherwise false + double _grab_zoom; ///< editor frames per unit when our grab started }; /** Region fade-in drag */