diff options
author | J-P Nurmi <jpnurmi@digia.com> | 2012-10-30 13:47:20 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-02 19:49:22 +0100 |
commit | 3c2bfbff5f4c836de32628710ab7701b0db083f7 (patch) | |
tree | 4e6c262f6cbaa4978bcf47b239423fe305af50bb /src/widgets/widgets/qabstractscrollarea.cpp | |
parent | 020196d16b6c25e16bf80483f08e0007a27eab13 (diff) |
Mac: refactor scrollbar animations
Get rid of QWidget-centric QMacStyle::eventFilter() and implement the
fade out animations for scrollbars using QNumberStyleAnimation-based
QFadeOutAnimation.
Change-Id: I2000fa50d46b153e981ceafc12a53932a196382e
Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
Diffstat (limited to 'src/widgets/widgets/qabstractscrollarea.cpp')
-rw-r--r-- | src/widgets/widgets/qabstractscrollarea.cpp | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index 8aa5534366..3c21d767be 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -57,6 +57,7 @@ #include <QDebug> #include "qabstractscrollarea_p.h" +#include "qscrollbar_p.h" #include <qwidget.h> #include <private/qapplication_p.h> @@ -183,6 +184,7 @@ QAbstractScrollAreaScrollBarContainer::QAbstractScrollAreaScrollBarContainer(Qt: layout->setMargin(0); layout->setSpacing(0); layout->addWidget(scrollBar); + layout->setSizeConstraint(QLayout::SetMaximumSize); } /*! \internal @@ -266,6 +268,8 @@ void QAbstractScrollAreaPrivate::replaceScrollBar(QScrollBar *scrollBar, scrollBar->setSliderPosition(oldBar->sliderPosition()); scrollBar->setTracking(oldBar->hasTracking()); scrollBar->setValue(oldBar->value()); + scrollBar->installEventFilter(q); + oldBar->removeEventFilter(q); delete oldBar; QObject::connect(scrollBar, SIGNAL(valueChanged(int)), @@ -286,6 +290,7 @@ void QAbstractScrollAreaPrivate::init() hbar = scrollBarContainers[Qt::Horizontal]->scrollBar; hbar->setRange(0,0); scrollBarContainers[Qt::Horizontal]->setVisible(false); + hbar->installEventFilter(q); QObject::connect(hbar, SIGNAL(valueChanged(int)), q, SLOT(_q_hslide(int))); QObject::connect(hbar, SIGNAL(rangeChanged(int,int)), q, SLOT(_q_showOrHideScrollBars()), Qt::QueuedConnection); scrollBarContainers[Qt::Vertical] = new QAbstractScrollAreaScrollBarContainer(Qt::Vertical, q); @@ -293,6 +298,7 @@ void QAbstractScrollAreaPrivate::init() vbar = scrollBarContainers[Qt::Vertical]->scrollBar; vbar->setRange(0,0); scrollBarContainers[Qt::Vertical]->setVisible(false); + vbar->installEventFilter(q); QObject::connect(vbar, SIGNAL(valueChanged(int)), q, SLOT(_q_vslide(int))); QObject::connect(vbar, SIGNAL(rangeChanged(int,int)), q, SLOT(_q_showOrHideScrollBars()), Qt::QueuedConnection); viewportFilter.reset(new QAbstractScrollAreaFilter(this)); @@ -323,10 +329,10 @@ void QAbstractScrollAreaPrivate::layoutChildren() { Q_Q(QAbstractScrollArea); bool needh = (hbarpolicy == Qt::ScrollBarAlwaysOn - || (hbarpolicy == Qt::ScrollBarAsNeeded && hbar->minimum() < hbar->maximum())); + || (hbarpolicy == Qt::ScrollBarAsNeeded && hbar->minimum() < hbar->maximum() && !hbar->sizeHint().isEmpty())); bool needv = (vbarpolicy == Qt::ScrollBarAlwaysOn - || (vbarpolicy == Qt::ScrollBarAsNeeded && vbar->minimum() < vbar->maximum())); + || (vbarpolicy == Qt::ScrollBarAsNeeded && vbar->minimum() < vbar->maximum() && !vbar->sizeHint().isEmpty())); QStyleOption opt(0); opt.init(q); @@ -648,6 +654,7 @@ void QAbstractScrollArea::setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy) d->layoutChildren(); if (oldPolicy != d->vbarpolicy) d->scrollBarPolicyChanged(Qt::Vertical, d->vbarpolicy); + d->setScrollBarTransient(d->vbar, policy == Qt::ScrollBarAsNeeded); } @@ -709,6 +716,7 @@ void QAbstractScrollArea::setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy polic d->layoutChildren(); if (oldPolicy != d->hbarpolicy) d->scrollBarPolicyChanged(Qt::Horizontal, d->hbarpolicy); + d->setScrollBarTransient(d->hbar, policy == Qt::ScrollBarAsNeeded); } /*! @@ -921,6 +929,20 @@ void QAbstractScrollArea::setViewportMargins(const QMargins &margins) margins.right(), margins.bottom()); } +/*! \internal */ +bool QAbstractScrollArea::eventFilter(QObject *o, QEvent *e) +{ + Q_D(QAbstractScrollArea); + if ((o == d->hbar || o == d->vbar) && (e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverLeave)) { + Qt::ScrollBarPolicy policy = o == d->hbar ? d->vbarpolicy : d->hbarpolicy; + if (policy == Qt::ScrollBarAsNeeded) { + QScrollBar *sibling = o == d->hbar ? d->vbar : d->hbar; + d->setScrollBarTransient(sibling, e->type() == QEvent::HoverLeave); + } + } + return QFrame::eventFilter(o, e); +} + /*! \fn bool QAbstractScrollArea::event(QEvent *event) @@ -1421,12 +1443,26 @@ bool QAbstractScrollAreaPrivate::canStartScrollingAt( const QPoint &startPos ) return true; } +void QAbstractScrollAreaPrivate::flashScrollBars() +{ + if (hbarpolicy == Qt::ScrollBarAsNeeded) + hbar->d_func()->flash(); + if (vbarpolicy == Qt::ScrollBarAsNeeded) + vbar->d_func()->flash(); +} + +void QAbstractScrollAreaPrivate::setScrollBarTransient(QScrollBar *scrollBar, bool transient) +{ + scrollBar->d_func()->setTransient(transient); +} + void QAbstractScrollAreaPrivate::_q_hslide(int x) { Q_Q(QAbstractScrollArea); int dx = xoffset - x; xoffset = x; q->scrollContentsBy(dx, 0); + flashScrollBars(); } void QAbstractScrollAreaPrivate::_q_vslide(int y) @@ -1435,6 +1471,7 @@ void QAbstractScrollAreaPrivate::_q_vslide(int y) int dy = yoffset - y; yoffset = y; q->scrollContentsBy(0, dy); + flashScrollBars(); } void QAbstractScrollAreaPrivate::_q_showOrHideScrollBars() |