{
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);
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