]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kitemlistviewaccessible.cpp
Replace qAsConst with std::as_const
[dolphin.git] / src / kitemviews / kitemlistviewaccessible.cpp
1 /*
2 * SPDX-FileCopyrightText: 2012 Amandeep Singh <aman.dedman@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #ifndef QT_NO_ACCESSIBILITY
8 #include "kitemlistviewaccessible.h"
9
10 #include "kitemlistcontainer.h"
11 #include "kitemlistcontroller.h"
12 #include "kitemlistselectionmanager.h"
13 #include "kitemlistview.h"
14 #include "private/kitemlistviewlayouter.h"
15
16 #include <QGraphicsScene>
17 #include <QGraphicsView>
18
19 KItemListView *KItemListViewAccessible::view() const
20 {
21 return qobject_cast<KItemListView *>(object());
22 }
23
24 KItemListViewAccessible::KItemListViewAccessible(KItemListView *view_)
25 : QAccessibleObject(view_)
26 {
27 Q_ASSERT(view());
28 m_cells.resize(childCount());
29 }
30
31 KItemListViewAccessible::~KItemListViewAccessible()
32 {
33 for (AccessibleIdWrapper idWrapper : std::as_const(m_cells)) {
34 if (idWrapper.isValid) {
35 QAccessible::deleteAccessibleInterface(idWrapper.id);
36 }
37 }
38 }
39
40 void *KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type)
41 {
42 if (type == QAccessible::TableInterface) {
43 return static_cast<QAccessibleTableInterface *>(this);
44 }
45 return nullptr;
46 }
47
48 void KItemListViewAccessible::modelReset()
49 {
50 }
51
52 QAccessibleInterface *KItemListViewAccessible::cell(int index) const
53 {
54 if (index < 0 || index >= view()->model()->count()) {
55 return nullptr;
56 }
57
58 if (m_cells.size() <= index) {
59 m_cells.resize(childCount());
60 }
61 Q_ASSERT(index < m_cells.size());
62
63 AccessibleIdWrapper idWrapper = m_cells.at(index);
64 if (!idWrapper.isValid) {
65 idWrapper.id = QAccessible::registerAccessibleInterface(new KItemListAccessibleCell(view(), index));
66 idWrapper.isValid = true;
67 m_cells.insert(index, idWrapper);
68 }
69 return QAccessible::accessibleInterface(idWrapper.id);
70 }
71
72 QAccessibleInterface *KItemListViewAccessible::cellAt(int row, int column) const
73 {
74 return cell(columnCount() * row + column);
75 }
76
77 QAccessibleInterface *KItemListViewAccessible::caption() const
78 {
79 return nullptr;
80 }
81
82 QString KItemListViewAccessible::columnDescription(int) const
83 {
84 return QString();
85 }
86
87 int KItemListViewAccessible::columnCount() const
88 {
89 return view()->m_layouter->columnCount();
90 }
91
92 int KItemListViewAccessible::rowCount() const
93 {
94 if (columnCount() <= 0) {
95 return 0;
96 }
97
98 int itemCount = view()->model()->count();
99 int rowCount = itemCount / columnCount();
100
101 if (rowCount <= 0) {
102 return 0;
103 }
104
105 if (itemCount % columnCount()) {
106 ++rowCount;
107 }
108 return rowCount;
109 }
110
111 int KItemListViewAccessible::selectedCellCount() const
112 {
113 return view()->controller()->selectionManager()->selectedItems().count();
114 }
115
116 int KItemListViewAccessible::selectedColumnCount() const
117 {
118 return 0;
119 }
120
121 int KItemListViewAccessible::selectedRowCount() const
122 {
123 return 0;
124 }
125
126 QString KItemListViewAccessible::rowDescription(int) const
127 {
128 return QString();
129 }
130
131 QList<QAccessibleInterface *> KItemListViewAccessible::selectedCells() const
132 {
133 QList<QAccessibleInterface *> cells;
134 const auto items = view()->controller()->selectionManager()->selectedItems();
135 cells.reserve(items.count());
136 for (int index : items) {
137 cells.append(cell(index));
138 }
139 return cells;
140 }
141
142 QList<int> KItemListViewAccessible::selectedColumns() const
143 {
144 return QList<int>();
145 }
146
147 QList<int> KItemListViewAccessible::selectedRows() const
148 {
149 return QList<int>();
150 }
151
152 QAccessibleInterface *KItemListViewAccessible::summary() const
153 {
154 return nullptr;
155 }
156
157 bool KItemListViewAccessible::isColumnSelected(int) const
158 {
159 return false;
160 }
161
162 bool KItemListViewAccessible::isRowSelected(int) const
163 {
164 return false;
165 }
166
167 bool KItemListViewAccessible::selectRow(int)
168 {
169 return true;
170 }
171
172 bool KItemListViewAccessible::selectColumn(int)
173 {
174 return true;
175 }
176
177 bool KItemListViewAccessible::unselectRow(int)
178 {
179 return true;
180 }
181
182 bool KItemListViewAccessible::unselectColumn(int)
183 {
184 return true;
185 }
186
187 void KItemListViewAccessible::modelChange(QAccessibleTableModelChangeEvent * /*event*/)
188 {
189 }
190
191 QAccessible::Role KItemListViewAccessible::role() const
192 {
193 return QAccessible::Table;
194 }
195
196 QAccessible::State KItemListViewAccessible::state() const
197 {
198 QAccessible::State s;
199 return s;
200 }
201
202 QAccessibleInterface *KItemListViewAccessible::childAt(int x, int y) const
203 {
204 const QPointF point = QPointF(x, y);
205 const std::optional<int> itemIndex = view()->itemAt(view()->mapFromScene(point));
206 return child(itemIndex.value_or(-1));
207 }
208
209 QAccessibleInterface *KItemListViewAccessible::parent() const
210 {
211 // FIXME: return KItemListContainerAccessible here
212 return nullptr;
213 }
214
215 int KItemListViewAccessible::childCount() const
216 {
217 return view()->model()->count();
218 }
219
220 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface *interface) const
221 {
222 const KItemListAccessibleCell *widget = static_cast<const KItemListAccessibleCell *>(interface);
223 return widget->index();
224 }
225
226 QString KItemListViewAccessible::text(QAccessible::Text) const
227 {
228 return QString();
229 }
230
231 QRect KItemListViewAccessible::rect() const
232 {
233 if (!view()->isVisible()) {
234 return QRect();
235 }
236
237 const QGraphicsScene *scene = view()->scene();
238 if (scene) {
239 const QPoint origin = scene->views().at(0)->mapToGlobal(QPoint(0, 0));
240 const QRect viewRect = view()->geometry().toRect();
241 return viewRect.translated(origin);
242 } else {
243 return QRect();
244 }
245 }
246
247 QAccessibleInterface *KItemListViewAccessible::child(int index) const
248 {
249 if (index >= 0 && index < childCount()) {
250 return cell(index);
251 }
252 return nullptr;
253 }
254
255 KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper()
256 : isValid(false)
257 , id(0)
258 {
259 }
260
261 // Table Cell
262
263 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView *view, int index)
264 : m_view(view)
265 , m_index(index)
266 {
267 Q_ASSERT(index >= 0 && index < view->model()->count());
268 }
269
270 void *KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type)
271 {
272 if (type == QAccessible::TableCellInterface) {
273 return static_cast<QAccessibleTableCellInterface *>(this);
274 }
275 return nullptr;
276 }
277
278 int KItemListAccessibleCell::columnExtent() const
279 {
280 return 1;
281 }
282
283 int KItemListAccessibleCell::rowExtent() const
284 {
285 return 1;
286 }
287
288 QList<QAccessibleInterface *> KItemListAccessibleCell::rowHeaderCells() const
289 {
290 return QList<QAccessibleInterface *>();
291 }
292
293 QList<QAccessibleInterface *> KItemListAccessibleCell::columnHeaderCells() const
294 {
295 return QList<QAccessibleInterface *>();
296 }
297
298 int KItemListAccessibleCell::columnIndex() const
299 {
300 return m_view->m_layouter->itemColumn(m_index);
301 }
302
303 int KItemListAccessibleCell::rowIndex() const
304 {
305 return m_view->m_layouter->itemRow(m_index);
306 }
307
308 bool KItemListAccessibleCell::isSelected() const
309 {
310 return m_view->controller()->selectionManager()->isSelected(m_index);
311 }
312
313 QAccessibleInterface *KItemListAccessibleCell::table() const
314 {
315 return QAccessible::queryAccessibleInterface(m_view);
316 }
317
318 QAccessible::Role KItemListAccessibleCell::role() const
319 {
320 return QAccessible::Cell;
321 }
322
323 QAccessible::State KItemListAccessibleCell::state() const
324 {
325 QAccessible::State state;
326
327 state.selectable = true;
328 if (isSelected()) {
329 state.selected = true;
330 }
331
332 state.focusable = true;
333 if (m_view->controller()->selectionManager()->currentItem() == m_index) {
334 state.focused = true;
335 }
336
337 if (m_view->controller()->selectionBehavior() == KItemListController::MultiSelection) {
338 state.multiSelectable = true;
339 }
340
341 if (m_view->model()->isExpandable(m_index)) {
342 if (m_view->model()->isExpanded(m_index)) {
343 state.expanded = true;
344 } else {
345 state.collapsed = true;
346 }
347 }
348
349 return state;
350 }
351
352 bool KItemListAccessibleCell::isExpandable() const
353 {
354 return m_view->model()->isExpandable(m_index);
355 }
356
357 QRect KItemListAccessibleCell::rect() const
358 {
359 QRect rect = m_view->itemRect(m_index).toRect();
360
361 if (rect.isNull()) {
362 return QRect();
363 }
364
365 rect.translate(m_view->mapToScene(QPointF(0.0, 0.0)).toPoint());
366 rect.translate(m_view->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
367 return rect;
368 }
369
370 QString KItemListAccessibleCell::text(QAccessible::Text t) const
371 {
372 switch (t) {
373 case QAccessible::Name: {
374 const QHash<QByteArray, QVariant> data = m_view->model()->data(m_index);
375 return data["text"].toString();
376 }
377
378 default:
379 break;
380 }
381
382 return QString();
383 }
384
385 void KItemListAccessibleCell::setText(QAccessible::Text, const QString &)
386 {
387 }
388
389 QAccessibleInterface *KItemListAccessibleCell::child(int) const
390 {
391 return nullptr;
392 }
393
394 bool KItemListAccessibleCell::isValid() const
395 {
396 return m_view && (m_index >= 0) && (m_index < m_view->model()->count());
397 }
398
399 QAccessibleInterface *KItemListAccessibleCell::childAt(int, int) const
400 {
401 return nullptr;
402 }
403
404 int KItemListAccessibleCell::childCount() const
405 {
406 return 0;
407 }
408
409 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface *child) const
410 {
411 Q_UNUSED(child)
412 return -1;
413 }
414
415 QAccessibleInterface *KItemListAccessibleCell::parent() const
416 {
417 return QAccessible::queryAccessibleInterface(m_view);
418 }
419
420 int KItemListAccessibleCell::index() const
421 {
422 return m_index;
423 }
424
425 QObject *KItemListAccessibleCell::object() const
426 {
427 return nullptr;
428 }
429
430 // Container Interface
431 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer *container)
432 : QAccessibleWidget(container)
433 {
434 }
435
436 KItemListContainerAccessible::~KItemListContainerAccessible()
437 {
438 }
439
440 int KItemListContainerAccessible::childCount() const
441 {
442 return 1;
443 }
444
445 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface *child) const
446 {
447 if (child->object() == container()->controller()->view()) {
448 return 0;
449 }
450 return -1;
451 }
452
453 QAccessibleInterface *KItemListContainerAccessible::child(int index) const
454 {
455 if (index == 0) {
456 return QAccessible::queryAccessibleInterface(container()->controller()->view());
457 }
458 return nullptr;
459 }
460
461 const KItemListContainer *KItemListContainerAccessible::container() const
462 {
463 return qobject_cast<KItemListContainer *>(object());
464 }
465
466 #endif // QT_NO_ACCESSIBILITY