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
This commit is contained in:
Carl Hetherington 2011-05-25 16:38:49 +00:00
parent 711db34a81
commit fb39b47861
2 changed files with 40 additions and 8 deletions

View File

@ -2082,6 +2082,8 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
{ {
Drag::start_grab (event, c); Drag::start_grab (event, c);
_grab_zoom = _editor->frames_per_unit;
framepos_t where = _editor->event_frame (event, 0, 0); framepos_t where = _editor->event_frame (event, 0, 0);
_editor->snap_to_with_modifier (where, event); _editor->snap_to_with_modifier (where, event);
@ -2110,17 +2112,46 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
void void
CursorDrag::motion (GdkEvent* event, bool) 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()) { /* zoom when we move the pointer up and down */
return;
/* 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 #ifdef GTKOSX
_editor->update_canvas_now (); _editor->update_canvas_now ();
#endif #endif
}
} }
void void

View File

@ -594,13 +594,14 @@ public:
} }
bool y_movement_matters () const { bool y_movement_matters () const {
return false; return true;
} }
private: private:
void fake_locate (framepos_t); void fake_locate (framepos_t);
bool _stop; ///< true to stop the transport on starting the drag, otherwise false 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 */ /** Region fade-in drag */