From 16977ad4af73ba31e6b80a8baf19f43a3729342c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Wed, 29 Dec 2010 14:32:42 +0100 Subject: Make PathView usable with qt-scene-graph. We need this patch until we have a better replacement for QxPathView :-) It is almost impossible to flick without this patch. --- src/graphicsitems/qxpathview.cpp | 17 ++++++++++++++++- src/graphicsitems/qxpathview_p.h | 4 ++++ src/graphicsitems/qxpathview_p_p.h | 3 +++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/graphicsitems/qxpathview.cpp b/src/graphicsitems/qxpathview.cpp index 19c8b50..54a1dbd 100644 --- a/src/graphicsitems/qxpathview.cpp +++ b/src/graphicsitems/qxpathview.cpp @@ -955,7 +955,7 @@ void QxPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (!d->stealMouse) { QPointF delta = event->pos() - d->startPoint; - if (qAbs(delta.x()) > QApplication::startDragDistance() && qAbs(delta.y()) > QApplication::startDragDistance()) + if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) d->stealMouse = true; } @@ -976,6 +976,11 @@ void QxPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) d->lastDist = diff; d->startPc = newPc; } + if (!d->moving) { + d->moving = true; + emit movingChanged(); + emit movementStarted(); + } } } @@ -1348,6 +1353,16 @@ void QxPathView::ticked() d->updateCurrent(); } +void QxPathView::onTimeLineCompleted() +{ + Q_D(QxPathView); + if (d->moving && !d->stealMouse) { + d->moving = false; + emit movingChanged(); + emit movementEnded(); + } +} + // find the item closest to the snap position int QxPathViewPrivate::calcCurrentIndex() { diff --git a/src/graphicsitems/qxpathview_p.h b/src/graphicsitems/qxpathview_p.h index f1958b8..0c43bba 100644 --- a/src/graphicsitems/qxpathview_p.h +++ b/src/graphicsitems/qxpathview_p.h @@ -136,6 +136,9 @@ Q_SIGNALS: void modelChanged(); void countChanged(); void pathChanged(); + void movingChanged(); + void movementStarted(); + void movementEnded(); void preferredHighlightBeginChanged(); void preferredHighlightEndChanged(); void highlightRangeModeChanged(); @@ -161,6 +164,7 @@ protected: private Q_SLOTS: void refill(); void ticked(); + void onTimeLineCompleted(); void itemsInserted(int index, int count); void itemsRemoved(int index, int count); void itemsMoved(int,int,int); diff --git a/src/graphicsitems/qxpathview_p_p.h b/src/graphicsitems/qxpathview_p_p.h index 290e091..210cc7c 100644 --- a/src/graphicsitems/qxpathview_p_p.h +++ b/src/graphicsitems/qxpathview_p_p.h @@ -77,6 +77,7 @@ public: , lastElapsed(0), mappedRange(1.0) , stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true) , autoHighlight(true), highlightUp(false), layoutScheduled(false) + , moving(false) , dragMargin(0), deceleration(100) , moveOffset(this, &QxPathViewPrivate::setOffset) , firstIndex(-1), pathItems(-1), requestedIndex(-1) @@ -96,6 +97,7 @@ public: isFocusScope = true; q->setFiltersChildEvents(true); q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked())); + q->connect(&tl, SIGNAL(completed()), q, SLOT(onTimeLineCompleted())); lastPosTime.invalidate(); } @@ -154,6 +156,7 @@ public: bool autoHighlight : 1; bool highlightUp : 1; bool layoutScheduled : 1; + bool moving; QElapsedTimer lastPosTime; QPointF lastPos; qreal dragMargin; -- cgit v1.2.3 From 1369273d843fe74695911d5cdacb13307ae3f8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Wed, 29 Dec 2010 14:49:55 +0100 Subject: Amendment to 16977ad4af73ba31e6b80a8baf19f43a3729342c (make PathView usable with qt-scene-graph) --- src/graphicsitems/qxpathview.cpp | 6 ++++++ src/graphicsitems/qxpathview_p.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/graphicsitems/qxpathview.cpp b/src/graphicsitems/qxpathview.cpp index 54a1dbd..f41bec0 100644 --- a/src/graphicsitems/qxpathview.cpp +++ b/src/graphicsitems/qxpathview.cpp @@ -824,6 +824,12 @@ void QxPathView::setInteractive(bool interactive) } } +bool QxPathView::isMoving() const +{ + Q_D(const QxPathView); + return d->moving; +} + /*! \qmlproperty Component PathView::delegate diff --git a/src/graphicsitems/qxpathview_p.h b/src/graphicsitems/qxpathview_p.h index 0c43bba..9c8dee0 100644 --- a/src/graphicsitems/qxpathview_p.h +++ b/src/graphicsitems/qxpathview_p.h @@ -67,6 +67,7 @@ class QxPathView : public QxItem Q_PROPERTY(qreal dragMargin READ dragMargin WRITE setDragMargin NOTIFY dragMarginChanged) Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged) Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged) + Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged) Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged) @@ -116,6 +117,8 @@ public: bool isInteractive() const; void setInteractive(bool); + bool isMoving() const; + int count() const; QDeclarativeComponent *delegate() const; -- cgit v1.2.3 From 69cd6d720ddde829dc6b3c0500c9da3b51b58c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 4 Jan 2011 14:19:44 +0100 Subject: Added .gitignore file --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fcf9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +Makefile +*.o +*.moc +moc_*.cpp +bin/qmlscene +lib/*.so* +examples/paintitem/paintitem +examples/scenegraphitem/scenegraphitem +tests/auto/texturemanager/tst_texturemanager -- cgit v1.2.3 From d62f88e726e41e00174f12fe9716e25fa037242b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 4 Jan 2011 17:51:12 +0100 Subject: Backported two PathView fixes Fix dragging items within a PathView (eca7559542584a5675d22d619a7710e0f17cfba0) Ensure PathView doesn't jump when starting to drag. (1699e8240b8073241f1aaddc12ded6065ef520b9) --- src/graphicsitems/qxpathview.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/graphicsitems/qxpathview.cpp b/src/graphicsitems/qxpathview.cpp index f41bec0..52060cb 100644 --- a/src/graphicsitems/qxpathview.cpp +++ b/src/graphicsitems/qxpathview.cpp @@ -959,16 +959,18 @@ void QxPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (!d->interactive || !d->lastPosTime.isValid()) return; + qreal newPc; + QPointF pathPoint = d->pointNear(event->pos(), &newPc); if (!d->stealMouse) { - QPointF delta = event->pos() - d->startPoint; - if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) + QPointF delta = pathPoint - d->startPoint; + if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) { d->stealMouse = true; + d->startPc = newPc; + } } if (d->stealMouse) { d->moveReason = QxPathViewPrivate::Mouse; - qreal newPc; - d->pointNear(event->pos(), &newPc); qreal diff = (newPc - d->startPc)*d->model->count()*d->mappedRange; if (diff) { setOffset(d->offset + diff); -- cgit v1.2.3 From 7136f5b90787741e96689c13419aea23244db275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 4 Jan 2011 18:12:50 +0100 Subject: Backported jump fix to Flickable Avoid Flickable view jumping when drag threashold is exceeded. (d630c627ed1dfbcfb48f907d2d37048b049830a5) --- src/graphicsitems/qxflickable.cpp | 10 ++++++++-- src/graphicsitems/qxflickable_p_p.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/graphicsitems/qxflickable.cpp b/src/graphicsitems/qxflickable.cpp index 78c0e7a..0287205 100644 --- a/src/graphicsitems/qxflickable.cpp +++ b/src/graphicsitems/qxflickable.cpp @@ -642,6 +642,8 @@ void QxFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event) timeline.clear(); hData.velocity = 0; vData.velocity = 0; + hData.dragStartOffset = 0; + vData.dragStartOffset = 0; lastPos = QPoint(); lastPosTime.start(); pressPos = event->pos(); @@ -664,7 +666,9 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) if (q->yflick()) { int dy = int(event->pos().y() - pressPos.y()); if (qAbs(dy) > QApplication::startDragDistance() || pressTime.elapsed() > 200) { - qreal newY = dy + vData.pressPos; + if (!vMoved) + vData.dragStartOffset = dy; + qreal newY = dy + vData.pressPos - vData.dragStartOffset; const qreal minY = q->minYExtent(); const qreal maxY = q->maxYExtent(); if (newY > minY) @@ -691,7 +695,9 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) if (q->xflick()) { int dx = int(event->pos().x() - pressPos.x()); if (qAbs(dx) > QApplication::startDragDistance() || pressTime.elapsed() > 200) { - qreal newX = dx + hData.pressPos; + if (!hMoved) + hData.dragStartOffset = dx; + qreal newX = dx + hData.pressPos - hData.dragStartOffset; const qreal minX = q->minXExtent(); const qreal maxX = q->maxXExtent(); if (newX > minX) diff --git a/src/graphicsitems/qxflickable_p_p.h b/src/graphicsitems/qxflickable_p_p.h index fa28be4..264bddc 100644 --- a/src/graphicsitems/qxflickable_p_p.h +++ b/src/graphicsitems/qxflickable_p_p.h @@ -94,6 +94,7 @@ public: QDeclarativeTimeLineValueProxy move; qreal viewSize; qreal pressPos; + qreal dragStartOffset; qreal velocity; qreal flickTarget; QxFlickablePrivate::Velocity smoothVelocity; -- cgit v1.2.3 From 995e3ed3c72f9eb05a2fc6cecf325546289218c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Tue, 4 Jan 2011 18:29:39 +0100 Subject: Make Virtual Keyboard / TextInput working. Not rock solid, but it's better than nothing. --- src/canvas/qxgraphicsview.cpp | 6 ++++++ src/graphicsitems/qxitem.cpp | 32 ++++++++++++++++++++++---------- src/graphicsitems/qxitem.h | 1 + src/graphicsitems/qxitem_p.h | 6 +++--- src/graphicsitems/qxtextinput.cpp | 19 ++++--------------- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/canvas/qxgraphicsview.cpp b/src/canvas/qxgraphicsview.cpp index 6c3e257..af661b8 100644 --- a/src/canvas/qxgraphicsview.cpp +++ b/src/canvas/qxgraphicsview.cpp @@ -165,6 +165,8 @@ QxGraphicsView::QxGraphicsView(QWidget *parent) d->animationDriver.install(); else printf("Not using VSync Animation Driver\n"); + + setFocusPolicy(Qt::StrongFocus); } QxGraphicsView::~QxGraphicsView() @@ -362,6 +364,8 @@ bool QxGraphicsViewPrivate::deliverInitialMouseEvent(QxItem *o, QMouseEvent *e) void QxGraphicsView::mousePressEvent(QMouseEvent *e) { if (d->deliverInitialMouseEvent(d->root, e)) { + if (d->mouseGrabber && d->mouseGrabber->focusItem()) + d->setFocusItem(d->mouseGrabber->focusItem()); e->accept(); } else { #ifdef Q_WS_QPA @@ -502,6 +506,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item) focusItem = 0; QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason); QCoreApplication::sendEvent(prevFocusItem, &event); + prevFocusItem->d_func()->view = 0; } QxItem *fi = item; @@ -517,6 +522,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item) //give focus to new focus item if (focusItem) { + focusItem->d_func()->view = q; focusItem->d_func()->inActiveFocusChain = true; QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason); QCoreApplication::sendEvent(focusItem, &event); diff --git a/src/graphicsitems/qxitem.cpp b/src/graphicsitems/qxitem.cpp index 7d6ca35..4af41e7 100644 --- a/src/graphicsitems/qxitem.cpp +++ b/src/graphicsitems/qxitem.cpp @@ -559,13 +559,12 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) // first process forwards // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inPress = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inPress = false; return; @@ -590,7 +589,6 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) emit pressed(&ke); event->setAccepted(ke.isAccepted()); - */ if (!event->isAccepted()) QxItemKeyFilter::keyPressed(event, post); } @@ -604,13 +602,12 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inRelease = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inRelease = false; return; @@ -619,7 +616,6 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } d->inRelease = false; } - */ QxKeyEvent ke(*event); emit released(&ke); @@ -2315,6 +2311,22 @@ QScriptValue QxItem::mapToItem(const QScriptValue &item, qreal x, qreal y) const return sv; } +QxItem *QxItem::childAt(qreal x, qreal y) const +{ + // Copied from QDeclarativeItem + const QList children = childItems(); + for (int i = children.count() - 1; i >= 0; --i) { + if (QxItem *child = children.at(i)) { + if (child->isVisible() && child->x() <= x + && child->x() + child->width() >= x + && child->y() <= y + && child->y() + child->height() >= y) + return child; + } + } + return 0; +} + void QxItem::forceFocus() { setFocus(true); diff --git a/src/graphicsitems/qxitem.h b/src/graphicsitems/qxitem.h index 0345023..19bdf1d 100644 --- a/src/graphicsitems/qxitem.h +++ b/src/graphicsitems/qxitem.h @@ -234,6 +234,7 @@ public: Q_INVOKABLE QScriptValue mapFromItem(const QScriptValue &item, qreal x, qreal y) const; Q_INVOKABLE QScriptValue mapToItem(const QScriptValue &item, qreal x, qreal y) const; Q_INVOKABLE void forceFocus(); + Q_INVOKABLE QxItem *childAt(qreal x, qreal y) const; Q_SIGNALS: void xChanged(); diff --git a/src/graphicsitems/qxitem_p.h b/src/graphicsitems/qxitem_p.h index bf623b5..2a6c3b2 100644 --- a/src/graphicsitems/qxitem_p.h +++ b/src/graphicsitems/qxitem_p.h @@ -492,10 +492,10 @@ public: bool isConnected(const char *signalName); - QGraphicsItem *finalFocusProxy(QGraphicsItem *item) const + QxItem *finalFocusProxy(QxItem *item) const { - QGraphicsItem *fp; - while ((fp = item->focusProxy())) + QxItem *fp; + while ((fp = item->focusItem())) item = fp; return item; } diff --git a/src/graphicsitems/qxtextinput.cpp b/src/graphicsitems/qxtextinput.cpp index 45cdadf..0ed4563 100644 --- a/src/graphicsitems/qxtextinput.cpp +++ b/src/graphicsitems/qxtextinput.cpp @@ -1334,15 +1334,10 @@ void QxTextInput::moveCursorSelection(int position) void QxTextInput::openSoftwareInputPanel() { QEvent event(QEvent::RequestSoftwareInputPanel); - /* XXX if (qApp) { - if (QGraphicsView * view = qobject_cast(qApp->focusWidget())) { - if (view->scene() && view->scene() == scene()) { - QApplication::sendEvent(view, &event); - } - } + if (QxGraphicsView *view = qobject_cast(qApp->focusWidget())) + QApplication::sendEvent(view, &event); } - */ } /*! @@ -1387,16 +1382,10 @@ void QxTextInput::openSoftwareInputPanel() void QxTextInput::closeSoftwareInputPanel() { QEvent event(QEvent::CloseSoftwareInputPanel); - /* XXX if (qApp) { - QEvent event(QEvent::CloseSoftwareInputPanel); - if (QGraphicsView * view = qobject_cast(qApp->focusWidget())) { - if (view->scene() && view->scene() == scene()) { - QApplication::sendEvent(view, &event); - } - } + if (QxGraphicsView *view = qobject_cast(qApp->focusWidget())) + QApplication::sendEvent(view, &event); } - */ } void QxTextInput::focusInEvent(QFocusEvent *event) -- cgit v1.2.3 From 5e6f8cdf53c097af99cab68ee1b8343926d8cbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Tue, 4 Jan 2011 19:00:19 +0100 Subject: Amendment to 995e3ed3c72f9eb05a2fc6cecf325546289218c8 Make it a QPointer to avoid crashes when items are deleted. Yes, we could (and perhaps should) have used a QWeakPointer here, but that requires more work than I'm willing to put into a temporary hack. --- src/canvas/qxgraphicsview_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/canvas/qxgraphicsview_p.h b/src/canvas/qxgraphicsview_p.h index ce62a35..a9987e3 100644 --- a/src/canvas/qxgraphicsview_p.h +++ b/src/canvas/qxgraphicsview_p.h @@ -77,7 +77,7 @@ public: QxItem *mouseGrabber; QList mouseFilters; - QxItem *focusItem; + QPointer focusItem; QxGraphicsView::ResizeMode resizeMode; -- cgit v1.2.3 From 785ea734068275783d39b267e76db3729f6312d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Wed, 5 Jan 2011 11:01:27 +0100 Subject: Fix some of the mouse/tap issues. --- src/canvas/qxgraphicsview.cpp | 4 +- src/graphicsitems/qxflickable.cpp | 200 +++++++++++++++++++++----------------- src/graphicsitems/qxitem.cpp | 20 +++- 3 files changed, 127 insertions(+), 97 deletions(-) diff --git a/src/canvas/qxgraphicsview.cpp b/src/canvas/qxgraphicsview.cpp index af661b8..321f138 100644 --- a/src/canvas/qxgraphicsview.cpp +++ b/src/canvas/qxgraphicsview.cpp @@ -292,6 +292,7 @@ QGraphicsSceneMouseEvent *QxGraphicsViewPrivate::sceneMouseEvent(QMouseEvent *e, g->setButtons(e->buttons()); g->setButton(e->button()); g->setModifiers(e->modifiers()); + g->setAccepted(false); return g; } @@ -323,7 +324,8 @@ bool QxGraphicsViewPrivate::deliverInitialMouseEvent(QxItem *o, QMouseEvent *e) children = QxItemPrivate::get(children)->nextSibling; } - if (filter) mouseFilters.removeLast(); + if (filter && !mouseFilters.isEmpty()) + mouseFilters.removeLast(); if (op->acceptedButtons & e->button()) { bool ok = false; diff --git a/src/graphicsitems/qxflickable.cpp b/src/graphicsitems/qxflickable.cpp index 0287205..ce2ebc6 100644 --- a/src/graphicsitems/qxflickable.cpp +++ b/src/graphicsitems/qxflickable.cpp @@ -634,10 +634,12 @@ void QxFlickable::setFlickDirection(FlickableDirection direction) void QxFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event) { + Q_Q(QxFlickable); if (interactive && timeline.isActive() && (qAbs(hData.velocity) > 10 || qAbs(vData.velocity) > 10)) stealMouse = true; // If we've been flicked then steal the click. else stealMouse = false; + q->setKeepMouseGrab(stealMouse); pressed = true; timeline.clear(); hData.velocity = 0; @@ -662,6 +664,8 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) return; bool rejectY = false; bool rejectX = false; + bool stealY = stealMouse; + bool stealX = stealMouse; if (q->yflick()) { int dy = int(event->pos().y() - pressPos.y()); @@ -676,19 +680,22 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) if (newY < maxY && maxY - minY <= 0) newY = maxY + (newY - maxY) / 2; if (boundsBehavior == QxFlickable::StopAtBounds && (newY > minY || newY < maxY)) { - if (newY > minY) - newY = minY; - else if (newY < maxY) + rejectY = true; + if (newY < maxY) { newY = maxY; - else - rejectY = true; + rejectY = false; + } + if (newY > minY) { + newY = minY; + rejectY = false; + } } if (!rejectY && stealMouse) { vData.move.setValue(qRound(newY)); vMoved = true; } if (qAbs(dy) > QApplication::startDragDistance()) - stealMouse = true; + stealY = true; } } @@ -705,12 +712,15 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) if (newX < maxX && maxX - minX <= 0) newX = maxX + (newX - maxX) / 2; if (boundsBehavior == QxFlickable::StopAtBounds && (newX > minX || newX < maxX)) { - if (newX > minX) - newX = minX; - else if (newX < maxX) + rejectX = true; + if (newX < maxX) { newX = maxX; - else - rejectX = true; + rejectX = false; + } + if (newX > minX) { + newX = minX; + rejectX = false; + } } if (!rejectX && stealMouse) { hData.move.setValue(qRound(newX)); @@ -718,10 +728,15 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) } if (qAbs(dx) > QApplication::startDragDistance()) - stealMouse = true; + stealX = true; + } } + stealMouse = stealX || stealY; + if (stealMouse) + q->setKeepMouseGrab(true); + if (!lastPos.isNull()) { qreal elapsed = qreal(lastPosTime.restart()) / 1000.; if (elapsed <= 0) @@ -768,23 +783,15 @@ void QxFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event } vTime = timeline.time(); - if (qAbs(vData.velocity) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold) { - qreal velocity = vData.velocity; - if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks. - velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity; - flickY(velocity); - } else { + if (qAbs(vData.velocity) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold) + flickY(vData.velocity); + else fixupY(); - } - if (qAbs(hData.velocity) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold) { - qreal velocity = hData.velocity; - if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks. - velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity; - flickX(velocity); - } else { + if (qAbs(hData.velocity) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold) + flickX(hData.velocity); + else fixupX(); - } lastPosTime.invalidate(); @@ -808,8 +815,6 @@ void QxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event) Q_D(QxFlickable); if (d->interactive) { d->handleMouseMoveEvent(event); - if (d->stealMouse) - setKeepMouseGrab(true); event->accept(); } else { QxItem::mouseMoveEvent(event); @@ -913,19 +918,24 @@ void QxFlickablePrivate::setRoundedViewportY(qreal y) void QxFlickable::timerEvent(QTimerEvent *event) { Q_D(QxFlickable); + if (event->timerId() == d->delayedPressTimer.timerId()) { d->delayedPressTimer.stop(); if (d->delayedPressEvent) { - // XXX akennedy - /* - QxItem *grabber = qobject_cast(mouseGrabberItem()); - if (!grabber || grabber != this) - scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent); - */ + QxItem *grabber = mouseGrabberItem(); + if (!grabber || grabber != this) { + // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay) + // so we reset the grabber + if (grabber == d->delayedPressTarget) + d->delayedPressTarget->ungrabMouse(); + //Use the event handler that will take care of finding the proper item to propagate the event + QApplication::sendEvent(QApplication::focusWidget(), d->delayedPressEvent); + } delete d->delayedPressEvent; d->delayedPressEvent = 0; } } + } qreal QxFlickable::minYExtent() const @@ -1179,64 +1189,72 @@ bool QxFlickable::yflick() const bool QxFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event) { Q_D(QxFlickable); - QGraphicsSceneMouseEvent mouseEvent(event->type()); - QRectF myRect = mapToScene(QRectF(0, 0, width(), height())); - - QxItem *grabber = qobject_cast(mouseGrabberItem()); - bool stealThisEvent = d->stealMouse; - - if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) { - mouseEvent.setAccepted(false); - for (int i = 0x1; i <= 0x10; i <<= 1) { - if (event->buttons() & i) { - Qt::MouseButton button = Qt::MouseButton(i); - mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button))); - } - } - mouseEvent.setScenePos(event->scenePos()); - mouseEvent.setLastScenePos(event->lastScenePos()); - mouseEvent.setPos(mapFromScene(event->scenePos())); - mouseEvent.setLastPos(mapFromScene(event->lastScenePos())); - - switch(mouseEvent.type()) { - case QEvent::GraphicsSceneMouseMove: - d->handleMouseMoveEvent(&mouseEvent); - break; - case QEvent::GraphicsSceneMousePress: - if (d->delayedPressEvent) - return false; - - d->handleMousePressEvent(&mouseEvent); - d->captureDelayedPress(event); - break; - case QEvent::GraphicsSceneMouseRelease: - if (d->delayedPressEvent) { - // XXX akennedy - /* - scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent); - d->clearDelayedPress(); - */ - } - d->handleMouseReleaseEvent(&mouseEvent); - break; - default: - break; - } - grabber = qobject_cast(mouseGrabberItem()); - if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) { - d->clearDelayedPress(); - grabMouse(); - } - return stealThisEvent || d->delayedPressEvent; - } else if (d->lastPosTime.isValid()) { - d->lastPosTime.invalidate(); - } - if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) { - d->clearDelayedPress(); - d->stealMouse = false; - } - return false; + QGraphicsSceneMouseEvent mouseEvent(event->type()); + QRectF myRect = mapToScene(QRectF(0, 0, width(), height())); + + QxItem *grabber = mouseGrabberItem(); + bool stealThisEvent = d->stealMouse; + if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) { + mouseEvent.setAccepted(false); + for (int i = 0x1; i <= 0x10; i <<= 1) { + if (event->buttons() & i) { + Qt::MouseButton button = Qt::MouseButton(i); + mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button))); + } + } + mouseEvent.setScenePos(event->scenePos()); + mouseEvent.setLastScenePos(event->lastScenePos()); + mouseEvent.setPos(mapFromScene(event->scenePos())); + mouseEvent.setLastPos(mapFromScene(event->lastScenePos())); + + switch(mouseEvent.type()) { + case QEvent::GraphicsSceneMouseMove: + d->handleMouseMoveEvent(&mouseEvent); + break; + case QEvent::GraphicsSceneMousePress: + if (d->delayedPressEvent) + return false; + + d->handleMousePressEvent(&mouseEvent); + d->captureDelayedPress(event); + stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above + break; + case QEvent::GraphicsSceneMouseRelease: + if (d->delayedPressEvent) { + // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay) + // so we reset the grabber + if (mouseGrabberItem() == d->delayedPressTarget) + d->delayedPressTarget->ungrabMouse(); + //Use the event handler that will take care of finding the proper item to propagate the event + QApplication::sendEvent(QApplication::focusWidget(), d->delayedPressEvent); + d->clearDelayedPress(); + // We send the release + QApplication::sendEvent(mouseGrabberItem(), event); + // And the event has been consumed + return true; + } + d->handleMouseReleaseEvent(&mouseEvent); + break; + default: + break; + } + grabber = qobject_cast(mouseGrabberItem()); + if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) { + d->clearDelayedPress(); + grabMouse(); + } + + return stealThisEvent || d->delayedPressEvent; + } else if (d->lastPosTime.isValid()) { + d->lastPosTime.invalidate(); + } + if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) { + d->clearDelayedPress(); + d->stealMouse = false; + d->pressed = false; + } + return false; } bool QxFlickable::sceneEventFilter(QxItem *i, QEvent *e) diff --git a/src/graphicsitems/qxitem.cpp b/src/graphicsitems/qxitem.cpp index 4af41e7..b297dcb 100644 --- a/src/graphicsitems/qxitem.cpp +++ b/src/graphicsitems/qxitem.cpp @@ -67,6 +67,7 @@ #include #include #include +#include #ifndef FLT_MAX #define FLT_MAX 1E+37 @@ -1328,10 +1329,13 @@ void QxItem::grabMouse() { Q_D(QxItem); - QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(d->view); + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast(QApplication::focusWidget()); - if (mouseGrabberItem()) { - QxItem *grabber = v->mouseGrabber; + QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(view); + + if (QxItem *grabber = mouseGrabberItem()) { v->mouseFilters.clear(); QEvent e(QEvent::UngrabMouse); grabber->sceneEvent(&e); @@ -1345,7 +1349,10 @@ void QxItem::ungrabMouse() Q_D(QxItem); if (this == mouseGrabberItem()) { - QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(d->view); + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast(QApplication::focusWidget()); + QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(view); QxItem *grabber = v->mouseGrabber; v->mouseFilters.clear(); QEvent e(QEvent::UngrabMouse); @@ -1357,7 +1364,10 @@ void QxItem::ungrabMouse() QxItem *QxItem::mouseGrabberItem() const { Q_D(const QxItem); - return d->view?QxGraphicsViewPrivate::get(d->view)->mouseGrabber:0; + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast(QApplication::focusWidget()); + return view ? QxGraphicsViewPrivate::get(view)->mouseGrabber : 0; } static void children_append(QDeclarativeListProperty *p, QxItem *o) -- cgit v1.2.3 From 81889f74aa8a815fbda1cfc649167ac85d6de432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Nilsen?= Date: Wed, 5 Jan 2011 14:13:49 +0100 Subject: Fix double click/tap issues. --- src/graphicsitems/qxflickable.cpp | 25 +++++++++++++++---------- src/graphicsitems/qxitem.cpp | 9 +++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/graphicsitems/qxflickable.cpp b/src/graphicsitems/qxflickable.cpp index ce2ebc6..7055c2c 100644 --- a/src/graphicsitems/qxflickable.cpp +++ b/src/graphicsitems/qxflickable.cpp @@ -814,6 +814,7 @@ void QxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { Q_D(QxFlickable); if (d->interactive) { + d->clearDelayedPress(); d->handleMouseMoveEvent(event); event->accept(); } else { @@ -825,7 +826,15 @@ void QxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { Q_D(QxFlickable); if (d->interactive) { - d->clearDelayedPress(); + if (d->delayedPressEvent) { + d->stealMouse = false; + d->pressed = false; + setKeepMouseGrab(false); + QApplication::sendEvent(d->delayedPressTarget, d->delayedPressEvent); + QApplication::sendEvent(d->delayedPressTarget, event); + d->clearDelayedPress(); + return; + } d->handleMouseReleaseEvent(event); event->accept(); ungrabMouse(); @@ -922,15 +931,11 @@ void QxFlickable::timerEvent(QTimerEvent *event) if (event->timerId() == d->delayedPressTimer.timerId()) { d->delayedPressTimer.stop(); if (d->delayedPressEvent) { - QxItem *grabber = mouseGrabberItem(); - if (!grabber || grabber != this) { - // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay) - // so we reset the grabber - if (grabber == d->delayedPressTarget) - d->delayedPressTarget->ungrabMouse(); - //Use the event handler that will take care of finding the proper item to propagate the event - QApplication::sendEvent(QApplication::focusWidget(), d->delayedPressEvent); - } + d->stealMouse = false; + d->pressed = false; + setKeepMouseGrab(false); + d->delayedPressTarget->grabMouse(); + QApplication::sendEvent(d->delayedPressTarget, d->delayedPressEvent); delete d->delayedPressEvent; d->delayedPressEvent = 0; } diff --git a/src/graphicsitems/qxitem.cpp b/src/graphicsitems/qxitem.cpp index b297dcb..5b135c4 100644 --- a/src/graphicsitems/qxitem.cpp +++ b/src/graphicsitems/qxitem.cpp @@ -2601,6 +2601,15 @@ bool QxItem::event(QEvent *ev) case QEvent::FocusOut: d->focusChanged(hasFocus()); break; + case QEvent::GraphicsSceneMousePress: + mousePressEvent(static_cast(ev)); + break; + case QEvent::GraphicsSceneMouseRelease: + mouseReleaseEvent(static_cast(ev)); + break; + case QEvent::GraphicsSceneMouseMove: + mouseMoveEvent(static_cast(ev)); + break; default: break; } -- cgit v1.2.3 From e8a9d34705f2d6d4f5929cfd5ed9c64ef5c60fc7 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Wed, 5 Jan 2011 17:07:55 +0100 Subject: Add missing NOTIFY signals to Flipable --- src/graphicsitems/qxflipable.cpp | 4 ++++ src/graphicsitems/qxflipable_p.h | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/graphicsitems/qxflipable.cpp b/src/graphicsitems/qxflipable.cpp index 892ac52..87d7b4e 100644 --- a/src/graphicsitems/qxflipable.cpp +++ b/src/graphicsitems/qxflipable.cpp @@ -90,6 +90,8 @@ void QxFlipable::setFront(QxItem *front) d->front->setParentItem(this); if (Back == d->current) d->front->setOpacity(0.); + + emit frontChanged(); } QxItem *QxFlipable::back() @@ -113,6 +115,8 @@ void QxFlipable::setBack(QxItem *back) this, SLOT(retransformBack())); connect(back, SIGNAL(heightChanged()), this, SLOT(retransformBack())); + + emit backChanged(); } void QxFlipable::retransformBack() diff --git a/src/graphicsitems/qxflipable_p.h b/src/graphicsitems/qxflipable_p.h index 0d548e2..506cd22 100644 --- a/src/graphicsitems/qxflipable_p.h +++ b/src/graphicsitems/qxflipable_p.h @@ -54,8 +54,8 @@ class QxFlipable : public QxItem Q_OBJECT Q_ENUMS(Side) - Q_PROPERTY(QxItem *front READ front WRITE setFront) - Q_PROPERTY(QxItem *back READ back WRITE setBack) + Q_PROPERTY(QxItem *front READ front WRITE setFront NOTIFY frontChanged) + Q_PROPERTY(QxItem *back READ back WRITE setBack NOTIFY backChanged) Q_PROPERTY(Side side READ side NOTIFY sideChanged) //### flipAxis //### flipRotation @@ -74,6 +74,8 @@ public: Q_SIGNALS: void sideChanged(); + void backChanged(); + void frontChanged(); protected: virtual void transformChanged(const QTransform &newTransform, const QTransform &oldTransform); -- cgit v1.2.3