viewer: respond to wheel events for moving and zooming
This commit is contained in:
@@ -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<bool>(event->modifiers() & Qt::ControlModifier) == !OLIVE_CONFIG("ScrollZooms").toBool());
|
||||
}
|
||||
|
||||
qreal HandMovableView::GetScrollZoomMultiplier(QWheelEvent *event)
|
||||
{
|
||||
return 1.0 + (static_cast<qreal>(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<qreal>(event->angleDelta().x() + event->angleDelta().y()) * 0.001);
|
||||
qreal multiplier = GetScrollZoomMultiplier(event);
|
||||
|
||||
QPointF cursor_pos;
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;i<ViewerSizer::kZoomLevelCount;i++) {
|
||||
int z = ViewerSizer::kZoomLevels[i];
|
||||
zoom_menu->addAction(tr("%1%").arg(z))->setData(z);
|
||||
}
|
||||
|
||||
connect(zoom_menu, &QMenu::triggered, this, &ViewerWidget::SetZoomFromMenu);
|
||||
|
||||
@@ -20,7 +20,12 @@
|
||||
|
||||
#include "viewersizer.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QEvent>
|
||||
#include <QMatrix4x4>
|
||||
#include <QWheelEvent>
|
||||
|
||||
#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<QWheelEvent*>(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; i<kZoomLevelCount; i++) {
|
||||
if (current_percent <= kZoomLevels[i]) {
|
||||
SetZoom(kZoomLevels[i-1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Pass scroll values to scrollbars
|
||||
QPoint p = w->pixelDelta();
|
||||
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
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user