From 006e73ef4c5e541319d4ea2a94baf9270f2b657b Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Tue, 3 Nov 2015 12:40:03 +0100 Subject: [PATCH] ui: horizontal scroll fix * prevented the mouse wheel from scrolling a horizontal scrollbar when the mouse happens to enter the scrollbar's area. --- src/app/qt/element/QtCodeArea.cpp | 28 ++++++++++++++++++++++++++++ src/app/qt/element/QtCodeArea.h | 12 ++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/app/qt/element/QtCodeArea.cpp b/src/app/qt/element/QtCodeArea.cpp index d07be039..66e5a1c0 100644 --- a/src/app/qt/element/QtCodeArea.cpp +++ b/src/app/qt/element/QtCodeArea.cpp @@ -23,6 +23,31 @@ #include "settings/ApplicationSettings.h" #include "settings/ColorScheme.h" +MouseWheelOverScrollbarFilter::MouseWheelOverScrollbarFilter(QObject* parent) + : QObject(parent) +{ +} + +bool MouseWheelOverScrollbarFilter::eventFilter(QObject* obj, QEvent* event) +{ + QScrollBar* scrollbar = dynamic_cast(obj); + if (event->type() == QEvent::Wheel && scrollbar) + { + QRect scrollbarArea(scrollbar->pos(), scrollbar->size()); + QPoint globalMousePos = dynamic_cast(event)->globalPos(); + QPoint localMousePos = scrollbar->mapFromGlobal(globalMousePos); + + // instead of "scrollbar->underMouse()" we need this check implemented here because "underMouse()" + // does not work when the mouse enters the area without being moved + if (scrollbarArea.contains(localMousePos)) + { + event->ignore(); + return true; + } + } + return QObject::eventFilter(obj, event); +} + QtCodeArea::LineNumberArea::LineNumberArea(QtCodeArea *codeArea) : QWidget(codeArea) , m_codeArea(codeArea) @@ -87,6 +112,9 @@ QtCodeArea::QtCodeArea( connect(this, SIGNAL(selectionChanged()), this, SLOT(clearSelection())); this->setMouseTracking(true); + + // MouseWheelOverScrollbarFilter is deleted by parent. + horizontalScrollBar()->installEventFilter(new MouseWheelOverScrollbarFilter(this)); } QtCodeArea::~QtCodeArea() diff --git a/src/app/qt/element/QtCodeArea.h b/src/app/qt/element/QtCodeArea.h index ce847517..189df95b 100644 --- a/src/app/qt/element/QtCodeArea.h +++ b/src/app/qt/element/QtCodeArea.h @@ -19,6 +19,18 @@ class QWidget; class TokenLocation; class TokenLocationFile; +class MouseWheelOverScrollbarFilter + : public QObject +{ + Q_OBJECT + +public: + MouseWheelOverScrollbarFilter(QObject* parent); + +protected: + bool eventFilter(QObject*obj, QEvent* event); +}; + class QtCodeArea : public QPlainTextEdit {