aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@digia.com>2014-04-01 10:05:28 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-02 17:38:05 +0200
commitc1d2bcff3dededa5b560713f4fd4874a023c43a2 (patch)
treed748e9507f5bc668f41bee65f24c86ba8b61adae
parentc494da09794209d120c8df6b78074c07ad594a15 (diff)
On Mac only editable text input should receive tab focus
It's for all items with "readOnly: false" and has "text" property. [ChangeLog][QtQuick] Mac: any editable text input will get tab focus when "Text boxes and lists only" option was selected. About "Text boxes and lists only", see commit 06332df7438c8d2215b02f1e01ce2ed28a49a320. Task-number: QTBUG-38004 Change-Id: I73947b71b2fec69a66e122514d440656f4650e99 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com> Reviewed-by: Andy Shaw <andy.shaw@digia.com>
-rw-r--r--src/quick/items/qquickitem.cpp11
-rw-r--r--tests/auto/quick/qquickitem2/data/activeFocusOnTab9.qml50
-rw-r--r--tests/auto/quick/qquickitem2/tst_qquickitem.cpp136
3 files changed, 192 insertions, 5 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 90e565926f..691fea21e1 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -2132,8 +2132,6 @@ bool QQuickItemPrivate::qt_tab_all_widgets()
*/
bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item)
{
- bool result = true;
-
if (!item->window())
return false;
@@ -2141,14 +2139,13 @@ bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item)
return true;
#ifndef QT_NO_ACCESSIBILITY
- result = false;
if (QObject *acc = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)) {
int role = acc->property("role").toInt();
if (role == QAccessible::EditableText
|| role == QAccessible::Table
|| role == QAccessible::List
|| role == QAccessible::SpinBox) {
- result = true;
+ return true;
} else if (role == QAccessible::ComboBox) {
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(item);
return iface->state().editable;
@@ -2156,7 +2153,11 @@ bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item)
}
#endif
- return result;
+ QVariant readonly = item->property("readOnly");
+ if (readonly.isValid() && !readonly.toBool() && item->property("text").isValid())
+ return true;
+
+ return false;
}
/*!
diff --git a/tests/auto/quick/qquickitem2/data/activeFocusOnTab9.qml b/tests/auto/quick/qquickitem2/data/activeFocusOnTab9.qml
new file mode 100644
index 0000000000..09bb73639a
--- /dev/null
+++ b/tests/auto/quick/qquickitem2/data/activeFocusOnTab9.qml
@@ -0,0 +1,50 @@
+import QtQuick 2.1
+
+Item {
+ id: main
+ objectName: "main"
+ width: 300
+ height: 300
+ TextInput {
+ id: textinput1
+ objectName: "textinput1"
+ width: 300
+ height: 75
+ activeFocusOnTab: true
+ text: "Text Input 1"
+ anchors.top: parent.top
+ anchors.left: parent.left
+ }
+ TextInput {
+ id: textinput2
+ objectName: "textinput2"
+ width: 300
+ height: 75
+ activeFocusOnTab: true
+ text: "Text Input 2"
+ readOnly: true
+ anchors.top: textinput1.bottom
+ anchors.left: parent.left
+ }
+ TextEdit {
+ id: textedit1
+ objectName: "textedit1"
+ width: 300
+ height: 75
+ activeFocusOnTab: true
+ text: "Text Edit 1"
+ anchors.top: textinput2.bottom
+ anchors.left: parent.left
+ }
+ TextEdit {
+ id: textedit2
+ objectName: "textedit2"
+ width: 300
+ height: 75
+ activeFocusOnTab: true
+ text: "Text Edit 2"
+ readOnly: true
+ anchors.top: textedit1.bottom
+ anchors.left: parent.left
+ }
+}
diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
index 3ce18488df..e6fd98ac35 100644
--- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
@@ -73,6 +73,8 @@ private slots:
void activeFocusOnTab6();
void activeFocusOnTab7();
void activeFocusOnTab8();
+ void activeFocusOnTab9();
+ void activeFocusOnTab10();
void nextItemInFocusChain();
void nextItemInFocusChain2();
@@ -838,6 +840,140 @@ void tst_QQuickItem::activeFocusOnTab8()
delete window;
}
+void tst_QQuickItem::activeFocusOnTab9()
+{
+ if (qt_tab_all_widgets())
+ QSKIP("This function doesn't support iterating all.");
+
+ QQuickView *window = new QQuickView(0);
+ window->setBaseSize(QSize(300,300));
+
+ window->setSource(testFileUrl("activeFocusOnTab9.qml"));
+ window->show();
+ window->requestActivate();
+ QVERIFY(QTest::qWaitForWindowActive(window));
+ QVERIFY(QGuiApplication::focusWindow() == window);
+
+ QQuickItem *content = window->contentItem();
+ QVERIFY(content);
+ QVERIFY(content->hasActiveFocus());
+
+ QQuickItem *textinput1 = findItem<QQuickItem>(window->rootObject(), "textinput1");
+ QVERIFY(textinput1);
+ QQuickItem *textedit1 = findItem<QQuickItem>(window->rootObject(), "textedit1");
+ QVERIFY(textedit1);
+
+ QVERIFY(!textinput1->hasActiveFocus());
+ textinput1->forceActiveFocus();
+ QVERIFY(textinput1->hasActiveFocus());
+
+ // Tab: textinput1->textedit1
+ QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textedit1->hasActiveFocus());
+
+ // BackTab: textedit1->textinput1
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textinput1->hasActiveFocus());
+
+ // BackTab: textinput1->textedit1
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textedit1->hasActiveFocus());
+
+ delete window;
+}
+
+void tst_QQuickItem::activeFocusOnTab10()
+{
+ if (!qt_tab_all_widgets())
+ QSKIP("This function doesn't support NOT iterating all.");
+
+ QQuickView *window = new QQuickView(0);
+ window->setBaseSize(QSize(300,300));
+
+ window->setSource(testFileUrl("activeFocusOnTab9.qml"));
+ window->show();
+ window->requestActivate();
+ QVERIFY(QTest::qWaitForWindowActive(window));
+ QVERIFY(QGuiApplication::focusWindow() == window);
+
+ QQuickItem *content = window->contentItem();
+ QVERIFY(content);
+ QVERIFY(content->hasActiveFocus());
+
+ QQuickItem *textinput1 = findItem<QQuickItem>(window->rootObject(), "textinput1");
+ QVERIFY(textinput1);
+ QQuickItem *textedit1 = findItem<QQuickItem>(window->rootObject(), "textedit1");
+ QVERIFY(textedit1);
+ QQuickItem *textinput2 = findItem<QQuickItem>(window->rootObject(), "textinput2");
+ QVERIFY(textinput2);
+ QQuickItem *textedit2 = findItem<QQuickItem>(window->rootObject(), "textedit2");
+ QVERIFY(textedit2);
+
+ QVERIFY(!textinput1->hasActiveFocus());
+ textinput1->forceActiveFocus();
+ QVERIFY(textinput1->hasActiveFocus());
+
+ // Tab: textinput1->textinput2
+ QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textinput2->hasActiveFocus());
+
+ // Tab: textinput2->textedit1
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textedit1->hasActiveFocus());
+
+ // BackTab: textedit1->textinput2
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textinput2->hasActiveFocus());
+
+ // BackTab: textinput2->textinput1
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textinput1->hasActiveFocus());
+
+ // BackTab: textinput1->textedit2
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textedit2->hasActiveFocus());
+
+ // BackTab: textedit2->textedit1
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textedit1->hasActiveFocus());
+
+ // BackTab: textedit1->textinput2
+ key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1);
+ QGuiApplication::sendEvent(window, &key);
+ QVERIFY(key.isAccepted());
+
+ QVERIFY(textinput2->hasActiveFocus());
+
+ delete window;
+}
+
void tst_QQuickItem::nextItemInFocusChain()
{
if (!qt_tab_all_widgets())