1 /***************************************************************************
2 * Copyright (C) 2012 by Amandeep Singh <aman.dedman@gmail.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
20 #ifndef QT_NO_ACCESSIBILITY
22 #include "kitemlistviewaccessible.h"
24 #include "kitemlistcontainer.h"
25 #include "kitemlistcontroller.h"
26 #include "kitemlistselectionmanager.h"
27 #include "kitemlistview.h"
28 #include "private/kitemlistviewlayouter.h"
30 #include <QGraphicsScene>
31 #include <QGraphicsView>
33 KItemListView
* KItemListViewAccessible::view() const
35 return qobject_cast
<KItemListView
*>(object());
38 KItemListViewAccessible::KItemListViewAccessible(KItemListView
* view_
) :
39 QAccessibleObject(view_
)
42 m_cells
.resize(childCount());
45 KItemListViewAccessible::~KItemListViewAccessible()
47 foreach (AccessibleIdWrapper idWrapper
, m_cells
) {
48 if (idWrapper
.isValid
) {
49 QAccessible::deleteAccessibleInterface(idWrapper
.id
);
54 void* KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type
)
56 if (type
== QAccessible::TableInterface
) {
57 return static_cast<QAccessibleTableInterface
*>(this);
62 void KItemListViewAccessible::modelReset()
66 QAccessibleInterface
* KItemListViewAccessible::cell(int index
) const
68 if (index
< 0 || index
>= view()->model()->count()) {
72 if (m_cells
.size() <= index
) {
73 m_cells
.resize(childCount());
75 Q_ASSERT(index
< m_cells
.size());
77 AccessibleIdWrapper idWrapper
= m_cells
.at(index
);
78 if (!idWrapper
.isValid
) {
79 idWrapper
.id
= QAccessible::registerAccessibleInterface(new KItemListAccessibleCell(view(), index
));
80 idWrapper
.isValid
= true;
81 m_cells
.insert(index
, idWrapper
);
83 return QAccessible::accessibleInterface(idWrapper
.id
);
86 QAccessibleInterface
* KItemListViewAccessible::cellAt(int row
, int column
) const
88 return cell(columnCount() * row
+ column
);
91 QAccessibleInterface
* KItemListViewAccessible::caption() const
96 QString
KItemListViewAccessible::columnDescription(int) const
101 int KItemListViewAccessible::columnCount() const
103 return view()->m_layouter
->columnCount();
106 int KItemListViewAccessible::rowCount() const
108 if (columnCount() <= 0) {
112 int itemCount
= view()->model()->count();
113 int rowCount
= itemCount
/ columnCount();
119 if (itemCount
% columnCount()) {
125 int KItemListViewAccessible::selectedCellCount() const
127 return view()->controller()->selectionManager()->selectedItems().count();
130 int KItemListViewAccessible::selectedColumnCount() const
135 int KItemListViewAccessible::selectedRowCount() const
140 QString
KItemListViewAccessible::rowDescription(int) const
145 QList
<QAccessibleInterface
*> KItemListViewAccessible::selectedCells() const
147 QList
<QAccessibleInterface
*> cells
;
148 const auto items
= view()->controller()->selectionManager()->selectedItems();
149 cells
.reserve(items
.count());
150 for (int index
: items
) {
151 cells
.append(cell(index
));
156 QList
<int> KItemListViewAccessible::selectedColumns() const
161 QList
<int> KItemListViewAccessible::selectedRows() const
166 QAccessibleInterface
* KItemListViewAccessible::summary() const
171 bool KItemListViewAccessible::isColumnSelected(int) const
176 bool KItemListViewAccessible::isRowSelected(int) const
181 bool KItemListViewAccessible::selectRow(int)
186 bool KItemListViewAccessible::selectColumn(int)
191 bool KItemListViewAccessible::unselectRow(int)
196 bool KItemListViewAccessible::unselectColumn(int)
201 void KItemListViewAccessible::modelChange(QAccessibleTableModelChangeEvent
* /*event*/)
204 QAccessible::Role
KItemListViewAccessible::role() const
206 return QAccessible::Table
;
209 QAccessible::State
KItemListViewAccessible::state() const
211 QAccessible::State s
;
215 QAccessibleInterface
* KItemListViewAccessible::childAt(int x
, int y
) const
217 const QPointF point
= QPointF(x
, y
);
218 int itemIndex
= view()->itemAt(view()->mapFromScene(point
));
219 return child(itemIndex
);
222 QAccessibleInterface
* KItemListViewAccessible::parent() const
224 // FIXME: return KItemListContainerAccessible here
228 int KItemListViewAccessible::childCount() const
230 return view()->model()->count();
233 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
* interface
) const
235 const KItemListAccessibleCell
* widget
= static_cast<const KItemListAccessibleCell
*>(interface
);
236 return widget
->index();
239 QString
KItemListViewAccessible::text(QAccessible::Text
) const
244 QRect
KItemListViewAccessible::rect() const
246 if (!view()->isVisible()) {
250 const QGraphicsScene
* scene
= view()->scene();
252 const QPoint origin
= scene
->views().at(0)->mapToGlobal(QPoint(0, 0));
253 const QRect viewRect
= view()->geometry().toRect();
254 return viewRect
.translated(origin
);
260 QAccessibleInterface
* KItemListViewAccessible::child(int index
) const
262 if (index
>= 0 && index
< childCount()) {
268 KItemListViewAccessible::AccessibleIdWrapper::AccessibleIdWrapper() :
276 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView
* view
, int index
) :
280 Q_ASSERT(index
>= 0 && index
< view
->model()->count());
283 void* KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type
)
285 if (type
== QAccessible::TableCellInterface
) {
286 return static_cast<QAccessibleTableCellInterface
*>(this);
291 int KItemListAccessibleCell::columnExtent() const
296 int KItemListAccessibleCell::rowExtent() const
301 QList
<QAccessibleInterface
*> KItemListAccessibleCell::rowHeaderCells() const
303 return QList
<QAccessibleInterface
*>();
306 QList
<QAccessibleInterface
*> KItemListAccessibleCell::columnHeaderCells() const
308 return QList
<QAccessibleInterface
*>();
311 int KItemListAccessibleCell::columnIndex() const
313 return m_view
->m_layouter
->itemColumn(m_index
);
316 int KItemListAccessibleCell::rowIndex() const
318 return m_view
->m_layouter
->itemRow(m_index
);
321 bool KItemListAccessibleCell::isSelected() const
323 return m_view
->controller()->selectionManager()->isSelected(m_index
);
326 QAccessibleInterface
* KItemListAccessibleCell::table() const
328 return QAccessible::queryAccessibleInterface(m_view
);
331 QAccessible::Role
KItemListAccessibleCell::role() const
333 return QAccessible::Cell
;
336 QAccessible::State
KItemListAccessibleCell::state() const
338 QAccessible::State state
;
340 state
.selectable
= true;
342 state
.selected
= true;
345 state
.focusable
= true;
346 if (m_view
->controller()->selectionManager()->currentItem() == m_index
) {
347 state
.focused
= true;
350 if (m_view
->controller()->selectionBehavior() == KItemListController::MultiSelection
) {
351 state
.multiSelectable
= true;
354 if (m_view
->model()->isExpandable(m_index
)) {
355 if (m_view
->model()->isExpanded(m_index
)) {
356 state
.expanded
= true;
358 state
.collapsed
= true;
365 bool KItemListAccessibleCell::isExpandable() const
367 return m_view
->model()->isExpandable(m_index
);
370 QRect
KItemListAccessibleCell::rect() const
372 QRect rect
= m_view
->itemRect(m_index
).toRect();
378 rect
.translate(m_view
->mapToScene(QPointF(0.0, 0.0)).toPoint());
379 rect
.translate(m_view
->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
383 QString
KItemListAccessibleCell::text(QAccessible::Text t
) const
386 case QAccessible::Name
: {
387 const QHash
<QByteArray
, QVariant
> data
= m_view
->model()->data(m_index
);
388 return data
["text"].toString();
398 void KItemListAccessibleCell::setText(QAccessible::Text
, const QString
&)
402 QAccessibleInterface
* KItemListAccessibleCell::child(int) const
407 bool KItemListAccessibleCell::isValid() const
409 return m_view
&& (m_index
>= 0) && (m_index
< m_view
->model()->count());
412 QAccessibleInterface
* KItemListAccessibleCell::childAt(int, int) const
417 int KItemListAccessibleCell::childCount() const
422 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface
* child
) const
428 QAccessibleInterface
* KItemListAccessibleCell::parent() const
430 return QAccessible::queryAccessibleInterface(m_view
);
433 int KItemListAccessibleCell::index() const
438 QObject
* KItemListAccessibleCell::object() const
443 // Container Interface
444 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
* container
) :
445 QAccessibleWidget(container
)
449 KItemListContainerAccessible::~KItemListContainerAccessible()
453 int KItemListContainerAccessible::childCount() const
458 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface
* child
) const
460 if (child
->object() == container()->controller()->view()) {
466 QAccessibleInterface
* KItemListContainerAccessible::child(int index
) const
469 return QAccessible::queryAccessibleInterface(container()->controller()->view());
474 const KItemListContainer
* KItemListContainerAccessible::container() const
476 return qobject_cast
<KItemListContainer
*>(object());
479 #endif // QT_NO_ACCESSIBILITY