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:
parent
775b73a4eb
commit
30daa8248e
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user