summaryrefslogtreecommitdiffstats
path: root/src/declarative/canvas
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-04-24 04:40:01 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-04-24 04:40:01 (GMT)
commitb7451b45e43f1f21bc2b9e35c330f4f27225307d (patch)
tree3528b8ed9ac564e96dbe3aff224f5441afdb0182 /src/declarative/canvas
parent19a507c5cc8c178a0e00fa302f6315c4b18b50a5 (diff)
downloadQt-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.cpp51
-rw-r--r--src/declarative/canvas/qsimplecanvas_graphicsview.cpp33
-rw-r--r--src/declarative/canvas/qsimplecanvas_p.h7
-rw-r--r--src/declarative/canvas/qsimplecanvasitem.cpp1
-rw-r--r--src/declarative/canvas/qsimplecanvasitem.h15
-rw-r--r--src/declarative/canvas/qsimplecanvasitem_p.h2
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;