From b2797c66343ba0cc2e276c7f24e512b59788b6f7 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 16 Jul 2009 10:04:45 +1000 Subject: Get KeyProxy working correctly with focus realms. --- src/declarative/fx/qfxkeyproxy.cpp | 18 ++++++++++++------ src/gui/graphicsview/qgraphicsscene.cpp | 15 +++++++++++++++ src/gui/graphicsview/qgraphicsscene.h | 1 + 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/declarative/fx/qfxkeyproxy.cpp b/src/declarative/fx/qfxkeyproxy.cpp index f07691a..298751f 100644 --- a/src/declarative/fx/qfxkeyproxy.cpp +++ b/src/declarative/fx/qfxkeyproxy.cpp @@ -102,11 +102,13 @@ QList *QFxKeyProxy::targets() const void QFxKeyProxy::keyPressEvent(QKeyEvent *e) { + if (!scene()) + return; if (!d->inPress) { d->inPress = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QFxItem *i = d->targets.at(ii); //### FocusRealm - if (i && scene()) + QFxItem *i = qobject_cast(scene()->focusItem(d->targets.at(ii))); + if (i) scene()->sendEvent(i, e); if (e->isAccepted()) { d->inPress = false; @@ -119,11 +121,13 @@ void QFxKeyProxy::keyPressEvent(QKeyEvent *e) void QFxKeyProxy::keyReleaseEvent(QKeyEvent *e) { + if (!scene()) + return; if (!d->inRelease) { d->inRelease = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QFxItem *i = d->targets.at(ii); //### FocusRealm - if (i && scene()) + QFxItem *i = qobject_cast(scene()->focusItem(d->targets.at(ii))); + if (i) scene()->sendEvent(i, e); if (e->isAccepted()) { d->inRelease = false; @@ -136,11 +140,13 @@ void QFxKeyProxy::keyReleaseEvent(QKeyEvent *e) void QFxKeyProxy::inputMethodEvent(QInputMethodEvent *e) { + if (!scene()) + return; if (!d->inIM) { d->inIM = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QFxItem *i = d->targets.at(ii); //### FocusRealm - if (i && scene()) + QFxItem *i = qobject_cast(scene()->focusItem(d->targets.at(ii))); + if (i) scene()->sendEvent(i, e); if (e->isAccepted()) { d->inIM = false; diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 3d77ecf..30f194a 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -2470,6 +2470,21 @@ QGraphicsItem *QGraphicsScene::focusItem() const } /*! + \internal + Returns the focus item for \a item. In the presence of focus realms, + the focus item is the leaf descendant of \a item that would gain active + focus if \a item were given active focus. If not focus realms are involved, + \a item is returned. +*/ +QGraphicsItem *QGraphicsScene::focusItem(QGraphicsItem *item) const +{ + Q_D(const QGraphicsScene); + while (item && d->focusItemForFocusArea.contains(item)) + item = d->focusItemForFocusArea.value(item); + return item; +} + +/*! Sets the scene's focus item to \a item, with the focus reason \a focusReason, after removing focus from any previous item that may have had focus. diff --git a/src/gui/graphicsview/qgraphicsscene.h b/src/gui/graphicsview/qgraphicsscene.h index d790f90..e599652 100644 --- a/src/gui/graphicsview/qgraphicsscene.h +++ b/src/gui/graphicsview/qgraphicsscene.h @@ -208,6 +208,7 @@ public: void removeItem(QGraphicsItem *item); QGraphicsItem *focusItem() const; + QGraphicsItem *focusItem(QGraphicsItem *item) const; void setFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason); bool hasFocus() const; void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason); -- cgit v0.12