diff --git a/app/widget/handmovableview/handmovableview.cpp b/app/widget/handmovableview/handmovableview.cpp index d7b748195..83052dea3 100644 --- a/app/widget/handmovableview/handmovableview.cpp +++ b/app/widget/handmovableview/handmovableview.cpp @@ -150,16 +150,21 @@ const HandMovableView::DragMode &HandMovableView::GetDefaultDragMode() const return default_drag_mode_; } -bool HandMovableView::WheelEventIsAZoomEvent(QWheelEvent *event) const +bool HandMovableView::WheelEventIsAZoomEvent(QWheelEvent *event) { return (static_cast(event->modifiers() & Qt::ControlModifier) == !OLIVE_CONFIG("ScrollZooms").toBool()); } +qreal HandMovableView::GetScrollZoomMultiplier(QWheelEvent *event) +{ + return 1.0 + (static_cast(event->angleDelta().x() + event->angleDelta().y()) * 0.001); +} + void HandMovableView::wheelEvent(QWheelEvent *event) { if (WheelEventIsAZoomEvent(event)) { if (!event->angleDelta().isNull()) { - qreal multiplier = 1.0 + (static_cast(event->angleDelta().x() + event->angleDelta().y()) * 0.001); + qreal multiplier = GetScrollZoomMultiplier(event); QPointF cursor_pos; #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) diff --git a/app/widget/handmovableview/handmovableview.h b/app/widget/handmovableview/handmovableview.h index 63c09cb18..15fd8fc38 100644 --- a/app/widget/handmovableview/handmovableview.h +++ b/app/widget/handmovableview/handmovableview.h @@ -34,6 +34,10 @@ class HandMovableView : public QGraphicsView public: HandMovableView(QWidget* parent = nullptr); + static bool WheelEventIsAZoomEvent(QWheelEvent* event); + + static qreal GetScrollZoomMultiplier(QWheelEvent* event); + protected: virtual void ToolChangedEvent(Tool::Item tool){Q_UNUSED(tool)} @@ -44,8 +48,6 @@ protected: void SetDefaultDragMode(DragMode mode); const DragMode& GetDefaultDragMode() const; - bool WheelEventIsAZoomEvent(QWheelEvent* event) const; - virtual void wheelEvent(QWheelEvent* event) override; virtual void ZoomIntoCursorPosition(QWheelEvent* event, double multiplier, const QPointF &cursor_pos); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index b84d0dec2..c461743b9 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -1373,10 +1373,10 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) Menu* zoom_menu = new Menu(tr("Zoom"), &menu); menu.addMenu(zoom_menu); - int zoom_levels[] = {10, 25, 50, 75, 100, 150, 200, 400}; zoom_menu->addAction(tr("Fit"))->setData(0); - for (int i=0;i<8;i++) { - zoom_menu->addAction(tr("%1%").arg(zoom_levels[i]))->setData(zoom_levels[i]); + for (int i=0;iaddAction(tr("%1%").arg(z))->setData(z); } connect(zoom_menu, &QMenu::triggered, this, &ViewerWidget::SetZoomFromMenu); diff --git a/app/widget/viewer/viewersizer.cpp b/app/widget/viewer/viewersizer.cpp index a766ec76f..505cb4eb9 100644 --- a/app/widget/viewer/viewersizer.cpp +++ b/app/widget/viewer/viewersizer.cpp @@ -20,7 +20,12 @@ #include "viewersizer.h" +#include +#include #include +#include + +#include "widget/handmovableview/handmovableview.h" namespace olive { @@ -30,7 +35,8 @@ ViewerSizer::ViewerSizer(QWidget *parent) : width_(0), height_(0), pixel_aspect_(1), - zoom_(0) + zoom_(0), + current_widget_scale_(0) { horiz_scrollbar_ = new QScrollBar(Qt::Horizontal, this); horiz_scrollbar_->setVisible(false); @@ -52,6 +58,7 @@ void ViewerSizer::SetWidget(QWidget *widget) if (widget_ != nullptr) { widget_->setParent(this); + widget_->installEventFilter(this); UpdateSize(); } @@ -90,6 +97,51 @@ void ViewerSizer::HandDragMove(int x, int y) } } +bool ViewerSizer::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == widget_) { + if (event->type() == QEvent::Wheel) { + QWheelEvent *w = static_cast(event); + + if (HandMovableView::WheelEventIsAZoomEvent(w)) { + int x = w->angleDelta().x() + w->angleDelta().y(); + + int current_percent = zoom_; + if (current_percent == 0) { + // Currently set to "fit" + current_percent = current_widget_scale_; + } + + if (x > 0) { + // Zoom in + for (int i=kZoomLevelCount-2; i>=0; i--) { + if (current_percent >= kZoomLevels[i]) { + SetZoom(kZoomLevels[i+1]); + break; + } + } + } else if (x < 0) { + // Zoom out + for (int i=1; ipixelDelta(); + horiz_scrollbar_->setValue(horiz_scrollbar_->value() - p.x()); + vert_scrollbar_->setValue(vert_scrollbar_->value() - p.y()); + } + return true; + } + } + + return QWidget::eventFilter(watched, event); +} + void ViewerSizer::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); @@ -169,6 +221,8 @@ void ViewerSizer::UpdateSize() } + current_widget_scale_ = current_scale * 100; + if (zoom_ > 0) { // Scale to get to the requested zoom diff --git a/app/widget/viewer/viewersizer.h b/app/widget/viewer/viewersizer.h index b4afe5015..21cb532f1 100644 --- a/app/widget/viewer/viewersizer.h +++ b/app/widget/viewer/viewersizer.h @@ -51,6 +51,9 @@ public: */ void SetWidget(QWidget* widget); + static constexpr int kZoomLevelCount = 8; + static constexpr int kZoomLevels[kZoomLevelCount] = {10, 25, 50, 75, 100, 150, 200, 400}; + public slots: /** * @brief Set resolution to use @@ -73,6 +76,8 @@ public slots: void HandDragMove(int x, int y); + virtual bool eventFilter(QObject *watched, QEvent *event) override; + signals: void RequestScale(const QMatrix4x4& matrix); @@ -111,6 +116,7 @@ private: * @brief Internal zoom value */ int zoom_; + int current_widget_scale_; QScrollBar* horiz_scrollbar_; QScrollBar* vert_scrollbar_;