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:
parent
711db34a81
commit
fb39b47861
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user