Add ExpandCollapse UI Automation pattern to combo boxes

Also add support to expandable/expanded states to QAccessibleComboBox
in widgets. QtDeclarative will still require updates so that QML combo
boxes report the expanded/collapsed state and react to UIA actions.

Task-number: QTBUG-103591
Change-Id: Iff8ba5e3143778ce17998dbe7f5f76cae658dc19
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit ecd41111a3a7100f20e72b811b1010bc45e94127)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
André de la Rocha 2022-05-25 14:56:02 +02:00 committed by Qt Cherry-pick Bot
parent 775b73a4eb
commit 30daa8248e
4 changed files with 26 additions and 7 deletions

View File

@ -16,6 +16,14 @@ QT_BEGIN_NAMESPACE
using namespace QWindowsUiAutomation; using namespace QWindowsUiAutomation;
static bool isExpanded(QAccessibleInterface *accessible)
{
Q_ASSERT(accessible);
if (accessible->role() == QAccessible::MenuItem)
return accessible->childCount() > 0 && !accessible->child(0)->state().invisible;
else
return accessible->state().expandable && accessible->state().expanded;
}
QWindowsUiaExpandCollapseProvider::QWindowsUiaExpandCollapseProvider(QAccessible::Id id) : QWindowsUiaExpandCollapseProvider::QWindowsUiaExpandCollapseProvider(QAccessible::Id id) :
QWindowsUiaBaseProvider(id) QWindowsUiaBaseProvider(id)
@ -36,7 +44,7 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::Expand()
if (!actionInterface) if (!actionInterface)
return UIA_E_ELEMENTNOTAVAILABLE; return UIA_E_ELEMENTNOTAVAILABLE;
if (accessible->childCount() > 0 && accessible->child(0)->state().invisible) if (!isExpanded(accessible))
actionInterface->doAction(QAccessibleActionInterface::showMenuAction()); actionInterface->doAction(QAccessibleActionInterface::showMenuAction());
return S_OK; return S_OK;
@ -54,7 +62,7 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::Collapse()
if (!actionInterface) if (!actionInterface)
return UIA_E_ELEMENTNOTAVAILABLE; return UIA_E_ELEMENTNOTAVAILABLE;
if (accessible->childCount() > 0 && !accessible->child(0)->state().invisible) if (isExpanded(accessible))
actionInterface->doAction(QAccessibleActionInterface::showMenuAction()); actionInterface->doAction(QAccessibleActionInterface::showMenuAction());
return S_OK; return S_OK;
@ -72,9 +80,7 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaExpandCollapseProvider::get_ExpandCollapseS
if (!accessible) if (!accessible)
return UIA_E_ELEMENTNOTAVAILABLE; return UIA_E_ELEMENTNOTAVAILABLE;
if (accessible->childCount() > 0) *pRetVal = isExpanded(accessible) ? ExpandCollapseState_Expanded : ExpandCollapseState_Collapsed;
*pRetVal = accessible->child(0)->state().invisible ?
ExpandCollapseState_Collapsed : ExpandCollapseState_Expanded;
return S_OK; return S_OK;
} }

View File

@ -342,9 +342,10 @@ HRESULT QWindowsUiaMainProvider::GetPatternProvider(PATTERNID idPattern, IUnknow
break; break;
case UIA_ExpandCollapsePatternId: case UIA_ExpandCollapsePatternId:
// Menu items with submenus. // Menu items with submenus.
if (accessible->role() == QAccessible::MenuItem if ((accessible->role() == QAccessible::MenuItem
&& accessible->childCount() > 0 && accessible->childCount() > 0
&& accessible->child(0)->role() == QAccessible::PopupMenu) { && accessible->child(0)->role() == QAccessible::PopupMenu)
|| accessible->role() == QAccessible::ComboBox) {
*pRetVal = new QWindowsUiaExpandCollapseProvider(id()); *pRetVal = new QWindowsUiaExpandCollapseProvider(id());
} }
break; break;

View File

@ -350,6 +350,16 @@ QString QAccessibleComboBox::text(QAccessible::Text t) const
return str; return str;
} }
QAccessible::State QAccessibleComboBox::state() const
{
QAccessible::State s = QAccessibleWidget::state();
s.expandable = true;
s.expanded = isValid() && comboBox()->view()->isVisible();
return s;
}
QStringList QAccessibleComboBox::actionNames() const QStringList QAccessibleComboBox::actionNames() const
{ {
return QStringList() << showMenuAction() << pressAction(); return QStringList() << showMenuAction() << pressAction();

View File

@ -102,6 +102,8 @@ public:
QString text(QAccessible::Text t) const override; QString text(QAccessible::Text t) const override;
QAccessible::State state() const override;
// QAccessibleActionInterface // QAccessibleActionInterface
QStringList actionNames() const override; QStringList actionNames() const override;
QString localizedActionDescription(const QString &actionName) const override; QString localizedActionDescription(const QString &actionName) const override;