diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-04-24 04:40:01 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-04-24 04:40:01 (GMT) |
commit | b7451b45e43f1f21bc2b9e35c330f4f27225307d (patch) | |
tree | 3528b8ed9ac564e96dbe3aff224f5441afdb0182 /src/declarative/canvas | |
parent | 19a507c5cc8c178a0e00fa302f6315c4b18b50a5 (diff) | |
download | Qt-b7451b45e43f1f21bc2b9e35c330f4f27225307d.zip Qt-b7451b45e43f1f21bc2b9e35c330f4f27225307d.tar.gz Qt-b7451b45e43f1f21bc2b9e35c330f4f27225307d.tar.bz2 |
Add a QSimpleCanvasItem::ChildMouseFilter option
Child mouse filter only filters events sent to your children
Diffstat (limited to 'src/declarative/canvas')
-rw-r--r-- | src/declarative/canvas/qsimplecanvas.cpp | 51 | ||||
-rw-r--r-- | src/declarative/canvas/qsimplecanvas_graphicsview.cpp | 33 | ||||
-rw-r--r-- | src/declarative/canvas/qsimplecanvas_p.h | 7 | ||||
-rw-r--r-- | src/declarative/canvas/qsimplecanvasitem.cpp | 1 | ||||
-rw-r--r-- | src/declarative/canvas/qsimplecanvasitem.h | 15 | ||||
-rw-r--r-- | src/declarative/canvas/qsimplecanvasitem_p.h | 2 |
6 files changed, 89 insertions, 20 deletions
diff --git a/src/declarative/canvas/qsimplecanvas.cpp b/src/declarative/canvas/qsimplecanvas.cpp index 5eb6c60..5d35a2a 100644 --- a/src/declarative/canvas/qsimplecanvas.cpp +++ b/src/declarative/canvas/qsimplecanvas.cpp @@ -417,7 +417,7 @@ QGraphicsSceneMouseEvent *QSimpleCanvasPrivate::mouseEventToSceneMouseEvent(QMou return me; } -bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEvent *e) +bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEvent *e, bool seenChildFilter) { if(base->clipType()) { QRectF br = base->boundingRect(); @@ -427,22 +427,25 @@ bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEven } const QList<QSimpleCanvasItem *> &children = base->d_func()->children; + + if(base->options() & QSimpleCanvasItem::ChildMouseFilter) + seenChildFilter = true; + for(int ii = children.count() - 1; ii >= 0; --ii) { if(children.at(ii)->visible() != 0.) - if(deliverMousePress(children.at(ii), e)) + if(deliverMousePress(children.at(ii), e, seenChildFilter)) return true; } - if(base->acceptedMouseButtons() & e->button()) { + if(base->acceptedMouseButtons() & e->button() || base->options() & QSimpleCanvasItem::ChildMouseFilter) { + QRectF br = base->boundingRect(); QPoint pos = base->mapFromScene(e->pos()).toPoint(); if(br.contains(pos)) { QGraphicsSceneMouseEvent *me = mouseEventToSceneMouseEvent(e, pos); - if (me->type() == QEvent::GraphicsSceneMousePress) - base->mousePressEvent(me); - else - base->mouseDoubleClickEvent(me); + + sendMouseEvent(base, me); bool isAccepted = me->isAccepted(); delete me; if(isAccepted) { @@ -454,6 +457,36 @@ bool QSimpleCanvasPrivate::deliverMousePress(QSimpleCanvasItem *base, QMouseEven return false; } +// Delivers e to item +void QSimpleCanvasPrivate::sendMouseEvent(QSimpleCanvasItem *item, QGraphicsSceneMouseEvent *e) +{ + QSimpleCanvasItem *p = item->parent(); + while(p) { + if(p->options() & QSimpleCanvasItem::ChildMouseFilter) { + if(p->mouseFilter(e)) + return; + } + p = p->parent(); + } + switch(e->type()) { + case QEvent::GraphicsSceneMousePress: + item->mousePressEvent(e); + break; + case QEvent::GraphicsSceneMouseRelease: + item->mouseReleaseEvent(e); + break; + case QEvent::GraphicsSceneMouseMove: + item->mouseMoveEvent(e); + break; + case QEvent::GraphicsSceneMouseDoubleClick: + item->mouseDoubleClickEvent(e); + break; + default: + break; + } +} + + QSimpleCanvasRootLayer::QSimpleCanvasRootLayer(QSimpleCanvas *c) : _canvas(c) { @@ -665,7 +698,7 @@ void QSimpleCanvas::mouseMoveEvent(QMouseEvent *e) } else if(d->isSimpleCanvas() && d->lastMouseItem) { QPoint p = d->lastMouseItem->mapFromScene(e->pos()).toPoint(); QGraphicsSceneMouseEvent *me = d->mouseEventToSceneMouseEvent(e, p); - d->lastMouseItem->mouseMoveEvent(me); + d->sendMouseEvent(d->lastMouseItem, me); e->setAccepted(me->isAccepted()); delete me; } else { @@ -680,7 +713,7 @@ void QSimpleCanvas::mouseReleaseEvent(QMouseEvent *e) } else if(d->isSimpleCanvas() && d->lastMouseItem) { QPoint p = d->lastMouseItem->mapFromScene(e->pos()).toPoint(); QGraphicsSceneMouseEvent *me = d->mouseEventToSceneMouseEvent(e, p); - d->lastMouseItem->mouseReleaseEvent(me); + d->sendMouseEvent(d->lastMouseItem, me); d->lastMouseItem->mouseUngrabEvent(); e->setAccepted(me->isAccepted()); delete me; diff --git a/src/declarative/canvas/qsimplecanvas_graphicsview.cpp b/src/declarative/canvas/qsimplecanvas_graphicsview.cpp index 0f80128..e3cdf19 100644 --- a/src/declarative/canvas/qsimplecanvas_graphicsview.cpp +++ b/src/declarative/canvas/qsimplecanvas_graphicsview.cpp @@ -88,21 +88,54 @@ QRectF QSimpleGraphicsItem::boundingRect() const void QSimpleGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { + QSimpleCanvasItem *p = owner->parent(); + while(p) { + if(p->options() & QSimpleCanvasItem::ChildMouseFilter) { + if(p->mouseFilter(event)) + return; + } + p = p->parent(); + } owner->mousePressEvent(event); } void QSimpleGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + QSimpleCanvasItem *p = owner->parent(); + while(p) { + if(p->options() & QSimpleCanvasItem::ChildMouseFilter) { + if(p->mouseFilter(event)) + return; + } + p = p->parent(); + } owner->mouseReleaseEvent(event); + ungrabMouse(); } void QSimpleGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { + QSimpleCanvasItem *p = owner->parent(); + while(p) { + if(p->options() & QSimpleCanvasItem::ChildMouseFilter) { + if(p->mouseFilter(event)) + return; + } + p = p->parent(); + } owner->mouseDoubleClickEvent(event); } void QSimpleGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + QSimpleCanvasItem *p = owner->parent(); + while(p) { + if(p->options() & QSimpleCanvasItem::ChildMouseFilter) { + if(p->mouseFilter(event)) + return; + } + p = p->parent(); + } owner->mouseMoveEvent(event); } diff --git a/src/declarative/canvas/qsimplecanvas_p.h b/src/declarative/canvas/qsimplecanvas_p.h index 4c8b41e..44e5a7e 100644 --- a/src/declarative/canvas/qsimplecanvas_p.h +++ b/src/declarative/canvas/qsimplecanvas_p.h @@ -107,8 +107,8 @@ class QSimpleCanvasPrivate public: QSimpleCanvasPrivate(QSimpleCanvas *canvas) : q(canvas), timer(0), root(0), lrpTime(0), canvasServer(0), focusItem(0), - lastFocusItem(0), lastMouseItem(0), isSetup(false), - view(0) + lastFocusItem(0), lastMouseItem(0), + isSetup(false), view(0) #if defined(QFX_RENDER_OPENGL) ,egl(q, this), basicShadersInstance(0) #endif @@ -160,9 +160,10 @@ public: void removeMouseFilter(QSimpleCanvasItem *); QList<QSimpleCanvasItem *> mouseFilters; bool filter(QMouseEvent *e); - bool deliverMousePress(QSimpleCanvasItem *, QMouseEvent *); + bool deliverMousePress(QSimpleCanvasItem *, QMouseEvent *, bool = false); QGraphicsSceneMouseEvent *mouseEventToSceneMouseEvent(QMouseEvent *, const QPoint &); QSimpleCanvasItem *lastMouseItem; + void sendMouseEvent(QSimpleCanvasItem *, QGraphicsSceneMouseEvent *); bool isSetup; diff --git a/src/declarative/canvas/qsimplecanvasitem.cpp b/src/declarative/canvas/qsimplecanvasitem.cpp index 95f7623..b7e3ef0 100644 --- a/src/declarative/canvas/qsimplecanvasitem.cpp +++ b/src/declarative/canvas/qsimplecanvasitem.cpp @@ -1287,6 +1287,7 @@ void QSimpleCanvasItem::setOptions(Options options, bool set) d->gvAddMouseFilter(); else d->gvRemoveMouseFilter(); + } else { QSimpleCanvas *c = canvas(); if(c) { diff --git a/src/declarative/canvas/qsimplecanvasitem.h b/src/declarative/canvas/qsimplecanvasitem.h index d51f2c8..9b010e8 100644 --- a/src/declarative/canvas/qsimplecanvasitem.h +++ b/src/declarative/canvas/qsimplecanvasitem.h @@ -82,13 +82,14 @@ public: ClipToRect = 0x03 }; enum Option { NoOption = 0x00000000, MouseFilter = 0x00000001, - HoverEvents = 0x00000002, - MouseEvents = 0x00000004, - HasContents = 0x00000008, - SimpleItem = 0x00000010, - IsFocusPanel = 0x00000020, - IsFocusRealm = 0x00000040, - AcceptsInputMethods = 0x00000080}; + ChildMouseFilter = 0x00000002, + HoverEvents = 0x00000004, + MouseEvents = 0x00000008, + HasContents = 0x00000010, + SimpleItem = 0x00000020, + IsFocusPanel = 0x00000040, + IsFocusRealm = 0x00000080, + AcceptsInputMethods = 0x00000100}; Q_DECLARE_FLAGS(Options, Option); QSimpleCanvasItem(QSimpleCanvasItem *parent=0); diff --git a/src/declarative/canvas/qsimplecanvasitem_p.h b/src/declarative/canvas/qsimplecanvasitem_p.h index 7f66be5..7a90c24 100644 --- a/src/declarative/canvas/qsimplecanvasitem_p.h +++ b/src/declarative/canvas/qsimplecanvasitem_p.h @@ -137,7 +137,7 @@ public: QSimpleCanvasItem::ClipType clip:3; QSimpleCanvasItem::TransformOrigin origin:4; - int options:8; + int options:9; bool focusable:1; bool wantsActiveFocusPanelPendingCanvas:1; bool hasBeenActiveFocusPanel:1; |