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_
) :
25 QAccessibleObject(view_
)
28 m_cells
.resize(childCount());
31 KItemListViewAccessible::~KItemListViewAccessible()
33 for (AccessibleIdWrapper idWrapper
: qAsConst(m_cells
)) {
34 if (idWrapper
.isValid
) {
35 QAccessible::deleteAccessibleInterface(idWrapper
.id
);
40 void* KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type
)
42 if (type
== QAccessible::TableInterface
) {
43 return static_cast<QAccessibleTableInterface
*>(this);
48 void KItemListViewAccessible::modelReset()
52 QAccessibleInterface
* KItemListViewAccessible::cell(int index
) const
54 if (index
< 0 || index
>= view()->model()->count()) {
58 if (m_cells
.size() <= index
) {
59 m_cells
.resize(childCount());
61 Q_ASSERT(index
< m_cells
.size());
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
);
69 return QAccessible::accessibleInterface(idWrapper
.id
);
72 QAccessibleInterface
* KItemListViewAccessible::cellAt(int row
, int column
) const
74 return cell(columnCount() * row
+ column
);
77 QAccessibleInterface
* KItemListViewAccessible::caption() const
82 QString
KItemListViewAccessible::columnDescription(int) const
87 int KItemListViewAccessible::columnCount() const
89 return view()->m_layouter
->columnCount();
92 int KItemListViewAccessible::rowCount() const
94 if (columnCount() <= 0) {
98 int itemCount
= view()->model()->count();
99 int rowCount
= itemCount
/ columnCount();
105 if (itemCount
% columnCount()) {
111 int KItemListViewAccessible::selectedCellCount() const
113 return view()->controller()->selectionManager()->selectedItems().count();
116 int KItemListViewAccessible::selectedColumnCount() const
121 int KItemListViewAccessible::selectedRowCount() const
126 QString
KItemListViewAccessible::rowDescription(int) const
131 QList
<QAccessibleInterface
*> KItemListViewAccessible::selectedCells() const
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
));
142 QList
<int> KItemListViewAccessible::selectedColumns() const
147 QList
<int> KItemListViewAccessible::selectedRows() const
152 QAccessibleInterface
* KItemListViewAccessible::summary() const
157 bool KItemListViewAccessible::isColumnSelected(int) const
162 bool KItemListViewAccessible::isRowSelected(int) const
167 bool KItemListViewAccessible::selectRow(int)
172 bool KItemListViewAccessible::selectColumn(int)
177 bool KItemListViewAccessible::unselectRow(int)
182 bool KItemListViewAccessible::unselectColumn(int)
187 void KItemListViewAccessible::modelChange(QAccessibleTableModelChangeEvent
* /*event*/)
190 QAccessible::Role
KItemListViewAccessible::role() const
192 return QAccessible::Table
;
195 QAccessible::State
KItemListViewAccessible::state() const
197 QAccessible::State s
;
201 QAccessibleInterface
* KItemListViewAccessible::childAt(int x
, int y
) const
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));
208 QAccessibleInterface
* KItemListViewAccessible::parent() const
210 // FIXME: return KItemListContainerAccessible here
214 int KItemListViewAccessible::childCount() const
216 return view()->model()->count();
219 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
* interface
) const
221 const KItemListAccessibleCell
* widget
= static_cast<const KItemListAccessibleCell
*>(interface
);
222 return widget
->index();
225 QString
KItemListViewAccessible::text(QAccessible::Text
) const
230 QRect
KItemListViewAccessible::rect() const
232 if (!view()->isVisible()) {
236 const QGraphicsScene
* scene
= view()->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
);
246 QAccessibleInterface
* KItemListViewAccessible::child(int index
) const
248 if (index
>= 0 && index
< childCount()) {
254 KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() :
262 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView
* view
, int index
) :
266 Q_ASSERT(index
>= 0 && index
< view
->model()->count());
269 void* KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type
)
271 if (type
== QAccessible::TableCellInterface
) {
272 return static_cast<QAccessibleTableCellInterface
*>(this);
277 int KItemListAccessibleCell::columnExtent() const
282 int KItemListAccessibleCell::rowExtent() const
287 QList
<QAccessibleInterface
*> KItemListAccessibleCell::rowHeaderCells() const
289 return QList
<QAccessibleInterface
*>();
292 QList
<QAccessibleInterface
*> KItemListAccessibleCell::columnHeaderCells() const
294 return QList
<QAccessibleInterface
*>();
297 int KItemListAccessibleCell::columnIndex() const
299 return m_view
->m_layouter
->itemColumn(m_index
);
302 int KItemListAccessibleCell::rowIndex() const
304 return m_view
->m_layouter
->itemRow(m_index
);
307 bool KItemListAccessibleCell::isSelected() const
309 return m_view
->controller()->selectionManager()->isSelected(m_index
);
312 QAccessibleInterface
* KItemListAccessibleCell::table() const
314 return QAccessible::queryAccessibleInterface(m_view
);
317 QAccessible::Role
KItemListAccessibleCell::role() const
319 return QAccessible::Cell
;
322 QAccessible::State
KItemListAccessibleCell::state() const
324 QAccessible::State state
;
326 state
.selectable
= true;
328 state
.selected
= true;
331 state
.focusable
= true;
332 if (m_view
->controller()->selectionManager()->currentItem() == m_index
) {
333 state
.focused
= true;
336 if (m_view
->controller()->selectionBehavior() == KItemListController::MultiSelection
) {
337 state
.multiSelectable
= true;
340 if (m_view
->model()->isExpandable(m_index
)) {
341 if (m_view
->model()->isExpanded(m_index
)) {
342 state
.expanded
= true;
344 state
.collapsed
= true;
351 bool KItemListAccessibleCell::isExpandable() const
353 return m_view
->model()->isExpandable(m_index
);
356 QRect
KItemListAccessibleCell::rect() const
358 QRect rect
= m_view
->itemRect(m_index
).toRect();
364 rect
.translate(m_view
->mapToScene(QPointF(0.0, 0.0)).toPoint());
365 rect
.translate(m_view
->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
369 QString
KItemListAccessibleCell::text(QAccessible::Text t
) const
372 case QAccessible::Name
: {
373 const QHash
<QByteArray
, QVariant
> data
= m_view
->model()->data(m_index
);
374 return data
["text"].toString();
384 void KItemListAccessibleCell::setText(QAccessible::Text
, const QString
&)
388 QAccessibleInterface
* KItemListAccessibleCell::child(int) const
393 bool KItemListAccessibleCell::isValid() const
395 return m_view
&& (m_index
>= 0) && (m_index
< m_view
->model()->count());
398 QAccessibleInterface
* KItemListAccessibleCell::childAt(int, int) const
403 int KItemListAccessibleCell::childCount() const
408 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface
* child
) const
414 QAccessibleInterface
* KItemListAccessibleCell::parent() const
416 return QAccessible::queryAccessibleInterface(m_view
);
419 int KItemListAccessibleCell::index() const
424 QObject
* KItemListAccessibleCell::object() const
429 // Container Interface
430 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
* container
) :
431 QAccessibleWidget(container
)
435 KItemListContainerAccessible::~KItemListContainerAccessible()
439 int KItemListContainerAccessible::childCount() const
444 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface
* child
) const
446 if (child
->object() == container()->controller()->view()) {
452 QAccessibleInterface
* KItemListContainerAccessible::child(int index
) const
455 return QAccessible::queryAccessibleInterface(container()->controller()->view());
460 const KItemListContainer
* KItemListContainerAccessible::container() const
462 return qobject_cast
<KItemListContainer
*>(object());
465 #endif // QT_NO_ACCESSIBILITY