Replace the QGraphicsSceneHoverEvent with a QHoverEvent
authorLars Knoll <lars.knoll@nokia.com>
Mon, 27 Jun 2011 21:00:28 +0000 (23:00 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 7 Jul 2011 09:54:54 +0000 (11:54 +0200)
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 <qt_sanity_bot@ovi.com>
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>

src/declarative/items/qsgcanvas.cpp
src/declarative/items/qsgcanvas_p.h
src/declarative/items/qsgitem.cpp
src/declarative/items/qsgitem.h
src/declarative/items/qsgitem_p.h
src/declarative/items/qsgmousearea.cpp
src/declarative/items/qsgmousearea_p.h

index c9f3285..b009ec5 100644 (file)
@@ -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<QWheelEvent *>(e));
         break;
-    case QEvent::GraphicsSceneHoverEnter:
-    case QEvent::GraphicsSceneHoverLeave:
-    case QEvent::GraphicsSceneHoverMove:
-        QSGItemPrivate::get(item)->deliverHoverEvent(static_cast<QGraphicsSceneHoverEvent *>(e));
+    case QEvent::HoverEnter:
+    case QEvent::HoverLeave:
+    case QEvent::HoverMove:
+        QSGItemPrivate::get(item)->deliverHoverEvent(static_cast<QHoverEvent *>(e));
         break;
     case QEvent::TouchBegin:
     case QEvent::TouchUpdate:
index a5baba6..dfe189c 100644 (file)
@@ -114,9 +114,9 @@ public:
     bool deliverTouchPoints(QSGItem *, QTouchEvent *, const QList<QTouchEvent::TouchPoint> &, QSet<int> *,
             QHash<QSGItem *, QList<QTouchEvent::TouchPoint> > *);
     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 *);
index 84e5705..4778275 100644 (file)
@@ -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;
     }
index 0505a36..86396dc 100644 (file)
@@ -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);
index 062df2b..0c1b3f1 100644 (file)
@@ -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;
index 6886ccc..7335980 100644 (file)
@@ -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)
index d7248bc..3255210 100644 (file)
@@ -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);