diff options
author | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2019-05-06 13:02:57 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2019-05-07 10:05:30 +0000 |
commit | eba3b567d639ab40c939e27900029f93e351d77a (patch) | |
tree | 3525615959eef0513a2c01b716c83b7eae0142cd | |
parent | 48a12735d813c88bb4015ac762d12c79f863ffb6 (diff) |
Accessibility: Improve handling of read-only state
We have been rather sloppy in how read-only versus editable is handled.
According to the definition, editable signifies that in principle a
widget allows the user to change its text. Read-only means that this
ability is (currently) disabled.
Task-number: QTBUG-75002
Change-Id: I5d71843abcdaac52f4a60a1abcac2604341f6c96
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r-- | src/platformsupport/linuxaccessibility/constant_mappings.cpp | 2 | ||||
-rw-r--r-- | src/widgets/accessible/simplewidgets.cpp | 10 | ||||
-rw-r--r-- | src/widgets/accessible/simplewidgets_p.h | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qlineedit.cpp | 6 | ||||
-rw-r--r-- | tests/auto/other/qaccessibility/tst_qaccessibility.cpp | 15 | ||||
-rw-r--r-- | tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp | 8 |
6 files changed, 39 insertions, 3 deletions
diff --git a/src/platformsupport/linuxaccessibility/constant_mappings.cpp b/src/platformsupport/linuxaccessibility/constant_mappings.cpp index ef2b3429d2..fce2919e73 100644 --- a/src/platformsupport/linuxaccessibility/constant_mappings.cpp +++ b/src/platformsupport/linuxaccessibility/constant_mappings.cpp @@ -79,7 +79,7 @@ quint64 spiStatesFromQState(QAccessible::State state) if (state.checkStateMixed) setSpiStateBit(&spiState, ATSPI_STATE_INDETERMINATE); if (state.readOnly) - unsetSpiStateBit(&spiState, ATSPI_STATE_EDITABLE); + setSpiStateBit(&spiState, ATSPI_STATE_READ_ONLY); // if (state.HotTracked) if (state.defaultButton) setSpiStateBit(&spiState, ATSPI_STATE_IS_DEFAULT); diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp index efcf4cdc8b..716c833fc9 100644 --- a/src/widgets/accessible/simplewidgets.cpp +++ b/src/widgets/accessible/simplewidgets.cpp @@ -454,6 +454,13 @@ QAccessible::Role QAccessibleDisplay::role() const return QAccessibleWidget::role(); } +QAccessible::State QAccessibleDisplay::state() const +{ + QAccessible::State s = QAccessibleWidget::state(); + s.readOnly = true; + return s; +} + QString QAccessibleDisplay::text(QAccessible::Text t) const { QString str; @@ -732,10 +739,9 @@ QAccessible::State QAccessibleLineEdit::state() const QAccessible::State state = QAccessibleWidget::state(); QLineEdit *l = lineEdit(); + state.editable = true; if (l->isReadOnly()) state.readOnly = true; - else - state.editable = true; if (l->echoMode() != QLineEdit::Normal) state.passwordEdit = true; diff --git a/src/widgets/accessible/simplewidgets_p.h b/src/widgets/accessible/simplewidgets_p.h index fcd0e7df47..73572e3059 100644 --- a/src/widgets/accessible/simplewidgets_p.h +++ b/src/widgets/accessible/simplewidgets_p.h @@ -116,6 +116,7 @@ public: QString text(QAccessible::Text t) const override; QAccessible::Role role() const override; + QAccessible::State state() const override; QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >relations(QAccessible::Relation match = QAccessible::AllRelations) const override; void *interface_cast(QAccessible::InterfaceType t) override; diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 4301a3a2e7..86c7d35dbc 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -1369,6 +1369,12 @@ void QLineEdit::setReadOnly(bool enable) QEvent event(QEvent::ReadOnlyChange); QCoreApplication::sendEvent(this, &event); update(); +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State changedState; + changedState.readOnly = true; + QAccessibleStateChangeEvent ev(this, changedState); + QAccessible::updateAccessibility(&ev); +#endif } } diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index 8b24937079..bc45487599 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -2045,6 +2045,15 @@ void tst_QAccessibility::lineEditTest() QVERIFY(!iface->state().selectable); QVERIFY(iface->state().selectableText); QVERIFY(!iface->state().hasPopup); + QVERIFY(!iface->state().readOnly); + QVERIFY(iface->state().editable); + + le->setReadOnly(true); + QVERIFY(iface->state().editable); + QVERIFY(iface->state().readOnly); + le->setReadOnly(false); + QVERIFY(!iface->state().readOnly); + QCOMPARE(bool(iface->state().focused), le->hasFocus()); QString secret(QLatin1String("secret")); @@ -3640,6 +3649,12 @@ void tst_QAccessibility::labelTest() QVERIFY(acc_label); QCOMPARE(acc_label->text(QAccessible::Name), text); + QCOMPARE(acc_label->state().editable, false); + QCOMPARE(acc_label->state().passwordEdit, false); + QCOMPARE(acc_label->state().disabled, false); + QCOMPARE(acc_label->state().focused, false); + QCOMPARE(acc_label->state().focusable, false); + QCOMPARE(acc_label->state().readOnly, true); QVector<QPair<QAccessibleInterface *, QAccessible::Relation> > rels = acc_label->relations(); QCOMPARE(rels.count(), 1); diff --git a/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp b/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp index 48594b2fa1..2b82b03998 100644 --- a/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp +++ b/tests/auto/other/qaccessibilitylinux/tst_qaccessibilitylinux.cpp @@ -251,6 +251,8 @@ void tst_QAccessibilityLinux::testLabel() QCOMPARE(labelInterface->call(QDBus::Block, "GetRoleName").arguments().first().toString(), QLatin1String("label")); QCOMPARE(labelInterface->call(QDBus::Block, "GetRole").arguments().first().toUInt(), 29u); QCOMPARE(getParent(labelInterface), mainWindow->path()); + QVERIFY(!hasState(labelInterface, ATSPI_STATE_EDITABLE)); + QVERIFY(hasState(labelInterface, ATSPI_STATE_READ_ONLY)); l->setText("New text"); QCOMPARE(labelInterface->property("Name").toString(), l->text()); @@ -303,6 +305,12 @@ void tst_QAccessibilityLinux::testLineEdit() QCOMPARE(lineEdit->selectionStart(), -1); QCOMPARE(textInterface->call(QDBus::Block, "GetNSelections").arguments().first().toInt(), 0); + QVERIFY(hasState(accessibleInterface, ATSPI_STATE_EDITABLE)); + QVERIFY(!hasState(accessibleInterface, ATSPI_STATE_READ_ONLY)); + lineEdit->setReadOnly(true); + QVERIFY(hasState(accessibleInterface, ATSPI_STATE_EDITABLE)); + QVERIFY(hasState(accessibleInterface, ATSPI_STATE_READ_ONLY)); + m_window->clearChildren(); delete accessibleInterface; delete textInterface; |