]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kitemlistviewaccessible.cpp
Fix paste on row while in details view mode
[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 : qAsConst(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 QAccessible::Role KItemListViewAccessible::role() const
191 {
192 return QAccessible::Table;
193 }
194
195 QAccessible::State KItemListViewAccessible::state() const
196 {
197 QAccessible::State s;
198 return s;
199 }
200
201 QAccessibleInterface* KItemListViewAccessible::childAt(int x, int y) const
202 {
203 const QPointF point = QPointF(x, y);
204 const std::optional<int> itemIndex = view()->itemAt(view()->mapFromScene(point));
205 return child(itemIndex.value_or(-1));
206 }
207
208 QAccessibleInterface* KItemListViewAccessible::parent() const
209 {
210 // FIXME: return KItemListContainerAccessible here
211 return nullptr;
212 }
213
214 int KItemListViewAccessible::childCount() const
215 {
216 return view()->model()->count();
217 }
218
219 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface* interface) const
220 {
221 const KItemListAccessibleCell* widget = static_cast<const KItemListAccessibleCell*>(interface);
222 return widget->index();
223 }
224
225 QString KItemListViewAccessible::text(QAccessible::Text) const
226 {
227 return QString();
228 }
229
230 QRect KItemListViewAccessible::rect() const
231 {
232 if (!view()->isVisible()) {
233 return QRect();
234 }
235
236 const QGraphicsScene* scene = view()->scene();
237 if (scene) {
238 const QPoint origin = scene->views().at(0)->mapToGlobal(QPoint(0, 0));
239 const QRect viewRect = view()->geometry().toRect();
240 return viewRect.translated(origin);
241 } else {
242 return QRect();
243 }
244 }
245
246 QAccessibleInterface* KItemListViewAccessible::child(int index) const
247 {
248 if (index >= 0 && index < childCount()) {
249 return cell(index);
250 }
251 return nullptr;
252 }
253
254 KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() :
255 isValid(false),
256 id(0)
257 {
258 }
259
260 // Table Cell
261
262 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) :
263 m_view(view),
264 m_index(index)
265 {
266 Q_ASSERT(index >= 0 && index < view->model()->count());
267 }
268
269 void* KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type)
270 {
271 if (type == QAccessible::TableCellInterface) {
272 return static_cast<QAccessibleTableCellInterface*>(this);
273 }
274 return nullptr;
275 }
276
277 int KItemListAccessibleCell::columnExtent() const
278 {
279 return 1;
280 }
281
282 int KItemListAccessibleCell::rowExtent() const
283 {
284 return 1;
285 }
286
287 QList<QAccessibleInterface*> KItemListAccessibleCell::rowHeaderCells() const
288 {
289 return QList<QAccessibleInterface*>();
290 }
291
292 QList<QAccessibleInterface*> KItemListAccessibleCell::columnHeaderCells() const
293 {
294 return QList<QAccessibleInterface*>();
295 }
296
297 int KItemListAccessibleCell::columnIndex() const
298 {
299 return m_view->m_layouter->itemColumn(m_index);
300 }
301
302 int KItemListAccessibleCell::rowIndex() const
303 {
304 return m_view->m_layouter->itemRow(m_index);
305 }
306
307 bool KItemListAccessibleCell::isSelected() const
308 {
309 return m_view->controller()->selectionManager()->isSelected(m_index);
310 }
311
312 QAccessibleInterface* KItemListAccessibleCell::table() const
313 {
314 return QAccessible::queryAccessibleInterface(m_view);
315 }
316
317 QAccessible::Role KItemListAccessibleCell::role() const
318 {
319 return QAccessible::Cell;
320 }
321
322 QAccessible::State KItemListAccessibleCell::state() const
323 {
324 QAccessible::State state;
325
326 state.selectable = true;
327 if (isSelected()) {
328 state.selected = true;
329 }
330
331 state.focusable = true;
332 if (m_view->controller()->selectionManager()->currentItem() == m_index) {
333 state.focused = true;
334 }
335
336 if (m_view->controller()->selectionBehavior() == KItemListController::MultiSelection) {
337 state.multiSelectable = true;
338 }
339
340 if (m_view->model()->isExpandable(m_index)) {
341 if (m_view->model()->isExpanded(m_index)) {
342 state.expanded = true;
343 } else {
344 state.collapsed = true;
345 }
346 }
347
348 return state;
349 }
350
351 bool KItemListAccessibleCell::isExpandable() const
352 {
353 return m_view->model()->isExpandable(m_index);
354 }
355
356 QRect KItemListAccessibleCell::rect() const
357 {
358 QRect rect = m_view->itemRect(m_index).toRect();
359
360 if (rect.isNull()) {
361 return QRect();
362 }
363
364 rect.translate(m_view->mapToScene(QPointF(0.0, 0.0)).toPoint());
365 rect.translate(m_view->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
366 return rect;
367 }
368
369 QString KItemListAccessibleCell::text(QAccessible::Text t) const
370 {
371 switch (t) {
372 case QAccessible::Name: {
373 const QHash<QByteArray, QVariant> data = m_view->model()->data(m_index);
374 return data["text"].toString();
375 }
376
377 default:
378 break;
379 }
380
381 return QString();
382 }
383
384 void KItemListAccessibleCell::setText(QAccessible::Text, const QString&)
385 {
386 }
387
388 QAccessibleInterface* KItemListAccessibleCell::child(int) const
389 {
390 return nullptr;
391 }
392
393 bool KItemListAccessibleCell::isValid() const
394 {
395 return m_view && (m_index >= 0) && (m_index < m_view->model()->count());
396 }
397
398 QAccessibleInterface* KItemListAccessibleCell::childAt(int, int) const
399 {
400 return nullptr;
401 }
402
403 int KItemListAccessibleCell::childCount() const
404 {
405 return 0;
406 }
407
408 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface* child) const
409 {
410 Q_UNUSED(child)
411 return -1;
412 }
413
414 QAccessibleInterface* KItemListAccessibleCell::parent() const
415 {
416 return QAccessible::queryAccessibleInterface(m_view);
417 }
418
419 int KItemListAccessibleCell::index() const
420 {
421 return m_index;
422 }
423
424 QObject* KItemListAccessibleCell::object() const
425 {
426 return nullptr;
427 }
428
429 // Container Interface
430 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer* container) :
431 QAccessibleWidget(container)
432 {
433 }
434
435 KItemListContainerAccessible::~KItemListContainerAccessible()
436 {
437 }
438
439 int KItemListContainerAccessible::childCount() const
440 {
441 return 1;
442 }
443
444 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface* child) const
445 {
446 if (child->object() == container()->controller()->view()) {
447 return 0;
448 }
449 return -1;
450 }
451
452 QAccessibleInterface* KItemListContainerAccessible::child(int index) const
453 {
454 if (index == 0) {
455 return QAccessible::queryAccessibleInterface(container()->controller()->view());
456 }
457 return nullptr;
458 }
459
460 const KItemListContainer* KItemListContainerAccessible::container() const
461 {
462 return qobject_cast<KItemListContainer*>(object());
463 }
464
465 #endif // QT_NO_ACCESSIBILITY