Only emit focusObjectChanged when an actual change occurs.

Change-Id: If18b460a8773e5cac597c02c51836b79711c20f4
Done-with: Matthew Vogt <matthew.vogt@jollamobile.com>
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
This commit is contained in:
Michael Brasser 2013-12-05 11:35:44 -06:00 committed by The Qt Project
parent e6415cc217
commit 1b16acceb1
3 changed files with 25 additions and 2 deletions

View File

@ -660,6 +660,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q
QQuickItemPrivate *scopePrivate = scope ? QQuickItemPrivate::get(scope) : 0; QQuickItemPrivate *scopePrivate = scope ? QQuickItemPrivate::get(scope) : 0;
QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
QQuickItem *currentActiveFocusItem = activeFocusItem;
QQuickItem *newActiveFocusItem = 0; QQuickItem *newActiveFocusItem = 0;
QVarLengthArray<QQuickItem *, 20> changed; QVarLengthArray<QQuickItem *, 20> changed;
@ -736,6 +737,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q
q->sendEvent(newActiveFocusItem, &event); q->sendEvent(newActiveFocusItem, &event);
} }
if (activeFocusItem != currentActiveFocusItem)
emit q->focusObjectChanged(activeFocusItem); emit q->focusObjectChanged(activeFocusItem);
if (!changed.isEmpty()) if (!changed.isEmpty())
@ -763,6 +765,7 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
return;//No focus, nothing to do. return;//No focus, nothing to do.
} }
QQuickItem *currentActiveFocusItem = activeFocusItem;
QQuickItem *oldActiveFocusItem = 0; QQuickItem *oldActiveFocusItem = 0;
QQuickItem *newActiveFocusItem = 0; QQuickItem *newActiveFocusItem = 0;
@ -819,6 +822,7 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
q->sendEvent(newActiveFocusItem, &event); q->sendEvent(newActiveFocusItem, &event);
} }
if (activeFocusItem != currentActiveFocusItem)
emit q->focusObjectChanged(activeFocusItem); emit q->focusObjectChanged(activeFocusItem);
if (!changed.isEmpty()) if (!changed.isEmpty())

View File

@ -12,4 +12,8 @@ Window.Window {
Item { Item {
objectName: "item2" objectName: "item2"
} }
FocusScope {
Item { objectName: "item3" }
}
} }

View File

@ -1145,20 +1145,35 @@ void tst_qquickwindow::focusObject()
QQuickWindow *window = qobject_cast<QQuickWindow*>(created); QQuickWindow *window = qobject_cast<QQuickWindow*>(created);
QVERIFY(window); QVERIFY(window);
QSignalSpy focusObjectSpy(window, SIGNAL(focusObjectChanged(QObject*)));
window->show(); window->show();
QVERIFY(QTest::qWaitForWindowExposed(window)); QVERIFY(QTest::qWaitForWindowExposed(window));
window->requestActivate(); window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window)); QVERIFY(QTest::qWaitForWindowActive(window));
QCOMPARE(window->contentItem(), window->focusObject());
QCOMPARE(focusObjectSpy.count(), 1);
QQuickItem *item1 = window->findChild<QQuickItem*>("item1"); QQuickItem *item1 = window->findChild<QQuickItem*>("item1");
QVERIFY(item1); QVERIFY(item1);
item1->setFocus(true); item1->setFocus(true);
QCOMPARE(item1, window->focusObject()); QCOMPARE(item1, window->focusObject());
QCOMPARE(focusObjectSpy.count(), 2);
QQuickItem *item2 = window->findChild<QQuickItem*>("item2"); QQuickItem *item2 = window->findChild<QQuickItem*>("item2");
QVERIFY(item2); QVERIFY(item2);
item2->setFocus(true); item2->setFocus(true);
QCOMPARE(item2, window->focusObject()); QCOMPARE(item2, window->focusObject());
QCOMPARE(focusObjectSpy.count(), 3);
// set focus for item in non-focused focus scope and
// ensure focusObject does not change and signal is not emitted
QQuickItem *item3 = window->findChild<QQuickItem*>("item3");
QVERIFY(item3);
item3->setFocus(true);
QCOMPARE(item2, window->focusObject());
QCOMPARE(focusObjectSpy.count(), 3);
} }
void tst_qquickwindow::ignoreUnhandledMouseEvents() void tst_qquickwindow::ignoreUnhandledMouseEvents()