14#include <private/qwidget_p.h>
16#if QT_CONFIG(accessibility)
18#include <QtGui/private/qaccessiblehelper_p.h>
24QString qt_accHotKey(
const QString &text);
26QAccessibleInterface *getOrCreateMenu(QWidget *menu, QAction *action)
28 QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(action);
30 iface =
new QAccessibleMenuItem(menu, action);
31 QAccessible::registerAccessibleInterface(iface);
36QAccessibleMenu::QAccessibleMenu(QWidget *w)
37: QAccessibleWidgetV2(w)
42QMenu *QAccessibleMenu::menu()
const
44 return qobject_cast<QMenu*>(object());
47int QAccessibleMenu::childCount()
const
49 return menu()->actions().size();
52QAccessibleInterface *QAccessibleMenu::childAt(
int x,
int y)
const
54 QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y)));
55 if (act && act->isSeparator())
57 return act ? getOrCreateMenu(menu(), act) :
nullptr;
60QString QAccessibleMenu::text(QAccessible::Text t)
const
62 QString tx = QAccessibleWidgetV2::text(t);
66 if (t == QAccessible::Name)
67 return menu()->windowTitle();
71QAccessible::Role QAccessibleMenu::role()
const
73 return QAccessible::PopupMenu;
76QAccessibleInterface *QAccessibleMenu::child(
int index)
const
78 if (index < childCount())
79 return getOrCreateMenu(menu(), menu()->actions().at(index));
83QAccessibleInterface *QAccessibleMenu::parent()
const
85 if (QAction *menuAction = menu()->menuAction()) {
86 QList<QObject *> parentCandidates;
87 const QList<QObject *> associatedObjects = menuAction->associatedObjects();
88 parentCandidates.reserve(associatedObjects.size() + 1);
89 parentCandidates << menu()->parentWidget() << associatedObjects;
90 for (QObject *object : std::as_const(parentCandidates)) {
91 if (qobject_cast<QMenu*>(object)
93 || qobject_cast<QMenuBar*>(object)
96 QWidget *widget =
static_cast<QWidget*>(object);
97 if (widget->actions().indexOf(menuAction) != -1)
98 return getOrCreateMenu(widget, menuAction);
102 return QAccessibleWidgetV2::parent();
105int QAccessibleMenu::indexOfChild(
const QAccessibleInterface *child)
const
107 QAccessible::Role r = child->role();
108 if ((r == QAccessible::MenuItem || r == QAccessible::Separator) && menu()) {
109 return menu()->actions().indexOf(qobject_cast<QAction*>(child->object()));
114#if QT_CONFIG(menubar)
115QAccessibleMenuBar::QAccessibleMenuBar(QWidget *w)
116 : QAccessibleWidgetV2(w, QAccessible::MenuBar)
121QMenuBar *QAccessibleMenuBar::menuBar()
const
123 return qobject_cast<QMenuBar*>(object());
126int QAccessibleMenuBar::childCount()
const
128 return menuBar()->actions().size();
131QAccessibleInterface *QAccessibleMenuBar::child(
int index)
const
133 if (index < childCount()) {
134 return getOrCreateMenu(menuBar(), menuBar()->actions().at(index));
139int QAccessibleMenuBar::indexOfChild(
const QAccessibleInterface *child)
const
141 QAccessible::Role r = child->role();
142 if ((r == QAccessible::MenuItem || r == QAccessible::Separator) && menuBar()) {
143 return menuBar()->actions().indexOf(qobject_cast<QAction*>(child->object()));
151
152
153
154
155QAccessibleMenuItem::QAccessibleMenuItem(QWidget *owner, QAction *action)
156: m_action(action), m_owner(owner)
160QAccessibleMenuItem::~QAccessibleMenuItem()
163QAccessibleInterface *QAccessibleMenuItem::childAt(
int x,
int y )
const
165 for (
int i = childCount() - 1; i >= 0; --i) {
166 QAccessibleInterface *childInterface = child(i);
167 if (childInterface->rect().contains(x,y)) {
168 return childInterface;
174int QAccessibleMenuItem::childCount()
const
176 return m_action->menu() ? 1 : 0;
179int QAccessibleMenuItem::indexOfChild(
const QAccessibleInterface * child)
const
181 if (child && child->role() == QAccessible::PopupMenu && child->object() == m_action->menu())
186bool QAccessibleMenuItem::isValid()
const
188 return m_action && m_owner;
191QAccessibleInterface *QAccessibleMenuItem::parent()
const
193 return QAccessible::queryAccessibleInterface(owner());
196QAccessibleInterface *QAccessibleMenuItem::child(
int index)
const
198 if (index == 0 && action()->menu())
199 return QAccessible::queryAccessibleInterface(action()->menu());
203void *QAccessibleMenuItem::interface_cast(QAccessible::InterfaceType t)
205 if (t == QAccessible::ActionInterface)
206 return static_cast<QAccessibleActionInterface*>(
this);
210QObject *QAccessibleMenuItem::object()
const
216QWindow *QAccessibleMenuItem::window()
const
218 return m_owner.isNull()
220 : qt_widget_private(m_owner.data())->windowHandle(QWidgetPrivate::WindowHandleMode::Closest);
223QRect QAccessibleMenuItem::rect()
const
226 QWidget *own = owner();
227#if QT_CONFIG(menubar)
228 if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
229 rect = menuBar->actionGeometry(m_action);
230 QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0));
231 rect = rect.translated(globalPos);
234 if (QMenu *menu = qobject_cast<QMenu*>(own)) {
235 rect = menu->actionGeometry(m_action);
236 QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
237 rect = rect.translated(globalPos);
242QAccessible::Role QAccessibleMenuItem::role()
const
244 return m_action->isSeparator() ? QAccessible::Separator : QAccessible::MenuItem;
247void QAccessibleMenuItem::setText(QAccessible::Text ,
const QString & )
251QAccessible::State QAccessibleMenuItem::state()
const
253 QAccessible::State s;
254 QWidget *own = owner();
256 if (own && (own->testAttribute(Qt::WA_WState_Visible) ==
false || m_action->isVisible() ==
false)) {
260 if (QMenu *menu = qobject_cast<QMenu*>(own)) {
261 if (menu->activeAction() == m_action)
263#if QT_CONFIG(menubar)
264 }
else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
265 if (menuBar->activeAction() == m_action)
269 if (own && own->style()->styleHint(QStyle::SH_Menu_MouseTracking,
nullptr, own))
271 if (m_action->isSeparator() || !m_action->isEnabled())
273 if (m_action->isChecked())
275 if (m_action->isCheckable())
281QString QAccessibleMenuItem::text(QAccessible::Text t)
const
285 case QAccessible::Name:
286 str = qt_accStripAmp(m_action->text());
288 case QAccessible::Accelerator: {
289#ifndef QT_NO_SHORTCUT
290 QKeySequence key = m_action->shortcut();
291 if (!key.isEmpty()) {
292 str = key.toString();
296 str = qt_accHotKey(m_action->text());
306QStringList QAccessibleMenuItem::actionNames()
const
309 if (!m_action || m_action->isSeparator())
312 if (m_action->menu()) {
313 actions << showMenuAction();
315 actions << pressAction();
320void QAccessibleMenuItem::doAction(
const QString &actionName)
322 if (!m_action->isEnabled())
325 if (actionName == pressAction()) {
327 }
else if (actionName == showMenuAction()) {
328#if QT_CONFIG(menubar)
329 if (QMenuBar *bar = qobject_cast<QMenuBar*>(owner())) {
330 if (m_action->menu() && m_action->menu()->isVisible()) {
331 m_action->menu()->hide();
333 bar->setActiveAction(m_action);
337 if (QMenu *menu = qobject_cast<QMenu*>(owner())){
338 if (m_action->menu() && m_action->menu()->isVisible()) {
339 m_action->menu()->hide();
341 menu->setActiveAction(m_action);
347QStringList QAccessibleMenuItem::keyBindingsForAction(
const QString &)
const
349 return QStringList();
353QAction *QAccessibleMenuItem::action()
const
358QWidget *QAccessibleMenuItem::owner()
const