Qt 6.x
The Qt SDK
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
12QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement);
13
14@implementation QMacAccessibilityElement
15
16- (instancetype)initWithId:(QAccessible::Id)anId withAccessibilityContainer:(id)view
17{
18 Q_ASSERT((int)anId < 0);
19 self = [super initWithAccessibilityContainer:view];
20 if (self)
21 _axid = anId;
22
23 return self;
24}
25
26+ (instancetype)elementWithId:(QAccessible::Id)anId withAccessibilityContainer:(id)view
27{
28 Q_ASSERT(anId);
29 if (!anId)
30 return nil;
31
32 QAccessibleCache *cache = QAccessibleCache::instance();
33
34 QMacAccessibilityElement *element = cache->elementForId(anId);
35 if (!element) {
36 Q_ASSERT(QAccessible::accessibleInterface(anId));
37 element = [[self alloc] initWithId:anId withAccessibilityContainer:view];
38 cache->insertElement(anId, element);
39 }
40 return element;
41}
42
43- (void)invalidate
44{
45 [self release];
46}
47
48- (BOOL)isAccessibilityElement
49{
50 return YES;
51}
52
53- (NSString*)accessibilityLabel
54{
55 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
56 if (!iface) {
57 qWarning() << "invalid accessible interface for: " << self.axid;
58 return @"";
59 }
60
61 return iface->text(QAccessible::Name).toNSString();
62}
63
64- (NSString*)accessibilityHint
65{
66 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
67 if (!iface) {
68 qWarning() << "invalid accessible interface for: " << self.axid;
69 return @"";
70 }
71 return iface->text(QAccessible::Description).toNSString();
72}
73
74- (NSString*)accessibilityValue
75{
76 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
77 if (!iface) {
78 qWarning() << "invalid accessible interface for: " << self.axid;
79 return @"";
80 }
81
83
84 if (state.checkable)
85 return state.checked
88
89 QAccessibleValueInterface *val = iface->valueInterface();
90 if (val) {
91 return val->currentValue().toString().toNSString();
92 } else if (QAccessibleTextInterface *text = iface->textInterface()) {
93 return text->text(0, text->characterCount()).toNSString();
94 }
95
96 return [super accessibilityHint];
97}
98
99- (CGRect)accessibilityFrame
100{
101 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
102 if (!iface) {
103 qWarning() << "invalid accessible interface for: " << self.axid;
104 return CGRect();
105 }
106
107 QRect rect = iface->rect();
108 return CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
109}
110
111- (UIAccessibilityTraits)accessibilityTraits
112{
113 UIAccessibilityTraits traits = UIAccessibilityTraitNone;
114
115 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
116 if (!iface) {
117 qWarning() << "invalid accessible interface for: " << self.axid;
118 return traits;
119 }
120 QAccessible::State state = iface->state();
121 if (state.disabled)
122 traits |= UIAccessibilityTraitNotEnabled;
123
124 if (state.searchEdit)
125 traits |= UIAccessibilityTraitSearchField;
126
127 if (state.selected)
128 traits |= UIAccessibilityTraitSelected;
129
130 const auto accessibleRole = iface->role();
131 if (accessibleRole == QAccessible::Button) {
132 traits |= UIAccessibilityTraitButton;
133 } else if (accessibleRole == QAccessible::EditableText) {
134 static auto defaultTextFieldTraits = []{
135 auto *textField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
136 return textField.accessibilityTraits;
137 }();
138 traits |= defaultTextFieldTraits;
139 } else if (accessibleRole == QAccessible::Graphic) {
140 traits |= UIAccessibilityTraitImage;
141 } else if (accessibleRole == QAccessible::Heading) {
142 traits |= UIAccessibilityTraitHeader;
143 } else if (accessibleRole == QAccessible::Link) {
144 traits |= UIAccessibilityTraitLink;
145 } else if (accessibleRole == QAccessible::StaticText) {
146 traits |= UIAccessibilityTraitStaticText;
147 }
148
149 if (iface->valueInterface())
150 traits |= UIAccessibilityTraitAdjustable;
151
152 return traits;
153}
154
155- (BOOL)accessibilityActivate
156{
157 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
158 if (QAccessibleActionInterface *action = iface->actionInterface()) {
159 if (action->actionNames().contains(QAccessibleActionInterface::pressAction())) {
160 action->doAction(QAccessibleActionInterface::pressAction());
161 return YES;
162 } else if (action->actionNames().contains(QAccessibleActionInterface::showMenuAction())) {
163 action->doAction(QAccessibleActionInterface::showMenuAction());
164 return YES;
165 }
166 }
167 return NO; // fall back to sending mouse clicks
168}
169
170- (void)accessibilityIncrement
171{
172 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
173 if (QAccessibleActionInterface *action = iface->actionInterface())
174 action->doAction(QAccessibleActionInterface::increaseAction());
175}
176
177- (void)accessibilityDecrement
178{
179 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
180 if (QAccessibleActionInterface *action = iface->actionInterface())
181 action->doAction(QAccessibleActionInterface::decreaseAction());
182}
183
184- (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction
185{
186 QAccessibleInterface *iface = QAccessible::accessibleInterface(self.axid);
187 QAccessibleActionInterface *action = iface->actionInterface();
188 if (!action)
189 return NO;
190 switch (direction) {
191 case UIAccessibilityScrollDirectionRight:
192 action->doAction(QAccessibleActionInterface::scrollRightAction());
193 return YES;
194 case UIAccessibilityScrollDirectionLeft:
195 action->doAction(QAccessibleActionInterface::scrollLeftAction());
196 return YES;
197 case UIAccessibilityScrollDirectionUp:
198 action->doAction(QAccessibleActionInterface::scrollUpAction());
199 return YES;
200 case UIAccessibilityScrollDirectionDown:
201 action->doAction(QAccessibleActionInterface::scrollDownAction());
202 return YES;
203 case UIAccessibilityScrollDirectionNext:
204 action->doAction(QAccessibleActionInterface::nextPageAction());
205 return YES;
206 case UIAccessibilityScrollDirectionPrevious:
207 action->doAction(QAccessibleActionInterface::previousPageAction());
208 return YES;
209 }
210 return NO;
211}
212
213@end
214
215#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:664
QString self
Definition language.cpp:57
#define QT_NAMESPACE_ALIAS_OBJC_CLASS(__KLASS__)
Definition qcore_mac_p.h:57
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:162
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