]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kitemlistviewaccessible.cpp
Merge branch 'release/20.12'
[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
9 #include "kitemlistviewaccessible.h"
10
11 #include "kitemlistcontainer.h"
12 #include "kitemlistcontroller.h"
13 #include "kitemlistselectionmanager.h"
14 #include "kitemlistview.h"
15 #include "private/kitemlistviewlayouter.h"
16
17 #include <QGraphicsScene>
18 #include <QGraphicsView>
19
20 KItemListView* KItemListViewAccessible::view() const
21 {
22 return qobject_cast<KItemListView*>(object());
23 }
24
25 KItemListViewAccessible::KItemListViewAccessible(KItemListView* view_) :
26 QAccessibleObject(view_)
27 {
28 Q_ASSERT(view());
29 m_cells.resize(childCount());
30 }
31
32 KItemListViewAccessible::~KItemListViewAccessible()
33 {
34 for (AccessibleIdWrapper idWrapper : qAsConst(m_cells)) {
35 if (idWrapper.isValid) {
36 QAccessible::deleteAccessibleInterface(idWrapper.id);
37 }
38 }
39 }
40
41 void* KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type)
42 {
43 if (type == QAccessible::TableInterface) {
44 return static_cast<QAccessibleTableInterface*>(this);
45 }
46 return nullptr;
47 }
48
49 void KItemListViewAccessible::modelReset()
50 {
51 }
52
53 QAccessibleInterface* KItemListViewAccessible::cell(int index) const
54 {
55 if (index < 0 || index >= view()->model()->count()) {
56 return nullptr;
57 }
58
59 if (m_cells.size() <= index) {
60 m_cells.resize(childCount());
61 }
62 Q_ASSERT(index < m_cells.size());
63
64 AccessibleIdWrapper idWrapper = m_cells.at(index);
65 if (!idWrapper.isValid) {
66 idWrapper.id = QAccessible::registerAccessibleInterface(new KItemListAccessibleCell(view(), index));
67 idWrapper.isValid = true;
68 m_cells.insert(index, idWrapper);
69 }
70 return QAccessible::accessibleInterface(idWrapper.id);
71 }
72
73 QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const
74 {
75 return cell(columnCount() * row + column);
76 }
77
78 QAccessibleInterface* KItemListViewAccessible::caption() const
79 {
80 return nullptr;
81 }
82
83 QString KItemListViewAccessible::columnDescription(int) const
84 {
85 return QString();
86 }
87
88 int KItemListViewAccessible::columnCount() const
89 {
90 return view()->m_layouter->columnCount();
91 }
92
93 int KItemListViewAccessible::rowCount() const
94 {
95 if (columnCount() <= 0) {
96 return 0;
97 }
98
99 int itemCount = view()->model()->count();
100 int rowCount = itemCount / columnCount();
101
102 if (rowCount <= 0) {
103 return 0;
104 }
105
106 if (itemCount % columnCount()) {
107 ++rowCount;
108 }
109 return rowCount;
110 }
111
112 int KItemListViewAccessible::selectedCellCount() const
113 {
114 return view()->controller()->selectionManager()->selectedItems().count();
115 }
116
117 int KItemListViewAccessible::selectedColumnCount() const
118 {
119 return 0;
120 }
121
122 int KItemListViewAccessible::selectedRowCount() const
123 {
124 return 0;
125 }
126
127 QString KItemListViewAccessible::rowDescription(int) const
128 {
129 return QString();
130 }
131
132 QList<QAccessibleInterface*> KItemListViewAccessible::selectedCells() const
133 {
134 QList<QAccessibleInterface*> cells;
135 const auto items = view()->controller()->selectionManager()->selectedItems();
136 cells.reserve(items.count());
137 for (int index : items) {
138 cells.append(cell(index));
139 }
140 return cells;
141 }
142
143 QList<int> KItemListViewAccessible::selectedColumns() const
144 {
145 return QList<int>();
146 }
147
148 QList<int> KItemListViewAccessible::selectedRows() const
149 {
150 return QList<int>();
151 }
152
153 QAccessibleInterface* KItemListViewAccessible::summary() const
154 {
155 return nullptr;
156 }
157
158 bool KItemListViewAccessible::isColumnSelected(int) const
159 {
160 return false;
161 }
162
163 bool KItemListViewAccessible::isRowSelected(int) const
164 {
165 return false;
166 }
167
168 bool KItemListViewAccessible::selectRow(int)
169 {
170 return true;
171 }
172
173 bool KItemListViewAccessible::selectColumn(int)
174 {
175 return true;
176 }
177
178 bool KItemListViewAccessible::unselectRow(int)
179 {
180 return true;
181 }
182
183 bool KItemListViewAccessible::unselectColumn(int)
184 {
185 return true;
186 }
187
188 void KItemListViewAccessible::modelChange(QAccessibleTableModelChangeEvent* /*event*/)
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 int itemIndex = view()->itemAt(view()->mapFromScene(point));
206 return child(itemIndex);
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