Zoom session when the mouse pointer is moved up and down during a playhead drag.
authorCarl Hetherington <carl@carlh.net>
Wed, 25 May 2011 16:38:49 +0000 (16:38 +0000)
committerCarl Hetherington <carl@carlh.net>
Wed, 25 May 2011 16:38:49 +0000 (16:38 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9586 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_drag.h

index 1784e59944ad0ab13ba5d4a6290115857dc37811..f8078475d31266dd8086cc3356a7e71b244c0992 100644 (file)
@@ -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 */
 
-       fake_locate (adjusted_frame);
-       
+               /* 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);
+               }
+       }
+               
+       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
index b1e99890e720cdd3e8c0c7e5a59fb77f0c4102ab..3277f0334ca5c46a64d3d73eb36160920e429aa2 100644 (file)
@@ -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 */