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