summaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2009-07-15 03:23:34 (GMT)
committerMichael Brasser <michael.brasser@nokia.com>2009-07-15 03:23:34 (GMT)
commit7d49812197294dc0cb33e1ad0bd2d56e3557040a (patch)
tree20b5374253f75ff9281058f641faf4097a28b954 /src/declarative
parentcfe3f5eeb4c72afeab6bf12e27bcfd695156fa20 (diff)
downloadQt-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.pri2
-rw-r--r--src/declarative/fx/qfxitem.cpp35
-rw-r--r--src/declarative/fx/qfxitem_p.h13
-rw-r--r--src/declarative/util/qfxview.cpp2
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
}
/*!