implemented rubberband zoom in timeline
This commit is contained in:
@@ -32,28 +32,59 @@ void TimelineWidget::ZoomTool::MousePress(TimelineViewMouseEvent *event)
|
||||
|
||||
void TimelineWidget::ZoomTool::MouseMove(TimelineViewMouseEvent *event)
|
||||
{
|
||||
Q_UNUSED(event)
|
||||
if (dragging_) {
|
||||
parent()->MoveRubberBandSelect(false, false);
|
||||
} else {
|
||||
parent()->StartRubberBandSelect(false, false);
|
||||
|
||||
dragging_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
void TimelineWidget::ZoomTool::MouseRelease(TimelineViewMouseEvent *event)
|
||||
{
|
||||
double scale = parent()->scale_;
|
||||
if (dragging_) {
|
||||
// Zoom into the rubberband selection
|
||||
QRect screen_coords = parent()->rubberband_.geometry();
|
||||
|
||||
// Normalize zoom location for 1.0 scale
|
||||
double frame_x = parent()->TimeToScene(event->GetFrame());
|
||||
parent()->EndRubberBandSelect(false, false);
|
||||
|
||||
if (event->GetModifiers() & Qt::AltModifier) {
|
||||
// Zoom out if the user clicks while holding Alt
|
||||
scale *= 0.5;
|
||||
TimelineView* reference_view = parent()->views_.first()->view();
|
||||
QPointF scene_topleft = reference_view->mapToScene(reference_view->mapFrom(parent(), screen_coords.topLeft()));
|
||||
QPointF scene_bottomright = reference_view->mapToScene(reference_view->mapFrom(parent(), screen_coords.bottomRight()));
|
||||
|
||||
double scene_left = scene_topleft.x();
|
||||
double scene_right = scene_bottomright.x();
|
||||
|
||||
// Normalize scale to 1.0 scale
|
||||
double scene_width = (scene_right - scene_left) / parent()->scale_;
|
||||
|
||||
double new_scale = qMin(TimelineViewBase::kMaximumScale, static_cast<double>(reference_view->viewport()->width()) / scene_width);
|
||||
parent()->deferred_scroll_value_ = qMax(0, qRound(scene_left / parent()->scale_ * new_scale));
|
||||
|
||||
parent()->SetScale(new_scale, false);
|
||||
|
||||
dragging_ = false;
|
||||
} else {
|
||||
// Otherwise zoom in
|
||||
scale *= 2;
|
||||
// Simple zoom in/out at the cursor position
|
||||
double scale = parent()->scale_;
|
||||
|
||||
if (event->GetModifiers() & Qt::AltModifier) {
|
||||
// Zoom out if the user clicks while holding Alt
|
||||
scale *= 0.5;
|
||||
} else {
|
||||
// Otherwise zoom in
|
||||
scale *= 2.0;
|
||||
}
|
||||
|
||||
parent()->SetScale(scale, false);
|
||||
|
||||
// Adjust scroll location for new scale
|
||||
double frame_x = event->GetFrame().toDouble() * scale;
|
||||
|
||||
parent()->deferred_scroll_value_ = qMax(0, qRound(frame_x - parent()->views_.first()->view()->viewport()->width()/2));
|
||||
}
|
||||
|
||||
parent()->SetScale(scale);
|
||||
|
||||
// Adjust zoom location for new scale
|
||||
frame_x *= scale;
|
||||
|
||||
parent()->CenterOn(frame_x);
|
||||
// (using a hacky singleShot so the scroll occurs after the scene and its scrollbars have updated)
|
||||
QTimer::singleShot(0, parent(), &TimelineWidget::DeferredScrollAction);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user