diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2022-10-12 07:07:48 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2022-11-14 08:36:45 +0100 |
commit | 092bbc9ad30c6cd7389053dc4b332cc762693676 (patch) | |
tree | 8a5372f4e436e19492fc3b167c941ab937452776 /src/widgets/accessible | |
parent | 5d95205bae4e6b279d6eb99c3b5f81f95c9b031e (diff) |
a11y: Implement QAccessibleSelectionInterface for item views
In QAccessibleTable's model, cells (rather than rows or columns)
are direct children of the table and therefore items handled in
the selection, so forward/make use of the corresponding methods
that handle cells.
(In QAccessibleTable::select and QAccessibleTable::unselect,
cast the child cell to QAccessibleTableCell*, as is already
done in QAccessibleTable::indexOfChild and
QAccessibleTree::indexOfChild.)
This can be tested e.g. by calling the methods from the
AT-SPI Selection interface using Accerciser and the
"interview" example
(qtbase/examples/widgets/itemviews/interview/interview).
Change-Id: Ic650a8a01b56653cae4f2cb26e28aed4dc566a7e
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/widgets/accessible')
-rw-r--r-- | src/widgets/accessible/itemviews.cpp | 81 | ||||
-rw-r--r-- | src/widgets/accessible/itemviews_p.h | 11 |
2 files changed, 91 insertions, 1 deletions
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp index 073f373d03..ae1de6cab4 100644 --- a/src/widgets/accessible/itemviews.cpp +++ b/src/widgets/accessible/itemviews.cpp @@ -366,6 +366,85 @@ bool QAccessibleTable::unselectColumn(int column) return true; } +int QAccessibleTable::selectedItemCount() const +{ + return selectedCellCount(); +} + +QList<QAccessibleInterface*> QAccessibleTable::selectedItems() const +{ + return selectedCells(); +} + +bool QAccessibleTable::isSelected(QAccessibleInterface *childCell) const +{ + if (!childCell || childCell->parent() != this) { + qWarning() << "QAccessibleTable::isSelected: Accessible interface must be a direct child of the table interface."; + return false; + } + + const QAccessibleTableCellInterface *cell = childCell->tableCellInterface(); + if (cell) + return cell->isSelected(); + + return false; +} + +bool QAccessibleTable::select(QAccessibleInterface *childCell) +{ + if (!childCell || childCell->parent() != this) { + qWarning() << "QAccessibleTable::select: Accessible interface must be a direct child of the table interface."; + return false; + } + + if (!childCell->tableCellInterface()) { + qWarning() << "QAccessibleTable::select: Accessible interface doesn't implement table cell interface."; + return false; + } + + if (childCell->role() == QAccessible::Cell || childCell->role() == QAccessible::ListItem || childCell->role() == QAccessible::TreeItem) { + QAccessibleTableCell* cell = static_cast<QAccessibleTableCell*>(childCell); + cell->selectCell(); + return true; + } + + return false; +} + +bool QAccessibleTable::unselect(QAccessibleInterface *childCell) +{ + if (!childCell || childCell->parent() != this) { + qWarning() << "QAccessibleTable::select: Accessible interface must be a direct child of the table interface."; + return false; + } + + if (!childCell->tableCellInterface()) { + qWarning() << "QAccessibleTable::unselect: Accessible interface doesn't implement table cell interface."; + return false; + } + + if (childCell->role() == QAccessible::Cell || childCell->role() == QAccessible::ListItem || childCell->role() == QAccessible::TreeItem) { + QAccessibleTableCell* cell = static_cast<QAccessibleTableCell*>(childCell); + cell->unselectCell(); + return true; + } + + return false; +} + +bool QAccessibleTable::selectAll() +{ + view()->selectAll(); + return true; +} + +bool QAccessibleTable::clear() +{ + view()->selectionModel()->clearSelection(); + return true; +} + + QAccessible::Role QAccessibleTable::role() const { return m_role; @@ -533,6 +612,8 @@ QAccessibleInterface *QAccessibleTable::child(int logicalIndex) const void *QAccessibleTable::interface_cast(QAccessible::InterfaceType t) { + if (t == QAccessible::SelectionInterface) + return static_cast<QAccessibleSelectionInterface*>(this); if (t == QAccessible::TableInterface) return static_cast<QAccessibleTableInterface*>(this); return nullptr; diff --git a/src/widgets/accessible/itemviews_p.h b/src/widgets/accessible/itemviews_p.h index ef38b87c53..ddc97baba1 100644 --- a/src/widgets/accessible/itemviews_p.h +++ b/src/widgets/accessible/itemviews_p.h @@ -31,7 +31,7 @@ QT_BEGIN_NAMESPACE class QAccessibleTableCell; class QAccessibleTableHeaderCell; -class QAccessibleTable :public QAccessibleTableInterface, public QAccessibleObject +class QAccessibleTable :public QAccessibleTableInterface, public QAccessibleSelectionInterface, public QAccessibleObject { public: explicit QAccessibleTable(QWidget *w); @@ -75,6 +75,15 @@ public: virtual bool unselectRow(int row) override; virtual bool unselectColumn(int column) override; + // QAccessibleSelectionInterface + virtual int selectedItemCount() const override; + virtual QList<QAccessibleInterface*> selectedItems() const override; + virtual bool isSelected(QAccessibleInterface *childCell) const override; + virtual bool select(QAccessibleInterface *childCell) override; + virtual bool unselect(QAccessibleInterface *childCell) override; + virtual bool selectAll() override; + virtual bool clear() override; + QAbstractItemView *view() const; void modelChange(QAccessibleTableModelChangeEvent *event) override; |