From f360dc9297ab5d357e7bc381f88622054e5e412e Mon Sep 17 00:00:00 2001 From: Jan Arve Saether Date: Thu, 5 Jun 2014 13:29:24 +0200 Subject: [PATCH] Windows a11y: Publish synthetic increase and decrease actions Increase and decrease actions can be generally applied to any value interface. We therefore make them available regardless of the existence of any action interface. Change-Id: I82ba01965dc869439b9d741ce681e0c0687263ca Reviewed-by: Frederik Gladhorn --- src/gui/accessible/qaccessible.cpp | 40 +++++++----- src/gui/accessible/qaccessible.h | 1 + .../windows/accessible/iaccessible2.cpp | 61 +++++++++---------- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index 736d66fdae..c715c5c7e0 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -2491,6 +2491,23 @@ struct QAccessibleActionStrings const QString showMenuAction; const QString setFocusAction; const QString toggleAction; + + QString localizedDescription(const QString &actionName) + { + if (actionName == pressAction) + return QAccessibleActionInterface::tr("Triggers the action"); + else if (actionName == increaseAction) + return QAccessibleActionInterface::tr("Increase the value"); + else if (actionName == decreaseAction) + return QAccessibleActionInterface::tr("Decrease the value"); + else if (actionName == showMenuAction) + return QAccessibleActionInterface::tr("Shows the menu"); + else if (actionName == setFocusAction) + return QAccessibleActionInterface::tr("Sets the focus"); + else if (actionName == toggleAction) + return QAccessibleActionInterface::tr("Toggles the state"); + return QString(); + } }; Q_GLOBAL_STATIC(QAccessibleActionStrings, accessibleActionStrings) @@ -2502,21 +2519,7 @@ QString QAccessibleActionInterface::localizedActionName(const QString &actionNam QString QAccessibleActionInterface::localizedActionDescription(const QString &actionName) const { - const QAccessibleActionStrings *strings = accessibleActionStrings(); - if (actionName == strings->pressAction) - return tr("Triggers the action"); - else if (actionName == strings->increaseAction) - return tr("Increase the value"); - else if (actionName == strings->decreaseAction) - return tr("Decrease the value"); - else if (actionName == strings->showMenuAction) - return tr("Shows the menu"); - else if (actionName == strings->setFocusAction) - return tr("Sets the focus"); - else if (actionName == strings->toggleAction) - return tr("Toggles the state"); - - return QString(); + return accessibleActionStrings()->localizedDescription(actionName); } /*! @@ -2573,6 +2576,13 @@ const QString &QAccessibleActionInterface::toggleAction() return accessibleActionStrings()->toggleAction; } +/*! \internal */ +QString qAccessibleLocalizedActionDescription(const QString &actionName) +{ + return accessibleActionStrings()->localizedDescription(actionName); +} + + #endif QT_END_NAMESPACE diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h index 25ce161940..ddc8d630a3 100644 --- a/src/gui/accessible/qaccessible.h +++ b/src/gui/accessible/qaccessible.h @@ -889,6 +889,7 @@ Q_DECLARE_INTERFACE(QAccessibleInterface, QAccessibleInterface_iid) Q_GUI_EXPORT const char *qAccessibleRoleString(QAccessible::Role role); Q_GUI_EXPORT const char *qAccessibleEventString(QAccessible::Event event); +Q_GUI_EXPORT QString qAccessibleLocalizedActionDescription(const QString &actionName); #ifndef QT_NO_DEBUG_STREAM Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleInterface *iface); diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp index 7f2ed86404..53b48ee37f 100644 --- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp +++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp @@ -43,7 +43,7 @@ #include "iaccessible2.h" #include "qwindowsaccessibility.h" - +#include #include #include #include @@ -546,10 +546,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::nActions(long *nActions) accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; - *nActions = 0; - - if (QAccessibleActionInterface *actionIface = actionInterface()) - *nActions = actionIface->actionNames().count(); + *nActions = QAccessibleBridgeUtils::effectiveActionNames(accessible).count(); return S_OK; } @@ -559,15 +556,11 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::doAction(long actionIndex) accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; - if (QAccessibleActionInterface *actionIface = actionInterface()) { - const QStringList actionNames = actionIface->actionNames(); - if (actionIndex < 0 || actionIndex >= actionNames.count()) - return E_INVALIDARG; - const QString actionName = actionNames.at(actionIndex); - actionIface->doAction(actionName); - return S_OK; - } - return S_FALSE; + const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(accessible); + if (actionIndex < 0 || actionIndex >= actionNames.count()) + return E_INVALIDARG; + const QString actionName = actionNames.at(actionIndex); + return QAccessibleBridgeUtils::performEffectiveAction(accessible, actionName) ? S_OK : S_FALSE; } HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_description(long actionIndex, BSTR *description) @@ -577,13 +570,15 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_description(long actionInde if (!accessible) return E_FAIL; *description = 0; - if (QAccessibleActionInterface *actionIface = actionInterface()) { - const QStringList actionNames = actionIface->actionNames(); - if (actionIndex < 0 || actionIndex >= actionNames.count()) - return E_INVALIDARG; - const QString actionName = actionNames.at(actionIndex); + const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(accessible); + if (actionIndex < 0 || actionIndex >= actionNames.count()) + return E_INVALIDARG; + const QString actionName = actionNames.at(actionIndex); + if (QAccessibleActionInterface *actionIface = actionInterface()) *description = QStringToBSTR(actionIface->localizedActionDescription(actionName)); - } + else + *description = QStringToBSTR(qAccessibleLocalizedActionDescription(actionName)); + return *description ? S_OK : S_FALSE; } @@ -623,13 +618,11 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_name(long actionIndex, BSTR if (!accessible) return E_FAIL; *name = 0; - if (QAccessibleActionInterface *actionIface = actionInterface()) { - const QStringList actionNames = actionIface->actionNames(); - if (actionIndex < 0 || actionIndex >= actionNames.count()) - return E_INVALIDARG; - const QString actionName = actionNames.at(actionIndex); - *name = QStringToBSTR(actionName); - } + const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(accessible); + if (actionIndex < 0 || actionIndex >= actionNames.count()) + return E_INVALIDARG; + const QString actionName = actionNames.at(actionIndex); + *name = QStringToBSTR(actionName); return *name ? S_OK : S_FALSE; } @@ -640,14 +633,16 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_localizedName(long actionIn if (!accessible) return E_FAIL; *localizedName = 0; - if (QAccessibleActionInterface *actionIface = actionInterface()) { - const QStringList actionNames = actionIface->actionNames(); - if (actionIndex < 0 || actionIndex >= actionNames.count()) - return E_INVALIDARG; + const QStringList actionNames = QAccessibleBridgeUtils::effectiveActionNames(accessible); + if (actionIndex < 0 || actionIndex >= actionNames.count()) + return E_INVALIDARG; - const QString actionName = actionNames.at(actionIndex); + const QString actionName = actionNames.at(actionIndex); + if (QAccessibleActionInterface *actionIface = actionInterface()) *localizedName = QStringToBSTR(actionIface->localizedActionName(actionName)); - } + else + *localizedName = QStringToBSTR(QAccessibleActionInterface::tr(qPrintable(actionName))); + return *localizedName ? S_OK : S_FALSE; }