17#include "moc_qgsscrollarea.cpp"
22#include <QAbstractItemView>
24#include <QAbstractSpinBox>
25#include <QAbstractButton>
26#include <QAbstractSlider>
27#include <QDateTimeEdit>
33 : QScrollArea( parent )
34 , mFilter( new ScrollAreaFilter( this, viewport() ) )
36 viewport()->installEventFilter( mFilter );
37 setMouseTracking(
true );
44 QScrollArea::wheelEvent( e );
49 if ( mVerticalOnly && widget() )
50 widget()->setFixedWidth( event->size().width() );
51 QScrollArea::resizeEvent( event );
62 return mTimerActive && mTimer.elapsed() <
TIMEOUT;
72 mVerticalOnly = verticalOnly;
74 setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
76 if ( mVerticalOnly && widget() )
77 widget()->setFixedWidth( size().width() );
82ScrollAreaFilter::ScrollAreaFilter(
QgsScrollArea *parent, QWidget *viewPort )
84 , mScrollAreaWidget( parent )
85 , mViewPort( viewPort )
87 QFontMetrics fm( parent->font() );
88 mMoveDistanceThreshold = fm.horizontalAdvance(
'X' );
91bool ScrollAreaFilter::eventFilter( QObject *obj, QEvent *event )
93 switch ( event->type() )
95 case QEvent::ChildAdded:
98 QChildEvent *ce =
static_cast<QChildEvent *
>( event );
99 addChild( ce->child() );
103 case QEvent::ChildRemoved:
105 QChildEvent *ce =
static_cast<QChildEvent *
>( event );
106 removeChild( ce->child() );
110 case QEvent::MouseMove:
112 if ( obj == mViewPort )
114 const QPoint mouseDelta = QCursor::pos() - mPreviousViewportCursorPos;
115 if ( mouseDelta.manhattanLength() > mMoveDistanceThreshold )
119 mScrollAreaWidget->resetHasScrolled();
121 mPreviousViewportCursorPos = QCursor::pos();
128 if ( obj == mViewPort )
131 mScrollAreaWidget->scrollOccurred();
133 else if ( qobject_cast< QComboBox * >( obj )
134 || qobject_cast< QAbstractSpinBox * >( obj )
135 || qobject_cast< QAbstractButton *>( obj )
136 || qobject_cast< QAbstractSlider *>( obj )
137 || qobject_cast< QDateTimeEdit * >( obj ) )
139 if ( mScrollAreaWidget->hasScrolled() )
151 return QObject::eventFilter( obj, event );
154void ScrollAreaFilter::addChild( QObject *child )
156 if ( child && child->isWidgetType() )
158 if ( qobject_cast<QScrollArea *>( child ) || qobject_cast<QAbstractItemView *>( child ) )
161 child->installEventFilter(
this );
162 if ( QWidget *w = qobject_cast<QWidget *>( child ) )
163 w->setMouseTracking(
true );
166 const auto constChildren = child->children();
167 for ( QObject *
c : constChildren )
174void ScrollAreaFilter::removeChild( QObject *child )
176 if ( child && child->isWidgetType() )
178 if ( qobject_cast<QScrollArea *>( child ) || qobject_cast<QAbstractItemView *>( child ) )
181 child->removeEventFilter(
this );
184 const auto constChildren = child->children();
185 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