summaryrefslogtreecommitdiffstats
path: root/qscrollareakineticscroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qscrollareakineticscroller.cpp')
-rw-r--r--qscrollareakineticscroller.cpp27
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;
}
}