18#include <QAbstractButton>
19#include <QAbstractItemView>
20#include <QAbstractSlider>
21#include <QAbstractSpinBox>
23#include <QDateTimeEdit>
28#include "moc_qgsscrollarea.cpp"
34 : QScrollArea( parent )
35 , mFilter( new ScrollAreaFilter( this, viewport() ) )
37 viewport()->installEventFilter( mFilter );
38 setMouseTracking(
true );
45 QScrollArea::wheelEvent( e );
50 if ( mVerticalOnly && widget() )
51 widget()->setFixedWidth( event->size().width() );
52 QScrollArea::resizeEvent( event );
63 return mTimerActive && mTimer.elapsed() <
TIMEOUT;
73 mVerticalOnly = verticalOnly;
75 setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
77 if ( mVerticalOnly && widget() )
78 widget()->setFixedWidth( size().width() );
83ScrollAreaFilter::ScrollAreaFilter(
QgsScrollArea *parent, QWidget *viewPort )
85 , mScrollAreaWidget( parent )
86 , mViewPort( viewPort )
88 QFontMetrics fm( parent->font() );
89 mMoveDistanceThreshold = fm.horizontalAdvance(
'X' );
92bool ScrollAreaFilter::eventFilter( QObject *obj, QEvent *event )
94 switch ( event->type() )
96 case QEvent::ChildAdded:
99 QChildEvent *ce =
static_cast<QChildEvent *
>( event );
100 addChild( ce->child() );
104 case QEvent::ChildRemoved:
106 QChildEvent *ce =
static_cast<QChildEvent *
>( event );
107 removeChild( ce->child() );
111 case QEvent::MouseMove:
113 if ( obj == mViewPort )
115 const QPoint mouseDelta = QCursor::pos() - mPreviousViewportCursorPos;
116 if ( mouseDelta.manhattanLength() > mMoveDistanceThreshold )
120 mScrollAreaWidget->resetHasScrolled();
122 mPreviousViewportCursorPos = QCursor::pos();
129 if ( obj == mViewPort )
132 mScrollAreaWidget->scrollOccurred();
134 else if ( qobject_cast< QComboBox * >( obj )
135 || qobject_cast< QAbstractSpinBox * >( obj )
136 || qobject_cast< QAbstractButton *>( obj )
137 || qobject_cast< QAbstractSlider *>( obj )
138 || qobject_cast< QDateTimeEdit * >( obj ) )
140 if ( mScrollAreaWidget->hasScrolled() )
152 return QObject::eventFilter( obj, event );
155void ScrollAreaFilter::addChild( QObject *child )
157 if ( child && child->isWidgetType() )
159 if ( qobject_cast<QScrollArea *>( child ) || qobject_cast<QAbstractItemView *>( child ) )
162 child->installEventFilter(
this );
163 if ( QWidget *w = qobject_cast<QWidget *>( child ) )
164 w->setMouseTracking(
true );
167 const auto constChildren = child->children();
168 for ( QObject *
c : constChildren )
175void ScrollAreaFilter::removeChild( QObject *child )
177 if ( child && child->isWidgetType() )
179 if ( qobject_cast<QScrollArea *>( child ) || qobject_cast<QAbstractItemView *>( child ) )
182 child->removeEventFilter(
this );
185 const auto constChildren = child->children();
186 for ( QObject *
c : constChildren )
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c