2 * SPDX-FileCopyrightText: 2012 Amandeep Singh <aman.dedman@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #ifndef QT_NO_ACCESSIBILITY
8 #include "kitemlistviewaccessible.h"
10 #include "kitemlistcontainer.h"
11 #include "kitemlistcontroller.h"
12 #include "kitemlistselectionmanager.h"
13 #include "kitemlistview.h"
14 #include "private/kitemlistviewlayouter.h"
16 #include <QGraphicsScene>
17 #include <QGraphicsView>
19 KItemListView
*KItemListViewAccessible::view() const
21 return qobject_cast
<KItemListView
*>(object());
24 KItemListViewAccessible::KItemListViewAccessible(KItemListView
*view_
, KItemListContainerAccessible
*parent
)
25 : QAccessibleObject(view_
)
30 m_cells
.resize(childCount());
33 KItemListViewAccessible::~KItemListViewAccessible()
35 for (AccessibleIdWrapper idWrapper
: std::as_const(m_cells
)) {
36 if (idWrapper
.isValid
) {
37 QAccessible::deleteAccessibleInterface(idWrapper
.id
);
42 void *KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type
)
44 if (type
== QAccessible::TableInterface
) {
45 return static_cast<QAccessibleTableInterface
*>(this);
50 void KItemListViewAccessible::modelReset()
54 QAccessibleInterface
*KItemListViewAccessible::cell(int index
) const
56 if (index
< 0 || index
>= view()->model()->count()) {
60 if (m_cells
.size() <= index
) {
61 m_cells
.resize(childCount());
63 Q_ASSERT(index
< m_cells
.size());
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
);
71 return QAccessible::accessibleInterface(idWrapper
.id
);
74 QAccessibleInterface
*KItemListViewAccessible::cellAt(int row
, int column
) const
76 return cell(columnCount() * row
+ column
);
79 QAccessibleInterface
*KItemListViewAccessible::caption() const
84 QString
KItemListViewAccessible::columnDescription(int) const
89 int KItemListViewAccessible::columnCount() const
91 return view()->m_layouter
->columnCount();
94 int KItemListViewAccessible::rowCount() const
96 if (columnCount() <= 0) {
100 int itemCount
= view()->model()->count();
101 int rowCount
= itemCount
/ columnCount();
107 if (itemCount
% columnCount()) {
113 int KItemListViewAccessible::selectedCellCount() const
115 return view()->controller()->selectionManager()->selectedItems().count();
118 int KItemListViewAccessible::selectedColumnCount() const
123 int KItemListViewAccessible::selectedRowCount() const
128 QString
KItemListViewAccessible::rowDescription(int) const
133 QList
<QAccessibleInterface
*> KItemListViewAccessible::selectedCells() const
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
));
144 QList
<int> KItemListViewAccessible::selectedColumns() const
149 QList
<int> KItemListViewAccessible::selectedRows() const
154 QAccessibleInterface
*KItemListViewAccessible::summary() const
159 bool KItemListViewAccessible::isColumnSelected(int) const
164 bool KItemListViewAccessible::isRowSelected(int) const
169 bool KItemListViewAccessible::selectRow(int)
174 bool KItemListViewAccessible::selectColumn(int)
179 bool KItemListViewAccessible::unselectRow(int)
184 bool KItemListViewAccessible::unselectColumn(int)
189 void KItemListViewAccessible::modelChange(QAccessibleTableModelChangeEvent
* /*event*/)
193 QAccessible::Role
KItemListViewAccessible::role() const
195 return QAccessible::Table
;
198 QAccessible::State
KItemListViewAccessible::state() const
200 QAccessible::State s
;
204 QAccessibleInterface
*KItemListViewAccessible::childAt(int x
, int y
) const
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));
211 QAccessibleInterface
*KItemListViewAccessible::parent() const
216 int KItemListViewAccessible::childCount() const
218 return view()->model()->count();
221 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
*interface
) const
223 const KItemListAccessibleCell
*widget
= static_cast<const KItemListAccessibleCell
*>(interface
);
224 return widget
->index();
227 QString
KItemListViewAccessible::text(QAccessible::Text
) const
232 QRect
KItemListViewAccessible::rect() const
234 if (!view()->isVisible()) {
238 const QGraphicsScene
*scene
= view()->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
);
248 QAccessibleInterface
*KItemListViewAccessible::child(int index
) const
250 if (index
>= 0 && index
< childCount()) {
256 KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper()
264 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView
*view
, int index
)
268 Q_ASSERT(index
>= 0 && index
< view
->model()->count());
271 void *KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type
)
273 if (type
== QAccessible::TableCellInterface
) {
274 return static_cast<QAccessibleTableCellInterface
*>(this);
279 int KItemListAccessibleCell::columnExtent() const
284 int KItemListAccessibleCell::rowExtent() const
289 QList
<QAccessibleInterface
*> KItemListAccessibleCell::rowHeaderCells() const
291 return QList
<QAccessibleInterface
*>();
294 QList
<QAccessibleInterface
*> KItemListAccessibleCell::columnHeaderCells() const
296 return QList
<QAccessibleInterface
*>();
299 int KItemListAccessibleCell::columnIndex() const
301 return m_view
->m_layouter
->itemColumn(m_index
);
304 int KItemListAccessibleCell::rowIndex() const
306 return m_view
->m_layouter
->itemRow(m_index
);
309 bool KItemListAccessibleCell::isSelected() const
311 return m_view
->controller()->selectionManager()->isSelected(m_index
);
314 QAccessibleInterface
*KItemListAccessibleCell::table() const
316 return QAccessible::queryAccessibleInterface(m_view
);
319 QAccessible::Role
KItemListAccessibleCell::role() const
321 return QAccessible::Cell
;
324 QAccessible::State
KItemListAccessibleCell::state() const
326 QAccessible::State state
;
328 state
.selectable
= true;
330 state
.selected
= true;
333 state
.focusable
= true;
334 if (m_view
->controller()->selectionManager()->currentItem() == m_index
) {
335 state
.focused
= true;
338 if (m_view
->controller()->selectionBehavior() == KItemListController::MultiSelection
) {
339 state
.multiSelectable
= true;
342 if (m_view
->model()->isExpandable(m_index
)) {
343 if (m_view
->model()->isExpanded(m_index
)) {
344 state
.expanded
= true;
346 state
.collapsed
= true;
353 bool KItemListAccessibleCell::isExpandable() const
355 return m_view
->model()->isExpandable(m_index
);
358 QRect
KItemListAccessibleCell::rect() const
360 QRect rect
= m_view
->itemRect(m_index
).toRect();
366 rect
.translate(m_view
->mapToScene(QPointF(0.0, 0.0)).toPoint());
367 rect
.translate(m_view
->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
371 QString
KItemListAccessibleCell::text(QAccessible::Text t
) const
374 case QAccessible::Name
: {
375 const QHash
<QByteArray
, QVariant
> data
= m_view
->model()->data(m_index
);
376 return data
["text"].toString();
386 void KItemListAccessibleCell::setText(QAccessible::Text
, const QString
&)
390 QAccessibleInterface
*KItemListAccessibleCell::child(int) const
395 bool KItemListAccessibleCell::isValid() const
397 return m_view
&& (m_index
>= 0) && (m_index
< m_view
->model()->count());
400 QAccessibleInterface
*KItemListAccessibleCell::childAt(int, int) const
405 int KItemListAccessibleCell::childCount() const
410 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface
*child
) const
416 QAccessibleInterface
*KItemListAccessibleCell::parent() const
418 return QAccessible::queryAccessibleInterface(m_view
);
421 int KItemListAccessibleCell::index() const
426 QObject
*KItemListAccessibleCell::object() const
431 // Container Interface
432 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
*container
)
433 : QAccessibleWidget(container
)
437 KItemListContainerAccessible::~KItemListContainerAccessible()
441 int KItemListContainerAccessible::childCount() const
446 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface
*child
) const
448 if (child
->object() == container()->controller()->view()) {
454 QAccessibleInterface
*KItemListContainerAccessible::child(int index
) const
457 return QAccessible::queryAccessibleInterface(container()->controller()->view());
462 const KItemListContainer
*KItemListContainerAccessible::container() const
464 return qobject_cast
<KItemListContainer
*>(object());
467 #endif // QT_NO_ACCESSIBILITY