From bdbfb56879130a9ca66333862250f5fcf12bec70 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 24 Oct 2022 12:01:47 -0700 Subject: [PATCH] shift timelineview scroll code into base classes Fixes #2060 --- .../handmovableview/handmovableview.cpp | 51 ++++++++++++++++- app/widget/handmovableview/handmovableview.h | 4 ++ app/widget/timebased/timebasedwidget.cpp | 22 +------ app/widget/timebased/timebasedwidget.h | 6 -- .../timelinewidget/view/timelineview.cpp | 57 +------------------ app/widget/timelinewidget/view/timelineview.h | 2 - app/widget/timeruler/seekablewidget.cpp | 2 + app/widget/viewer/viewer.cpp | 1 - 8 files changed, 61 insertions(+), 84 deletions(-) diff --git a/app/widget/handmovableview/handmovableview.cpp b/app/widget/handmovableview/handmovableview.cpp index a44858ad8..f6cc9bc63 100644 --- a/app/widget/handmovableview/handmovableview.cpp +++ b/app/widget/handmovableview/handmovableview.cpp @@ -31,7 +31,8 @@ namespace olive { HandMovableView::HandMovableView(QWidget* parent) : super(parent), - dragging_hand_(false) + dragging_hand_(false), + is_timeline_axes_(false) { connect(Core::instance(), &Core::ToolChanged, this, &HandMovableView::ApplicationToolChanged); } @@ -166,6 +167,54 @@ void HandMovableView::wheelEvent(QWheelEvent *event) ZoomIntoCursorPosition(event, multiplier, cursor_pos); } + } else if (is_timeline_axes_) { +#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) + + QPoint angle_delta = event->angleDelta(); + + if (OLIVE_CONFIG("InvertTimelineScrollAxes").toBool() // Check if config is set to invert timeline axes + && event->source() != Qt::MouseEventSynthesizedBySystem) { // Never flip axes on Apple trackpads though + angle_delta = QPoint(angle_delta.y(), angle_delta.x()); + } + + QWheelEvent e( + #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + event->position(), + event->globalPosition(), + #else + event->pos(), + event->globalPos(), + #endif + event->pixelDelta(), + angle_delta, + event->buttons(), + event->modifiers(), + event->phase(), + event->inverted(), + event->source() + ); + +#else + + Qt::Orientation orientation = event->orientation(); + + if (OLIVE_CONFIG("InvertTimelineScrollAxes").toBool()) { + orientation = (orientation == Qt::Horizontal) ? Qt::Vertical : Qt::Horizontal; + } + + QWheelEvent e( + event->pos(), + event->globalPos(), + event->pixelDelta(), + event->angleDelta(), + event->delta(), + orientation, + event->buttons(), + event->modifiers() + ); +#endif + + super::wheelEvent(&e); } else { super::wheelEvent(event); } diff --git a/app/widget/handmovableview/handmovableview.h b/app/widget/handmovableview/handmovableview.h index e8c01599b..63c09cb18 100644 --- a/app/widget/handmovableview/handmovableview.h +++ b/app/widget/handmovableview/handmovableview.h @@ -50,6 +50,8 @@ protected: virtual void ZoomIntoCursorPosition(QWheelEvent* event, double multiplier, const QPointF &cursor_pos); + void SetIsTimelineAxes(bool e) { is_timeline_axes_ = e; } + private: bool dragging_hand_; DragMode pre_hand_drag_mode_; @@ -58,6 +60,8 @@ private: QPointF transformed_pos_; + bool is_timeline_axes_; + private slots: void ApplicationToolChanged(Tool::Item tool); diff --git a/app/widget/timebased/timebasedwidget.cpp b/app/widget/timebased/timebasedwidget.cpp index 2c1e175cd..e0149578f 100644 --- a/app/widget/timebased/timebasedwidget.cpp +++ b/app/widget/timebased/timebasedwidget.cpp @@ -51,9 +51,6 @@ TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_statu ConnectTimelineView(ruler_, true); ruler()->SetSnapService(this); connect(ruler(), &TimeRuler::DragReleased, this, static_cast(&TimeBasedWidget::StopCatchUpScrollTimer)); - connect(scrollbar(), &QScrollBar::valueChanged, ruler(), &TimeRuler::SetScroll); - - PassWheelEventsToScrollBar(ruler_); catchup_scroll_timer_ = new QTimer(this); catchup_scroll_timer_->setInterval(250); // Hardcoded 1/4 scroll limit value @@ -307,12 +304,14 @@ void TimeBasedWidget::ConnectTimelineView(TimeBasedView *base, bool connect_time connect(base, &TimeBasedView::TimeChanged, this, &TimeBasedWidget::SetTimeAndSignal); } + // Connect scale connect(base, &TimeBasedView::ScaleChanged, this, &TimeBasedWidget::SetScale); + // Main scrollbar to view scrollbar and vice versa connect(scrollbar(), &QScrollBar::valueChanged, base->horizontalScrollBar(), &QScrollBar::setValue); connect(base->horizontalScrollBar(), &QScrollBar::valueChanged, scrollbar(), &QScrollBar::setValue); - connect(base->horizontalScrollBar(), &QScrollBar::valueChanged, ruler(), &TimeRuler::SetScroll); + // Connect scrollbar to other scrollbars for (TimeBasedView *other : qAsConst(timeline_views_)) { connect(other->horizontalScrollBar(), &QScrollBar::valueChanged, base->horizontalScrollBar(), &QScrollBar::setValue); connect(base->horizontalScrollBar(), &QScrollBar::valueChanged, other->horizontalScrollBar(), &QScrollBar::setValue); @@ -321,12 +320,6 @@ void TimeBasedWidget::ConnectTimelineView(TimeBasedView *base, bool connect_time timeline_views_.append(base); } -void TimeBasedWidget::PassWheelEventsToScrollBar(QObject *object) -{ - wheel_passthrough_objects_.append(object); - object->installEventFilter(this); -} - void TimeBasedWidget::SetCatchUpScrollValue(QScrollBar *b, int v, int maximum) { CatchUpScrollData &cudata = catchup_scroll_values_[b]; @@ -758,15 +751,6 @@ void TimeBasedWidget::DeleteSelected() } } -bool TimeBasedWidget::eventFilter(QObject *object, QEvent *event) -{ - if (wheel_passthrough_objects_.contains(object) && event->type() == QEvent::Wheel) { - QCoreApplication::sendEvent(scrollbar(), event); - } - - return false; -} - struct SnapData { rational time; rational movement; diff --git a/app/widget/timebased/timebasedwidget.h b/app/widget/timebased/timebasedwidget.h index 347c079c7..2789793b1 100644 --- a/app/widget/timebased/timebasedwidget.h +++ b/app/widget/timebased/timebasedwidget.h @@ -60,8 +60,6 @@ public: TimeRuler* ruler() const; - virtual bool eventFilter(QObject* object, QEvent* event) override; - using SnapMask = uint32_t; enum SnapPoints { kSnapToClips = 0x1, @@ -146,8 +144,6 @@ protected: void ConnectTimelineView(TimeBasedView* base, bool connect_time_change_event = true); - void PassWheelEventsToScrollBar(QObject* object); - void SetCatchUpScrollValue(QScrollBar *b, int v, int maximum); void SetCatchUpScrollValue(int v); void StopCatchUpScrollTimer(QScrollBar *b); @@ -228,8 +224,6 @@ private: bool auto_set_timebase_; - QVector wheel_passthrough_objects_; - int scrollbar_start_width_; double scrollbar_start_value_; double scrollbar_start_scale_; diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 5bad687f6..2ba27f240 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -56,6 +56,8 @@ TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : setBackgroundRole(QPalette::Window); setContextMenuPolicy(Qt::CustomContextMenu); viewport()->setMouseTracking(true); + + SetIsTimelineAxes(true); } void TimelineView::mousePressEvent(QMouseEvent *event) @@ -147,61 +149,6 @@ void TimelineView::mouseDoubleClickEvent(QMouseEvent *event) emit MouseDoubleClicked(&timeline_event); } -void TimelineView::wheelEvent(QWheelEvent *event) -{ - if (WheelEventIsAZoomEvent(event)) { - super::wheelEvent(event); - } else { -#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) - - QPoint angle_delta = event->angleDelta(); - - if (OLIVE_CONFIG("InvertTimelineScrollAxes").toBool() // Check if config is set to invert timeline axes - && event->source() != Qt::MouseEventSynthesizedBySystem) { // Never flip axes on Apple trackpads though - angle_delta = QPoint(angle_delta.y(), angle_delta.x()); - } - - QWheelEvent e( - #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) - event->position(), - event->globalPosition(), - #else - event->pos(), - event->globalPos(), - #endif - event->pixelDelta(), - angle_delta, - event->buttons(), - event->modifiers(), - event->phase(), - event->inverted(), - event->source() - ); - -#else - - Qt::Orientation orientation = event->orientation(); - - if (OLIVE_CONFIG("InvertTimelineScrollAxes").toBool()) { - orientation = (orientation == Qt::Horizontal) ? Qt::Vertical : Qt::Horizontal; - } - - QWheelEvent e( - event->pos(), - event->globalPos(), - event->pixelDelta(), - event->angleDelta(), - event->delta(), - orientation, - event->buttons(), - event->modifiers() - ); -#endif - - super::wheelEvent(&e); - } -} - void TimelineView::dragEnterEvent(QDragEnterEvent *event) { TimelineViewMouseEvent timeline_event = CreateMouseEvent(event->pos(), Qt::NoButton, event->keyboardModifiers()); diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index 6255af2da..a1e1698a9 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -90,8 +90,6 @@ protected: virtual void mouseReleaseEvent(QMouseEvent *event) override; virtual void mouseDoubleClickEvent(QMouseEvent *event) override; - virtual void wheelEvent(QWheelEvent* event) override; - virtual void dragEnterEvent(QDragEnterEvent *event) override; virtual void dragMoveEvent(QDragMoveEvent *event) override; virtual void dragLeaveEvent(QDragLeaveEvent *event) override; diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 8dc21dace..bb154d59e 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -63,6 +63,8 @@ SeekableWidget::SeekableWidget(QWidget* parent) : setMouseTracking(true); selection_manager_.SetSnapMask(TimeBasedWidget::kSnapAll); + + SetIsTimelineAxes(true); } void SeekableWidget::SetMarkers(TimelineMarkerList *markers) diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index f390f2a6b..8447734af 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -114,7 +114,6 @@ ViewerWidget::ViewerWidget(ViewerDisplayWidget *display, QWidget *parent) : // Create waveform view when audio is connected and video isn't waveform_view_ = new AudioWaveformView(); ConnectTimelineView(waveform_view_, true); - PassWheelEventsToScrollBar(waveform_view_); layout->addWidget(waveform_view_); // Create time ruler