diff options
author | Tor Arne Vestbø <tor.arne.vestbo@nokia.com> | 2010-12-07 13:27:14 (GMT) |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@nokia.com> | 2010-12-07 20:51:16 (GMT) |
commit | 783a278f243c6411f5f32d11f2165b9eed9b6f8c (patch) | |
tree | 7c250ad639d7c669cb5622e2187ac91999479917 /src/declarative | |
parent | 6af078b2a13f4855a35d48376e58154ee2d57ec1 (diff) | |
download | Qt-783a278f243c6411f5f32d11f2165b9eed9b6f8c.zip Qt-783a278f243c6411f5f32d11f2165b9eed9b6f8c.tar.gz Qt-783a278f243c6411f5f32d11f2165b9eed9b6f8c.tar.bz2 |
Don't emit activeFocusChanged() unless the active focus actually changed
We would previously call subFocusItemChanged(0) on the item as part of
clearing the subfocus, even if the item in question would recieve a new
subfocus item as part of setting the new subfocus.
This resulted in the declarative item emitting activeFocusChanged(false)
and then activeFocusChanged(true), which was affecting any animation or
state bound to the activeFocus property of the item.
We now stop clearing the subfocus when encountering an item that we know
will get subfocus during the set-subfocus pass. We then set subfocus all
the way to the root item, since the subfocus item itself might change.
The effect of this is that the declarative item will only get one call
to subFocusItemChanged(), passing the new subfocus item, instead of two.
This means the declarative item can keep track of wherther ot not it had
a subfocus item previously, and only emit activeFocusChanged() when the
active focus goes from true to false or false to true.
Task-number: QTBUG-15615
Reviewed-by: Yoann Lopes <yoann.lopes@nokia.com>
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativeitem_p.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h index d8635b9..a36ee34 100644 --- a/src/declarative/graphicsitems/qdeclarativeitem_p.h +++ b/src/declarative/graphicsitems/qdeclarativeitem_p.h @@ -126,7 +126,7 @@ public: widthValid(false), heightValid(false), componentComplete(true), keepMouse(false), smooth(false), transformOriginDirty(true), doneEventPreHandler(false), keyHandler(0), - mWidth(0), mHeight(0), implicitWidth(0), implicitHeight(0) + mWidth(0), mHeight(0), implicitWidth(0), implicitHeight(0), hadSubFocusItem(false) { QGraphicsItemPrivate::acceptedMouseButtons = 0; isDeclarativeItem = 1; @@ -275,6 +275,8 @@ public: qreal implicitWidth; qreal implicitHeight; + bool hadSubFocusItem; + QPointF computeTransformOrigin() const; virtual void setPosHelper(const QPointF &pos) @@ -288,9 +290,11 @@ public: // Reimplemented from QGraphicsItemPrivate virtual void subFocusItemChange() { - if (flags & QGraphicsItem::ItemIsFocusScope || !parent) - emit q_func()->activeFocusChanged(subFocusItem != 0); + bool hasSubFocusItem = subFocusItem != 0; + if (((flags & QGraphicsItem::ItemIsFocusScope) || !parent) && hasSubFocusItem != hadSubFocusItem) + emit q_func()->activeFocusChanged(hasSubFocusItem); //see also QDeclarativeItemPrivate::focusChanged + hadSubFocusItem = hasSubFocusItem; } // Reimplemented from QGraphicsItemPrivate |