From: Lars Knoll Date: Mon, 27 Jun 2011 21:00:28 +0000 (+0200) Subject: Replace the QGraphicsSceneHoverEvent with a QHoverEvent X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=41760be67115f76c553f4fe641f52329b8f8dcba;p=konrad%2Fqtdeclarative.git Replace the QGraphicsSceneHoverEvent with a QHoverEvent One step towards getting rid of the remaining graphics view dependencies Change-Id: Ieeb84fc115c96393fdee453615a424679dc48177 Reviewed-on: http://codereview.qt.nokia.com/1139 Reviewed-by: Qt Sanity Bot Reviewed-by: Michael Brasser --- diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp index c9f3285..b009ec5 100644 --- a/src/declarative/items/qsgcanvas.cpp +++ b/src/declarative/items/qsgcanvas.cpp @@ -567,25 +567,6 @@ void QSGCanvasPrivate::sceneMouseEventFromMouseEvent(QGraphicsSceneMouseEvent &s } /*! -Fill in the data in \a hoverEvent based on \a mouseEvent. This method leaves the item local positions in -\a hoverEvent untouched (these are filled in later). -*/ -void QSGCanvasPrivate::sceneHoverEventFromMouseEvent(QGraphicsSceneHoverEvent &hoverEvent, QMouseEvent *mouseEvent) -{ - Q_Q(QSGCanvas); - hoverEvent.setWidget(q); - hoverEvent.setScenePos(mouseEvent->pos()); - hoverEvent.setScreenPos(mouseEvent->globalPos()); - if (lastMousePosition.isNull()) lastMousePosition = mouseEvent->pos(); - hoverEvent.setLastScenePos(lastMousePosition); - hoverEvent.setLastScreenPos(q->mapToGlobal(lastMousePosition)); - hoverEvent.setModifiers(mouseEvent->modifiers()); - hoverEvent.setAccepted(mouseEvent->isAccepted()); - - lastMousePosition = mouseEvent->pos(); -} - -/*! Translates the data in \a touchEvent to this canvas. This method leaves the item local positions in \a touchEvent untouched (these are filled in later). */ @@ -980,18 +961,11 @@ void QSGCanvasPrivate::clearHover() if (!hoverItem) return; - QGraphicsSceneHoverEvent hoverEvent; - hoverEvent.setWidget(q); - - QPoint cursorPos = QCursor::pos(); - hoverEvent.setScenePos(q->mapFromGlobal(cursorPos)); - hoverEvent.setLastScenePos(hoverEvent.scenePos()); - hoverEvent.setScreenPos(cursorPos); - hoverEvent.setLastScreenPos(hoverEvent.screenPos()); + QPointF pos = q->mapFromGlobal(QCursor::pos()); QSGItem *item = hoverItem; hoverItem = 0; - sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, &hoverEvent); + sendHoverEvent(QEvent::HoverLeave, item, pos, pos, QApplication::keyboardModifiers(), true); } @@ -1197,25 +1171,20 @@ void QSGCanvas::mouseDoubleClickEvent(QMouseEvent *event) event->setAccepted(sceneEvent.isAccepted()); } -void QSGCanvasPrivate::sendHoverEvent(QEvent::Type type, QSGItem *item, - QGraphicsSceneHoverEvent *event) +bool QSGCanvasPrivate::sendHoverEvent(QEvent::Type type, QSGItem *item, + const QPointF &scenePos, const QPointF &lastScenePos, + Qt::KeyboardModifiers modifiers, bool accepted) { Q_Q(QSGCanvas); const QTransform transform = QSGItemPrivate::get(item)->canvasToItemTransform(); //create copy of event - QGraphicsSceneHoverEvent hoverEvent(type); - hoverEvent.setWidget(event->widget()); - hoverEvent.setPos(transform.map(event->scenePos())); - hoverEvent.setScenePos(event->scenePos()); - hoverEvent.setScreenPos(event->screenPos()); - hoverEvent.setLastPos(transform.map(event->lastScenePos())); - hoverEvent.setLastScenePos(event->lastScenePos()); - hoverEvent.setLastScreenPos(event->lastScreenPos()); - hoverEvent.setModifiers(event->modifiers()); - hoverEvent.setAccepted(event->isAccepted()); + QHoverEvent hoverEvent(type, transform.map(scenePos), transform.map(lastScenePos), modifiers); + hoverEvent.setAccepted(accepted); q->sendEvent(item, &hoverEvent); + + return hoverEvent.isAccepted(); } void QSGCanvas::mouseMoveEvent(QMouseEvent *event) @@ -1227,19 +1196,22 @@ void QSGCanvas::mouseMoveEvent(QMouseEvent *event) #endif if (!d->mouseGrabberItem) { - QGraphicsSceneHoverEvent hoverEvent; - d->sceneHoverEventFromMouseEvent(hoverEvent, event); + if (d->lastMousePosition.isNull()) + d->lastMousePosition = event->pos(); + QPointF last = d->lastMousePosition; + d->lastMousePosition = event->pos(); - bool delivered = d->deliverHoverEvent(d->rootItem, &hoverEvent); + bool accepted = event->isAccepted(); + bool delivered = d->deliverHoverEvent(d->rootItem, event->pos(), last, event->modifiers(), accepted); if (!delivered) { //take care of any exits if (d->hoverItem) { QSGItem *item = d->hoverItem; d->hoverItem = 0; - d->sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, &hoverEvent); + accepted = d->sendHoverEvent(QEvent::HoverLeave, item, event->pos(), last, event->modifiers(), accepted); } } - event->setAccepted(hoverEvent.isAccepted()); + event->setAccepted(accepted); return; } @@ -1250,14 +1222,15 @@ void QSGCanvas::mouseMoveEvent(QMouseEvent *event) event->setAccepted(sceneEvent.isAccepted()); } -bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, QGraphicsSceneHoverEvent *event) +bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, const QPointF &scenePos, const QPointF &lastScenePos, + Qt::KeyboardModifiers modifiers, bool &accepted) { QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item); if (itemPrivate->opacity == 0.0) return false; if (itemPrivate->flags & QSGItem::ItemClipsChildrenToShape) { - QPointF p = item->mapFromScene(event->scenePos()); + QPointF p = item->mapFromScene(scenePos); if (!QRectF(0, 0, item->width(), item->height()).contains(p)) return false; } @@ -1267,27 +1240,27 @@ bool QSGCanvasPrivate::deliverHoverEvent(QSGItem *item, QGraphicsSceneHoverEvent QSGItem *child = children.at(ii); if (!child->isEnabled()) continue; - if (deliverHoverEvent(child, event)) + if (deliverHoverEvent(child, scenePos, lastScenePos, modifiers, accepted)) return true; } if (itemPrivate->hoverEnabled) { - QPointF p = item->mapFromScene(event->scenePos()); + QPointF p = item->mapFromScene(scenePos); if (QRectF(0, 0, item->width(), item->height()).contains(p)) { if (hoverItem == item) { //move - sendHoverEvent(QEvent::GraphicsSceneHoverMove, item, event); + accepted = sendHoverEvent(QEvent::HoverMove, item, scenePos, lastScenePos, modifiers, accepted); } else { //exit from previous if (hoverItem) { QSGItem *item = hoverItem; hoverItem = 0; - sendHoverEvent(QEvent::GraphicsSceneHoverLeave, item, event); + accepted = sendHoverEvent(QEvent::HoverLeave, item, scenePos, lastScenePos, modifiers, accepted); } //enter new item hoverItem = item; - sendHoverEvent(QEvent::GraphicsSceneHoverEnter, item, event); + accepted = sendHoverEvent(QEvent::HoverEnter, item, scenePos, lastScenePos, modifiers, accepted); } return true; } @@ -1630,10 +1603,10 @@ bool QSGCanvas::sendEvent(QSGItem *item, QEvent *e) case QEvent::Wheel: QSGItemPrivate::get(item)->deliverWheelEvent(static_cast(e)); break; - case QEvent::GraphicsSceneHoverEnter: - case QEvent::GraphicsSceneHoverLeave: - case QEvent::GraphicsSceneHoverMove: - QSGItemPrivate::get(item)->deliverHoverEvent(static_cast(e)); + case QEvent::HoverEnter: + case QEvent::HoverLeave: + case QEvent::HoverMove: + QSGItemPrivate::get(item)->deliverHoverEvent(static_cast(e)); break; case QEvent::TouchBegin: case QEvent::TouchUpdate: diff --git a/src/declarative/items/qsgcanvas_p.h b/src/declarative/items/qsgcanvas_p.h index a5baba6..dfe189c 100644 --- a/src/declarative/items/qsgcanvas_p.h +++ b/src/declarative/items/qsgcanvas_p.h @@ -114,9 +114,9 @@ public: bool deliverTouchPoints(QSGItem *, QTouchEvent *, const QList &, QSet *, QHash > *); bool deliverTouchEvent(QTouchEvent *); - void sceneHoverEventFromMouseEvent(QGraphicsSceneHoverEvent &, QMouseEvent *); - bool deliverHoverEvent(QSGItem *, QGraphicsSceneHoverEvent *); - void sendHoverEvent(QEvent::Type, QSGItem *, QGraphicsSceneHoverEvent *); + bool deliverHoverEvent(QSGItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, bool &accepted); + bool sendHoverEvent(QEvent::Type, QSGItem *, const QPointF &scenePos, const QPointF &lastScenePos, + Qt::KeyboardModifiers modifiers, bool accepted); void clearHover(); void deliverDragEvent(QSGDragEvent *); bool deliverDragEvent(QSGItem *item, QSGDragEvent *); diff --git a/src/declarative/items/qsgitem.cpp b/src/declarative/items/qsgitem.cpp index 84e5705..4778275 100644 --- a/src/declarative/items/qsgitem.cpp +++ b/src/declarative/items/qsgitem.cpp @@ -1674,17 +1674,17 @@ void QSGItem::touchEvent(QTouchEvent *event) event->ignore(); } -void QSGItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +void QSGItem::hoverEnterEvent(QHoverEvent *event) { Q_UNUSED(event); } -void QSGItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +void QSGItem::hoverMoveEvent(QHoverEvent *event) { Q_UNUSED(event); } -void QSGItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +void QSGItem::hoverLeaveEvent(QHoverEvent *event) { Q_UNUSED(event); } @@ -2152,19 +2152,19 @@ void QSGItemPrivate::deliverTouchEvent(QTouchEvent *e) q->touchEvent(e); } -void QSGItemPrivate::deliverHoverEvent(QGraphicsSceneHoverEvent *e) +void QSGItemPrivate::deliverHoverEvent(QHoverEvent *e) { Q_Q(QSGItem); switch(e->type()) { default: Q_ASSERT(!"Unknown event type"); - case QEvent::GraphicsSceneHoverEnter: + case QEvent::HoverEnter: q->hoverEnterEvent(e); break; - case QEvent::GraphicsSceneHoverLeave: + case QEvent::HoverLeave: q->hoverLeaveEvent(e); break; - case QEvent::GraphicsSceneHoverMove: + case QEvent::HoverMove: q->hoverMoveEvent(e); break; } diff --git a/src/declarative/items/qsgitem.h b/src/declarative/items/qsgitem.h index 0505a36..86396dc 100644 --- a/src/declarative/items/qsgitem.h +++ b/src/declarative/items/qsgitem.h @@ -361,9 +361,9 @@ protected: virtual void mouseUngrabEvent(); // XXX todo - params? virtual void wheelEvent(QWheelEvent *event); virtual void touchEvent(QTouchEvent *event); - virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); - virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); - virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + virtual void hoverEnterEvent(QHoverEvent *event); + virtual void hoverMoveEvent(QHoverEvent *event); + virtual void hoverLeaveEvent(QHoverEvent *event); virtual void dragMoveEvent(QSGDragEvent *event); virtual void dragEnterEvent(QSGDragEvent *event); virtual void dragExitEvent(QSGDragEvent *event); diff --git a/src/declarative/items/qsgitem_p.h b/src/declarative/items/qsgitem_p.h index 062df2b..0c1b3f1 100644 --- a/src/declarative/items/qsgitem_p.h +++ b/src/declarative/items/qsgitem_p.h @@ -323,7 +323,7 @@ public: void deliverMouseEvent(QGraphicsSceneMouseEvent *); void deliverWheelEvent(QWheelEvent *); void deliverTouchEvent(QTouchEvent *); - void deliverHoverEvent(QGraphicsSceneHoverEvent *); + void deliverHoverEvent(QHoverEvent *); void deliverDragEvent(QSGDragEvent *); bool calcEffectiveVisible() const; diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index 6886ccc..7335980 100644 --- a/src/declarative/items/qsgmousearea.cpp +++ b/src/declarative/items/qsgmousearea.cpp @@ -653,27 +653,29 @@ void QSGMouseArea::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) } } -void QSGMouseArea::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +void QSGMouseArea::hoverEnterEvent(QHoverEvent *event) { Q_D(QSGMouseArea); if (!d->absorb) { QSGItem::hoverEnterEvent(event); } else { - d->lastPos = event->pos(); + d->lastPos = event->posF(); + d->lastModifiers = event->modifiers(); setHovered(true); - QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false); + QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); emit mousePositionChanged(&me); } } -void QSGMouseArea::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +void QSGMouseArea::hoverMoveEvent(QHoverEvent *event) { Q_D(QSGMouseArea); if (!d->absorb) { QSGItem::hoverMoveEvent(event); } else { - d->lastPos = event->pos(); - QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, event->modifiers(), false, false); + d->lastPos = event->posF(); + d->lastModifiers = event->modifiers(); + QSGMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); emit mousePositionChanged(&me); me.setX(d->lastPos.x()); me.setY(d->lastPos.y()); @@ -681,7 +683,7 @@ void QSGMouseArea::hoverMoveEvent(QGraphicsSceneHoverEvent *event) } } -void QSGMouseArea::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +void QSGMouseArea::hoverLeaveEvent(QHoverEvent *event) { Q_D(QSGMouseArea); if (!d->absorb) diff --git a/src/declarative/items/qsgmousearea_p.h b/src/declarative/items/qsgmousearea_p.h index d7248bc..3255210 100644 --- a/src/declarative/items/qsgmousearea_p.h +++ b/src/declarative/items/qsgmousearea_p.h @@ -220,9 +220,9 @@ protected: virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); virtual void mouseUngrabEvent(); - virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); - virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); - virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + virtual void hoverEnterEvent(QHoverEvent *event); + virtual void hoverMoveEvent(QHoverEvent *event); + virtual void hoverLeaveEvent(QHoverEvent *event); virtual bool childMouseEventFilter(QSGItem *i, QEvent *e); virtual void timerEvent(QTimerEvent *event);