diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2009-07-15 03:23:34 (GMT) |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2009-07-15 03:23:34 (GMT) |
commit | 7d49812197294dc0cb33e1ad0bd2d56e3557040a (patch) | |
tree | 20b5374253f75ff9281058f641faf4097a28b954 /src/declarative | |
parent | cfe3f5eeb4c72afeab6bf12e27bcfd695156fa20 (diff) | |
download | Qt-7d49812197294dc0cb33e1ad0bd2d56e3557040a.zip Qt-7d49812197294dc0cb33e1ad0bd2d56e3557040a.tar.gz Qt-7d49812197294dc0cb33e1ad0bd2d56e3557040a.tar.bz2 |
Add experimental FocusRealm support.
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/fx/fx.pri | 2 | ||||
-rw-r--r-- | src/declarative/fx/qfxitem.cpp | 35 | ||||
-rw-r--r-- | src/declarative/fx/qfxitem_p.h | 13 | ||||
-rw-r--r-- | src/declarative/util/qfxview.cpp | 2 |
4 files changed, 47 insertions, 5 deletions
diff --git a/src/declarative/fx/fx.pri b/src/declarative/fx/fx.pri index 71517fd..b4ba742 100644 --- a/src/declarative/fx/fx.pri +++ b/src/declarative/fx/fx.pri @@ -14,6 +14,7 @@ HEADERS += \ fx/qfximage_p.h \ fx/qfxitem.h \ fx/qfxitem_p.h \ + fx/qfxfocusrealm.h \ fx/qfxkeyactions.h \ fx/qfxkeyproxy.h \ fx/qfxlayouts.h \ @@ -49,6 +50,7 @@ SOURCES += \ fx/qfximage.cpp \ fx/qfxpainteditem.cpp \ fx/qfxitem.cpp \ + fx/qfxfocusrealm.cpp \ fx/qfxkeyactions.cpp \ fx/qfxkeyproxy.cpp \ fx/qfxlayouts.cpp \ diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index f343f4e..62a4d95 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -2074,6 +2074,9 @@ QVariant QFxItem::itemChange(GraphicsItemChange change, if (options() & QFxItem::MouseFilter) d->gvAddMouseFilter(); + + if (d->canvas && d->isFocusItemForArea) + d->canvas->setFocusItem(this); } else if (change == ItemChildAddedChange || change == ItemChildRemovedChange) { childrenChanged(); @@ -2409,13 +2412,28 @@ QFxItem *QFxItem::mouseGrabberItem() const bool QFxItem::hasFocus() const { - return false; + Q_D(const QFxItem); + return d->isFocusItemForArea; } void QFxItem::setFocus(bool focus) { - Q_UNUSED(focus) - return; + Q_D(QFxItem); + QGraphicsScene *s = scene(); + if (s) { + if (d->hasActiveFocus) + s->setFocusItem(focus ? this : 0); + else if (focus) + s->setFocusItem(this); + else { + d->isFocusItemForArea = false; + focusChanged(false); + } + + } else { + d->isFocusItemForArea = focus; + focusChanged(focus); + } } /*! @@ -2425,7 +2443,8 @@ void QFxItem::setFocus(bool focus) bool QFxItem::hasActiveFocus() const { - return false; + Q_D(const QFxItem); + return d->hasActiveFocus; } bool QFxItem::activeFocusPanel() const @@ -2460,6 +2479,13 @@ void QFxItem::setOptions(Options options, bool set) Q_D(QFxItem); Options old = (Options)d->options; + if (options & IsFocusRealm) { + if (!set) { + qWarning("QFxItem::setOptions: Cannot unset IsFocusRealm"); + return; + } + } + if (set) d->options |= options; else @@ -2474,6 +2500,7 @@ void QFxItem::setOptions(Options options, bool set) setFiltersChildEvents(d->options & ChildMouseFilter); setFlag(QGraphicsItem::ItemAcceptsInputMethod, (d->options & AcceptsInputMethods)); setAcceptHoverEvents(d->options & HoverEvents); + d->isFocusRealm = static_cast<bool>(d->options & IsFocusRealm); if ((old & MouseFilter) != (d->options & MouseFilter)) { if (d->options & MouseFilter) diff --git a/src/declarative/fx/qfxitem_p.h b/src/declarative/fx/qfxitem_p.h index 4a0ea18..eddeb9b 100644 --- a/src/declarative/fx/qfxitem_p.h +++ b/src/declarative/fx/qfxitem_p.h @@ -95,6 +95,7 @@ public: q->setAcceptedMouseButtons(Qt::NoButton); q->setFlag(QGraphicsItem::ItemHasNoContents, true); q->setFlag(QGraphicsItem::ItemIsFocusable, true); + mouseSetsFocus = false; } QString _id; @@ -195,6 +196,18 @@ public: void gvRemoveMouseFilter(); void gvAddMouseFilter(); + + virtual void setActiveFocus(bool b) { + Q_Q(QFxItem); + QGraphicsItemPrivate::setActiveFocus(b); + q->activeFocusChanged(b); + } + + virtual void setFocusItemForArea(bool b) { + Q_Q(QFxItem); + QGraphicsItemPrivate::setFocusItemForArea(b); + q->focusChanged(b); + } }; QT_END_NAMESPACE diff --git a/src/declarative/util/qfxview.cpp b/src/declarative/util/qfxview.cpp index 05acf87..e307232 100644 --- a/src/declarative/util/qfxview.cpp +++ b/src/declarative/util/qfxview.cpp @@ -163,7 +163,7 @@ void QFxViewPrivate::init() scene.setItemIndexMethod(QGraphicsScene::NoIndex); q->viewport()->setFocusPolicy(Qt::NoFocus); - + scene.setStickyFocus(true); //### needed for correct focus handling } /*! |