QTabBar: Add setAccessibleTabName() and accessibleTabName()

Currently, a tab's text is used as its accessibleName.
When a tab's text is empty, there is no API to set
the tab's accessibleName. The two APIs are added to
set and return the accessibleName property of a tab.

Task-number: QTBUG-46530
Change-Id: Idf88b5f905fe66c6365ea0eeb650e74211db90e1
Reviewed-by: Jan Arve Sæther <jan-arve.saether@theqtcompany.com>
This commit is contained in:
Dongmei Wang 2016-01-22 20:19:28 -08:00
parent 2ddad99979
commit 18291af42c
5 changed files with 72 additions and 7 deletions

View File

@ -120,19 +120,26 @@ public:
{
if (!isValid())
return QString();
QString str;
switch (t) {
case QAccessible::Name:
return qt_accStripAmp(m_parent->tabText(m_index));
str = m_parent->accessibleTabName(m_index);
if (str.isEmpty())
str = qt_accStripAmp(m_parent->tabText(m_index));
break;
case QAccessible::Accelerator:
return qt_accHotKey(m_parent->tabText(m_index));
str = qt_accHotKey(m_parent->tabText(m_index));
break;
case QAccessible::Description:
return m_parent->tabToolTip(m_index);
str = m_parent->tabToolTip(m_index);
break;
case QAccessible::Help:
return m_parent->tabWhatsThis(m_index);
str = m_parent->tabWhatsThis(m_index);
break;
default:
break;
}
return QString();
return str;
}
void setText(QAccessible::Text, const QString &) Q_DECL_OVERRIDE {}
@ -237,7 +244,12 @@ int QAccessibleTabBar::childCount() const
QString QAccessibleTabBar::text(QAccessible::Text t) const
{
if (t == QAccessible::Name) {
return qt_accStripAmp(tabBar()->tabText(tabBar()->currentIndex()));
const QTabBar *tBar = tabBar();
int idx = tBar->currentIndex();
QString str = tBar->accessibleTabName(idx);
if (str.isEmpty())
str = qt_accStripAmp(tBar->tabText(idx));
return str;
} else if (t == QAccessible::Accelerator) {
return qt_accHotKey(tabBar()->tabText(tabBar()->currentIndex()));
}

View File

@ -2522,6 +2522,34 @@ QWidget *QTabBar::tabButton(int index, ButtonPosition position) const
return d->tabList.at(index).rightWidget;
}
#ifndef QT_NO_ACCESSIBILITY
/*!
Sets the accessibleName of the tab at position \a index to \a name.
*/
void QTabBar::setAccessibleTabName(int index, const QString &name)
{
Q_D(QTabBar);
if (QTabBarPrivate::Tab *tab = d->at(index)) {
tab->accessibleName = name;
QAccessibleEvent event(this, QAccessible::NameChanged);
event.setChild(index);
QAccessible::updateAccessibility(&event);
}
}
/*!
Returns the accessibleName of the tab at position \a index, or an empty
string if \a index is out of range.
*/
QString QTabBar::accessibleTabName(int index) const
{
Q_D(const QTabBar);
if (const QTabBarPrivate::Tab *tab = d->at(index))
return tab->accessibleName;
return QString();
}
#endif // QT_NO_ACCESSIBILITY
CloseButton::CloseButton(QWidget *parent)
: QAbstractButton(parent)
{

View File

@ -172,6 +172,11 @@ public:
bool changeCurrentOnDrag() const;
void setChangeCurrentOnDrag(bool change);
#ifndef QT_NO_ACCESSIBILITY
QString accessibleTabName(int index) const;
void setAccessibleTabName(int index, const QString &name);
#endif
public Q_SLOTS:
void setCurrentIndex(int index);

View File

@ -131,6 +131,9 @@ public:
QWidget *rightWidget;
int lastTab;
int dragOffset;
#ifndef QT_NO_ACCESSIBILITY
QString accessibleName;
#endif
#ifndef QT_NO_ANIMATION
~Tab() { delete animation; }

View File

@ -1301,6 +1301,16 @@ void tst_QAccessibility::tabTest()
child2->actionInterface()->doAction(QAccessibleActionInterface::pressAction());
QCOMPARE(tabBar->currentIndex(), 1);
// Test that setAccessibleTabName changes a tab's accessible name
tabBar->setAccessibleTabName(0, "AccFoo");
tabBar->setAccessibleTabName(1, "AccBar");
QCOMPARE(child1->text(QAccessible::Name), QLatin1String("AccFoo"));
QCOMPARE(child2->text(QAccessible::Name), QLatin1String("AccBar"));
tabBar->setCurrentIndex(0);
QCOMPARE(interface->text(QAccessible::Name), QLatin1String("AccFoo"));
tabBar->setCurrentIndex(1);
QCOMPARE(interface->text(QAccessible::Name), QLatin1String("AccBar"));
delete tabBar;
QTestAccessibility::clearEvents();
}
@ -1338,10 +1348,17 @@ void tst_QAccessibility::tabWidgetTest()
QCOMPARE(tabButton1Interface->text(QAccessible::Name), QLatin1String("Tab 1"));
QAccessibleInterface* tabButton2Interface = tabBarInterface->child(1);
QVERIFY(tabButton1Interface);
QVERIFY(tabButton2Interface);
QCOMPARE(tabButton2Interface->role(), QAccessible::PageTab);
QCOMPARE(tabButton2Interface->text(QAccessible::Name), QLatin1String("Tab 2"));
// Test that setAccessibleTabName changes a tab's accessible name
tabWidget->setCurrentIndex(0);
tabWidget->tabBar()->setAccessibleTabName(0, "Acc Tab");
QCOMPARE(tabButton1Interface->role(), QAccessible::PageTab);
QCOMPARE(tabButton1Interface->text(QAccessible::Name), QLatin1String("Acc Tab"));
QCOMPARE(tabBarInterface->text(QAccessible::Name), QLatin1String("Acc Tab"));
QAccessibleInterface* tabButtonLeft = tabBarInterface->child(2);
QVERIFY(tabButtonLeft);
QCOMPARE(tabButtonLeft->role(), QAccessible::PushButton);