implemented rubberband zoom in timeline

This commit is contained in:
itsmattkc
2020-01-07 20:24:07 +11:00
parent 5bdc631da8
commit c8baf4aa3e
13 changed files with 99 additions and 50 deletions
+46 -15
View File
@@ -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);
}