Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
quiaccessibilityelement.mm
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#if QT_CONFIG(accessibility)
7
8#include "private/qaccessiblecache_p.h"
9#include "private/qcore_mac_p.h"
10#include "uistrings_p.h"
11#include "qioswindow.h"
12
13QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement);
14
15@implementation QMacAccessibilityElement
16
17- (instancetype)initWithId:(QAccessible::Id)anId withAccessibilityContainer:(id)view
18{
19 Q_ASSERT((int)anId < 0);
20 self = [super initWithAccessibilityContainer:view];
21 if (self)
22 _axid = anId;
23
24 return self;
25}
26
27+ (instancetype)elementWithId:(QAccessible::Id)anId
28{
29 Q_ASSERT(anId);
30 if (!anId)
31 return nil;
32
33 QAccessibleCache *cache = QAccessibleCache::instance();
34
35 QMacAccessibilityElement *element = cache->elementForId(anId);
36 if (!element) {
37 auto *a11yInterface = QAccessible::accessibleInterface(anId);
38 Q_ASSERT(a11yInterface);
39 auto *window = a11yInterface->window();
40 if (window && window->handle()) {
41 auto *platformWindow = static_cast<QIOSWindow*>(window->handle());
42 element = [[self alloc] initWithId:anId withAccessibilityContainer:platformWindow->view()];
43 cache->insertElement(anId, element);
44 } else {
45 qWarning() << "Could not create a11y element for" << window
46 << "with platform window" << (window ? window->handle() : nullptr);
47 }
48 }
49 return element;
50}
51
52- (void)invalidate
53{
54 [self release];
55}
56
57- (BOOL)isAccessibilityElement
58{
59 return YES;
60}
61
62- (NSString*)accessibilityLabel
63{
64 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
65 if (!iface) {
66 qWarning() << "invalid accessible interface for: " << self.axid;
67 return @"";
68 }
69
70 return iface->text(QAccessible::Name).toNSString();
71}
72
73- (NSString*)accessibilityHint
74{
75 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
76 if (!iface) {
77 qWarning() << "invalid accessible interface for: " << self.axid;
78 return @"";
79 }
80 return iface->text(QAccessible::Description).toNSString();
81}
82
83- (NSString*)accessibilityValue
84{
85 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
86 if (!iface) {
87 qWarning() << "invalid accessible interface for: " << self.axid;
88 return @"";
89 }
90
92
93 if (state.checkable)
94 return state.checked
97
98 QAccessibleValueInterface *val = iface->valueInterface();
99 if (val) {
100 return val->currentValue().toString().toNSString();
101 } else if (QAccessibleTextInterface *text = iface->textInterface()) {
102 return text->text(0, text->characterCount()).toNSString();
103 }
104
105 return [super accessibilityHint];
106}
107
108- (CGRect)accessibilityFrame
109{
110 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
111 if (!iface) {
112 qWarning() << "invalid accessible interface for: " << self.axid;
113 return CGRect();
114 }
115
116 QRect rect = iface->rect();
117 return CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
118}
119
120- (UIAccessibilityTraits)accessibilityTraits
121{
122 UIAccessibilityTraits traits = UIAccessibilityTraitNone;
123
124 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
125 if (!iface) {
126 qWarning() << "invalid accessible interface for: " << self.axid;
127 return traits;
128 }
129 QAccessible::State state = iface->state();
130 if (state.disabled)
131 traits |= UIAccessibilityTraitNotEnabled;
132
133 if (state.searchEdit)
134 traits |= UIAccessibilityTraitSearchField;
135
136 if (state.selected)
137 traits |= UIAccessibilityTraitSelected;
138
139 const auto accessibleRole = iface->role();
140 if (accessibleRole == QAccessible::Button) {
141 traits |= UIAccessibilityTraitButton;
142 } else if (accessibleRole == QAccessible::EditableText) {
143 static auto defaultTextFieldTraits = []{
144 auto *textField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
145 return textField.accessibilityTraits;
146 }();
147 traits |= defaultTextFieldTraits;
148 } else if (accessibleRole == QAccessible::Graphic) {
149 traits |= UIAccessibilityTraitImage;
150 } else if (accessibleRole == QAccessible::Heading) {
151 traits |= UIAccessibilityTraitHeader;
152 } else if (accessibleRole == QAccessible::Link) {
153 traits |= UIAccessibilityTraitLink;
154 } else if (accessibleRole == QAccessible::StaticText) {
155 traits |= UIAccessibilityTraitStaticText;
156 }
157
158 if (iface->valueInterface())
159 traits |= UIAccessibilityTraitAdjustable;
160
161 return traits;
162}
163
164- (BOOL)accessibilityActivate
165{
166 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
167 if (QAccessibleActionInterface *action = iface->actionInterface()) {
168 if (action->actionNames().contains(QAccessibleActionInterface::pressAction())) {
169 action->doAction(QAccessibleActionInterface::pressAction());
170 return YES;
171 } else if (action->actionNames().contains(QAccessibleActionInterface::showMenuAction())) {
172 action->doAction(QAccessibleActionInterface::showMenuAction());
173 return YES;
174 }
175 }
176 return NO; // fall back to sending mouse clicks
177}
178
179- (void)accessibilityIncrement
180{
181 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
182 if (QAccessibleActionInterface *action = iface->actionInterface())
183 action->doAction(QAccessibleActionInterface::increaseAction());
184}
185
186- (void)accessibilityDecrement
187{
188 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
189 if (QAccessibleActionInterface *action = iface->actionInterface())
190 action->doAction(QAccessibleActionInterface::decreaseAction());
191}
192
193- (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction
194{
195 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
196 QAccessibleActionInterface *action = iface->actionInterface();
197 if (!action)
198 return NO;
199 switch (direction) {
200 case UIAccessibilityScrollDirectionRight:
201 action->doAction(QAccessibleActionInterface::scrollRightAction());
202 return YES;
203 case UIAccessibilityScrollDirectionLeft:
204 action->doAction(QAccessibleActionInterface::scrollLeftAction());
205 return YES;
206 case UIAccessibilityScrollDirectionUp:
207 action->doAction(QAccessibleActionInterface::scrollUpAction());
208 return YES;
209 case UIAccessibilityScrollDirectionDown:
210 action->doAction(QAccessibleActionInterface::scrollDownAction());
211 return YES;
212 case UIAccessibilityScrollDirectionNext:
213 action->doAction(QAccessibleActionInterface::nextPageAction());
214 return YES;
215 case UIAccessibilityScrollDirectionPrevious:
216 action->doAction(QAccessibleActionInterface::previousPageAction());
217 return YES;
218 }
219 return NO;
220}
221
222@end
223
224#endif
\inmodule QtGui
The QAccessible class provides enums and static functions related to accessibility.
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
\inmodule QtCore\reentrant
Definition qrect.h:30
QString text
QCache< int, Employee > cache
[0]
rect
[4]
direction
else opt state
[0]
constexpr QBindableInterface iface
Definition qproperty.h:666
QString self
Definition language.cpp:58
#define QT_NAMESPACE_ALIAS_OBJC_CLASS(__KLASS__)
Definition qcore_mac_p.h:58
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qWarning
Definition qlogging.h:166
GLuint GLfloat * val
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
const char AE_UNCHECKED[]
Definition uistrings.cpp:13
QT_BEGIN_NAMESPACE const char ACCESSIBILITY_ELEMENT[]
Definition uistrings.cpp:11
const char AE_CHECKED[]
Definition uistrings.cpp:12
aWidget window() -> setWindowTitle("New Window Title")
[2]