diff options
Diffstat (limited to 'qscrollareakineticscroller.cpp')
-rw-r--r-- | qscrollareakineticscroller.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/qscrollareakineticscroller.cpp b/qscrollareakineticscroller.cpp index 3b9c980..7b28dee 100644 --- a/qscrollareakineticscroller.cpp +++ b/qscrollareakineticscroller.cpp @@ -76,7 +76,7 @@ public: QAbstractScrollArea *area; QItemSelection oldSelection; // the selection before the first mouse down bool ignoreEvents; - QPointF lastOvershoot; + QPoint lastOvershoot; // don't change the type to QPointF or we might never shoot completely back. QPointer<QWidget> childWidget; // the widget where the mouse was pressed QElapsedTimer timer; @@ -136,11 +136,15 @@ void QScrollAreaKineticScroller::setWidget(QAbstractScrollArea *widget) { Q_D(QScrollAreaKineticScroller); - if (d->area) + if (d->area) { d->area->viewport()->removeEventFilter(this); - // todo: move back overshoot + d->area->viewport()->move(d->area->viewport()->pos() + d->lastOvershoot ); + } + reset(); d->area = widget; + d->lastOvershoot = QPoint(); + setParent(d->area); if (d->area) { d->area->viewport()->installEventFilter(this); @@ -149,7 +153,6 @@ void QScrollAreaKineticScroller::setWidget(QAbstractScrollArea *widget) view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); } } - d->lastOvershoot = QPointF(); } bool QScrollAreaKineticScroller::eventFilter(QObject *o, QEvent *e) @@ -172,7 +175,7 @@ bool QScrollAreaKineticScroller::eventFilter(QObject *o, QEvent *e) // fall through QMouseEvent *me = static_cast<QMouseEvent *>(e); isMouseEvent = true; - res = handleInput(InputPress, me->posF(), timestamp); + res = handleInput(InputPress, me->posF() - d->lastOvershoot, timestamp); break; } case QEvent::MouseButtonDblClick: { @@ -180,21 +183,22 @@ bool QScrollAreaKineticScroller::eventFilter(QObject *o, QEvent *e) // fall through QMouseEvent *me = static_cast<QMouseEvent *>(e); isMouseEvent = true; - res = handleInput(InputPress, me->pos(), timestamp); + res = handleInput(InputPress, me->posF() - d->lastOvershoot, timestamp); break; } case QEvent::MouseMove: { QMouseEvent *me = static_cast<QMouseEvent *>(e); isMouseEvent = true; - res = handleInput(InputMove, me->posF(), timestamp); + res = handleInput(InputMove, me->posF() - d->lastOvershoot, timestamp); break; } case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast<QMouseEvent *>(e); isMouseEvent = true; - res = handleInput(InputRelease, me->pos(), timestamp); + res = handleInput(InputRelease, me->posF() - d->lastOvershoot, timestamp); break; } + case QEvent::ChildAdded: case QEvent::ChildRemoved: { QChildEvent *ce = static_cast<QChildEvent *>(e); @@ -256,6 +260,7 @@ bool QScrollAreaKineticScroller::canStartScrollingAt(const QPointF &pos) const if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable)) return false; } + // don't start scrolling on a QSlider if (qobject_cast<QSlider *>(d->mouseTransparentChildAtGlobalPos(d->area->viewport(), d->area->viewport()->mapToGlobal(pos.toPoint())))) { return false; @@ -336,10 +341,10 @@ void QScrollAreaKineticScroller::setContentPosition(const QPointF &p, const QPoi if (QScrollBar *s = d->area->verticalScrollBar()) s->setValue(p.y()); - QPointF delta = overshootDelta - d->lastOvershoot; + QPoint delta = d->lastOvershoot - overshootDelta.toPoint(); if (!delta.isNull()) - d->area->viewport()->move(d->area->viewport()->pos() + delta.toPoint()); - d->lastOvershoot = overshootDelta; + d->area->viewport()->move(d->area->viewport()->pos() + delta); + d->lastOvershoot -= delta; } } |