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

View 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 */