21#include <QAbstractItemView> 
   27  : QScrollArea( parent )
 
   28  , mFilter( new ScrollAreaFilter( this, viewport() ) )
 
   30  viewport()->installEventFilter( mFilter );
 
   31  setMouseTracking( 
true );
 
   38  QScrollArea::wheelEvent( e );
 
   43  if ( mVerticalOnly && widget() )
 
   44    widget()->setFixedWidth( event->size().width() );
 
   45  QScrollArea::resizeEvent( event );
 
   50  mTimer.setSingleShot( 
true );
 
   56  return mTimer.isActive();
 
   66  mVerticalOnly = verticalOnly;
 
   68    setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
 
   70  if ( mVerticalOnly && widget() )
 
   71    widget()->setFixedWidth( size().width() );
 
   76ScrollAreaFilter::ScrollAreaFilter( 
QgsScrollArea *parent, QWidget *viewPort )
 
   78  , mScrollAreaWidget( parent )
 
   79  , mViewPort( viewPort )
 
   81  QFontMetrics fm( parent->font() );
 
   82  mMoveDistanceThreshold = fm.horizontalAdvance( 
'X' );
 
   85bool ScrollAreaFilter::eventFilter( QObject *obj, QEvent *event )
 
   87  switch ( event->type() )
 
   89    case QEvent::ChildAdded:
 
   92      QChildEvent *ce = 
static_cast<QChildEvent *
>( event );
 
   93      addChild( ce->child() );
 
   97    case QEvent::ChildRemoved:
 
   99      QChildEvent *ce = 
static_cast<QChildEvent *
>( event );
 
  100      removeChild( ce->child() );
 
  104    case QEvent::MouseMove:
 
  106      if ( obj == mViewPort )
 
  108        const QPoint mouseDelta = QCursor::pos() - mPreviousViewportCursorPos;
 
  109        if ( mouseDelta.manhattanLength() > mMoveDistanceThreshold )
 
  113          mScrollAreaWidget->resetHasScrolled();
 
  115        mPreviousViewportCursorPos = QCursor::pos();
 
  122      if ( obj == mViewPort )
 
  125        mScrollAreaWidget->scrollOccurred();
 
  129        if ( mScrollAreaWidget->hasScrolled() )
 
  141  return QObject::eventFilter( obj, event );
 
  144void ScrollAreaFilter::addChild( QObject *child )
 
  146  if ( child && child->isWidgetType() )
 
  148    if ( qobject_cast< QScrollArea * >( child ) || qobject_cast< QAbstractItemView * >( child ) )
 
  151    child->installEventFilter( 
this );
 
  152    if ( QWidget *w = qobject_cast< QWidget * >( child ) )
 
  153      w->setMouseTracking( 
true );
 
  156    const auto constChildren = child->children();
 
  157    for ( QObject *
c : constChildren )
 
  164void ScrollAreaFilter::removeChild( QObject *child )
 
  166  if ( child && child->isWidgetType() )
 
  168    if ( qobject_cast< QScrollArea * >( child ) || qobject_cast< QAbstractItemView * >( child ) )
 
  171    child->removeEventFilter( 
this );
 
  174    const auto constChildren = child->children();
 
  175    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