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