From b802031e2d8b4b38267f1ec2c00507bfd8ed1f5f Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Tue, 5 Nov 2019 15:49:23 +0100 Subject: QQuickAccessibleAttached: keep track of name being explicitly set This allows types to attach an accessible name to an item, so long as the user hasn't done so themselves. Task-number: QTBUG-66583 Change-Id: I04f26815ffeaf1198fee25dc414253de8b8dfabe Reviewed-by: Liang Qi --- src/quick/items/qquickaccessibleattached.cpp | 13 +++++++++ src/quick/items/qquickaccessibleattached_p.h | 5 ++++ .../qquickaccessible/tst_qquickaccessible.cpp | 34 ++++++++++++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index c150e4efa2..2da01e9151 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -433,6 +433,19 @@ void QQuickAccessibleAttached::setRole(QAccessible::Role role) } } +bool QQuickAccessibleAttached::wasNameExplicitlySet() const +{ + return m_nameExplicitlySet; +} + +// Allows types to attach an accessible name to an item as a convenience, +// so long as the user hasn't done so themselves. +void QQuickAccessibleAttached::setNameImplicitly(const QString &name) +{ + setName(name); + m_nameExplicitlySet = false; +} + QQuickAccessibleAttached *QQuickAccessibleAttached::qmlAttachedProperties(QObject *obj) { return new QQuickAccessibleAttached(obj); diff --git a/src/quick/items/qquickaccessibleattached_p.h b/src/quick/items/qquickaccessibleattached_p.h index f4194ef13d..87fb79ecc9 100644 --- a/src/quick/items/qquickaccessibleattached_p.h +++ b/src/quick/items/qquickaccessibleattached_p.h @@ -118,7 +118,10 @@ public: return QString(); return m_name; } + + bool wasNameExplicitlySet() const; void setName(const QString &name) { + m_nameExplicitlySet = true; if (name != m_name) { m_name = name; Q_EMIT nameChanged(); @@ -126,6 +129,7 @@ public: QAccessible::updateAccessibility(&ev); } } + void setNameImplicitly(const QString &name); QString description() const { return m_description; } void setDescription(const QString &description) @@ -216,6 +220,7 @@ private: QAccessible::State m_state; QAccessible::State m_stateExplicitlySet; QString m_name; + bool m_nameExplicitlySet = false; QString m_description; static QMetaMethod sigPress; diff --git a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp index c5fdb6c1b9..2a1b65c392 100644 --- a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp +++ b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp @@ -185,7 +185,8 @@ void tst_QQuickAccessible::quickAttachedProperties() QObject *object = component.create(); QVERIFY(object != nullptr); - QObject *attachedObject = QQuickAccessibleAttached::attachedProperties(object); + const auto attachedObject = qobject_cast( + QQuickAccessibleAttached::attachedProperties(object)); QVERIFY(attachedObject); if (attachedObject) { QVariant p = attachedObject->property("role"); @@ -195,6 +196,7 @@ void tst_QQuickAccessible::quickAttachedProperties() QCOMPARE(p.isNull(), true); p = attachedObject->property("description"); QCOMPARE(p.isNull(), true); + QCOMPARE(attachedObject->wasNameExplicitlySet(), false); } delete object; } @@ -211,7 +213,8 @@ void tst_QQuickAccessible::quickAttachedProperties() QObject *object = component.create(); QVERIFY(object != nullptr); - QObject *attachedObject = QQuickAccessibleAttached::attachedProperties(object); + const auto attachedObject = qobject_cast( + QQuickAccessibleAttached::attachedProperties(object)); QVERIFY(attachedObject); if (attachedObject) { QVariant p = attachedObject->property("role"); @@ -223,6 +226,7 @@ void tst_QQuickAccessible::quickAttachedProperties() p = attachedObject->property("description"); QCOMPARE(p.isNull(), false); QCOMPARE(p.toString(), QLatin1String("Duck")); + QCOMPARE(attachedObject->wasNameExplicitlySet(), true); } delete object; } @@ -292,6 +296,32 @@ void tst_QQuickAccessible::quickAttachedProperties() } delete object; } + // Check that a name can be implicitly set. + { + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData(R"( + import QtQuick 2.0 + Text { + Accessible.role: Accessible.Button + Accessible.description: "Text Button" + })", QUrl()); + QScopedPointer object(component.create()); + QVERIFY(object); + + const auto attachedObject = qobject_cast( + QQuickAccessibleAttached::attachedProperties(object.data())); + QVERIFY(attachedObject); + QVERIFY(!attachedObject->wasNameExplicitlySet()); + + attachedObject->setNameImplicitly(QLatin1String("Implicit")); + QCOMPARE(attachedObject->name(), QLatin1String("Implicit")); + QVERIFY(!attachedObject->wasNameExplicitlySet()); + + attachedObject->setName(QLatin1String("Explicit")); + QCOMPARE(attachedObject->name(), QLatin1String("Explicit")); + QVERIFY(attachedObject->wasNameExplicitlySet()); + } QTestAccessibility::clearEvents(); } -- cgit v1.2.3