summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2012-10-19 15:08:42 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-14 15:00:15 +0200
commitf86ffab4023dbba092c7abdf00242f17428d86f5 (patch)
tree4e7023db42b54911f9c2c3bc477ba85007561bb3 /src
parent9ebd76b0214730bfa184008e0a5b2541827912eb (diff)
Accessibility: simplify dockwidget accessible
This patch merges the two classes that were used to make dock widgets accessible into one. The title bar does not need to be represented by its own accessible object. In addition the buttons on the toolbar are now labelled. Task-number: QTBUG-33946 Change-Id: Id90d8c09f15ed683e64dbe3f6ac55bca7a0b300f Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp228
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h23
-rw-r--r--src/widgets/widgets/qdockwidget.cpp10
3 files changed, 44 insertions, 217 deletions
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
index cbb3092b1d..79a5c82fe0 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -558,37 +558,56 @@ QWidget *QAccessibleCalendarWidget::navigationBar() const
#endif // QT_NO_CALENDARWIDGET
#ifndef QT_NO_DOCKWIDGET
+
+// Dock Widget - order of children:
+// - Content widget
+// - Float button
+// - Close button
+// If there is a custom title bar widget, that one becomes child 1, after the content 0
+// (in that case the buttons are ignored)
QAccessibleDockWidget::QAccessibleDockWidget(QWidget *widget)
: QAccessibleWidget(widget, QAccessible::Window)
{
+}
+QDockWidgetLayout *QAccessibleDockWidget::dockWidgetLayout() const
+{
+ return qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
}
-QAccessibleInterface *QAccessibleDockWidget::child(int index) const
+int QAccessibleDockWidget::childCount() const
{
- if (index == 0) {
- return new QAccessibleTitleBar(dockWidget());
- } else if (index == 1 && dockWidget()->widget()) {
- return QAccessible::queryAccessibleInterface(dockWidget()->widget());
+ if (dockWidget()->titleBarWidget()) {
+ return dockWidget()->widget() ? 2 : 1;
}
- return 0;
+ return dockWidgetLayout()->count();
}
-int QAccessibleDockWidget::childCount() const
+QAccessibleInterface *QAccessibleDockWidget::child(int index) const
{
- return dockWidget()->widget() ? 2 : 1;
+ if (dockWidget()->titleBarWidget()) {
+ if ((!dockWidget()->widget() && index == 0) || (index == 1))
+ return QAccessible::queryAccessibleInterface(dockWidget()->titleBarWidget());
+ if (index == 0)
+ return QAccessible::queryAccessibleInterface(dockWidget()->widget());
+ } else {
+ QLayoutItem *item = dockWidgetLayout()->itemAt(index);
+ if (item)
+ return QAccessible::queryAccessibleInterface(item->widget());
+ }
+ return 0;
}
int QAccessibleDockWidget::indexOfChild(const QAccessibleInterface *child) const
{
- if (child) {
- if (child->role() == QAccessible::TitleBar) {
- return 0;
- } else {
- return 1; // FIXME
- }
+ if (!child || !child->object() || child->object()->parent() != object())
+ return -1;
+
+ if (dockWidget()->titleBarWidget() == child->object()) {
+ return dockWidget()->widget() ? 1 : 0;
}
- return -1;
+
+ return dockWidgetLayout()->indexOf(qobject_cast<QWidget*>(child->object()));
}
QRect QAccessibleDockWidget::rect() const
@@ -610,190 +629,13 @@ QDockWidget *QAccessibleDockWidget::dockWidget() const
return static_cast<QDockWidget *>(object());
}
-////
-// QAccessibleTitleBar
-////
-QAccessibleTitleBar::QAccessibleTitleBar(QDockWidget *widget)
- : m_dockWidget(widget)
-{
-
-}
-
-QAccessibleInterface *QAccessibleTitleBar::parent() const
-{
- return new QAccessibleDockWidget(dockWidget());
-}
-
-QAccessibleInterface *QAccessibleTitleBar::child(int index) const
-{
- if (index >= 0) {
- QDockWidgetLayout *layout = dockWidgetLayout();
- int role;
- int currentIndex = 0;
- for (role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
- QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
- if (!w || !w->isVisible())
- continue;
- if (currentIndex == index)
- return QAccessible::queryAccessibleInterface(w);
- ++currentIndex;
- }
- }
- return 0;
-}
-
-int QAccessibleTitleBar::indexOfChild(const QAccessibleInterface * /*child*/) const
-{
- return -1;
-}
-
-int QAccessibleTitleBar::childCount() const
-{
- QDockWidgetLayout *layout = dockWidgetLayout();
- int count = 0;
- for (int role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
- QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
- if (w && w->isVisible())
- ++count;
- }
- return count;
-}
-
-QString QAccessibleTitleBar::text(QAccessible::Text t) const
+QString QAccessibleDockWidget::text(QAccessible::Text t) const
{
if (t == QAccessible::Name || t == QAccessible::Value) {
return qt_accStripAmp(dockWidget()->windowTitle());
}
return QString();
}
-
-QAccessible::State QAccessibleTitleBar::state() const
-{
- QAccessible::State state;
-
- QDockWidget *w = dockWidget();
- if (w->testAttribute(Qt::WA_WState_Visible) == false)
- state.invisible = true;
- if (w->focusPolicy() != Qt::NoFocus && w->isActiveWindow())
- state.focusable = true;
- if (w->hasFocus())
- state.focused = true;
- if (!w->isEnabled())
- state.disabled = true;
-
- return state;
-}
-
-QRect QAccessibleTitleBar::rect() const
-{
- bool mapToGlobal = true;
- QRect rect;
-
- if (dockWidget()->isFloating()) {
- rect = dockWidget()->frameGeometry();
- if (dockWidget()->widget()) {
- QPoint globalPos = dockWidget()->mapToGlobal(dockWidget()->widget()->rect().topLeft());
- globalPos.ry()--;
- rect.setBottom(globalPos.y());
- mapToGlobal = false;
- }
- } else {
- QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
- rect = layout->titleArea();
- }
-
- if (rect.isNull())
- return rect;
-
- if (mapToGlobal)
- rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
- return rect;
-}
-
-QAccessibleInterface *QAccessibleTitleBar::childAt(int x, int y) const
-{
- for (int i = 0; i < childCount(); ++i) {
- QAccessibleInterface *childIface = child(i);
- if (childIface->rect().contains(x,y)) {
- return childIface;
- }
- }
- return 0;
-}
-
-QObject *QAccessibleTitleBar::object() const
-{
- return 0;
-}
-
-QDockWidgetLayout *QAccessibleTitleBar::dockWidgetLayout() const
-{
- return qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
-}
-
-QDockWidget *QAccessibleTitleBar::dockWidget() const
-{
- return m_dockWidget;
-}
-
-//QString QAccessibleTitleBar::actionText(int action, Text t, int child) const
-//{
-// QString str;
-// if (child >= 1 && child <= childCount()) {
-// if (t == Name) {
-// switch (action) {
-// case Press:
-// case DefaultAction:
-// if (child == QDockWidgetLayout::CloseButton) {
-// str = QDockWidget::tr("Close");
-// } else if (child == QDockWidgetLayout::FloatButton) {
-// str = dockWidget()->isFloating() ? QDockWidget::tr("Dock")
-// : QDockWidget::tr("Float");
-// }
-// break;
-// default:
-// break;
-// }
-// }
-// }
-// return str;
-//}
-
-//bool QAccessibleTitleBar::doAction(int action, int child, const QVariantList& /*params*/)
-//{
-// if (!child || !dockWidget()->isEnabled())
-// return false;
-
-// switch (action) {
-// case DefaultAction:
-// case Press: {
-// QDockWidgetLayout *layout = dockWidgetLayout();
-// QAbstractButton *btn = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
-// if (btn)
-// btn->animateClick();
-// return true;
-// break;}
-// default:
-// break;
-// }
-
-// return false;
-//}
-
-QAccessible::Role QAccessibleTitleBar::role() const
-{
- return QAccessible::TitleBar;
-}
-
-void QAccessibleTitleBar::setText(QAccessible::Text /*t*/, const QString &/*text*/)
-{
-}
-
-bool QAccessibleTitleBar::isValid() const
-{
- return dockWidget();
-}
-
#endif // QT_NO_DOCKWIDGET
#ifndef QT_NO_CURSOR
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
index 3e982e82d6..3f50010685 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.h
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -283,31 +283,10 @@ public:
int indexOfChild(const QAccessibleInterface *child) const Q_DECL_OVERRIDE;
int childCount() const Q_DECL_OVERRIDE;
QRect rect () const Q_DECL_OVERRIDE;
-
- QDockWidget *dockWidget() const;
-};
-
-class QAccessibleTitleBar : public QAccessibleInterface
-{
-public:
- explicit QAccessibleTitleBar(QDockWidget *widget);
-
- QAccessibleInterface *parent() const Q_DECL_OVERRIDE;
- QAccessibleInterface *child(int index) const Q_DECL_OVERRIDE;
- int indexOfChild(const QAccessibleInterface *child) const Q_DECL_OVERRIDE;
- int childCount() const Q_DECL_OVERRIDE;
- QAccessibleInterface *childAt(int x, int y) const Q_DECL_OVERRIDE;
- void setText(QAccessible::Text t, const QString &text) Q_DECL_OVERRIDE;
QString text(QAccessible::Text t) const Q_DECL_OVERRIDE;
- QAccessible::Role role() const Q_DECL_OVERRIDE;
- QRect rect () const Q_DECL_OVERRIDE;
- QAccessible::State state() const Q_DECL_OVERRIDE;
- QObject *object() const Q_DECL_OVERRIDE;
- bool isValid() const Q_DECL_OVERRIDE;
-
- QPointer<QDockWidget> m_dockWidget;
QDockWidget *dockWidget() const;
+protected:
QDockWidgetLayout *dockWidgetLayout() const;
};
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index a9b21cbc81..8b151e65bd 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -674,12 +674,18 @@ void QDockWidgetPrivate::updateButtons()
= qobject_cast<QAbstractButton*>(dwLayout->widgetForRole(QDockWidgetLayout::FloatButton));
button->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarNormalButton, &opt, q));
button->setVisible(canFloat && !hideButtons);
-
+#ifndef QT_NO_ACCESSIBILITY
+ button->setAccessibleName(QDockWidget::tr("Float"));
+ button->setAccessibleDescription(QDockWidget::tr("Undocks and re-attaches the dock widget"));
+#endif
button
= qobject_cast <QAbstractButton*>(dwLayout->widgetForRole(QDockWidgetLayout::CloseButton));
button->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton, &opt, q));
button->setVisible(canClose && !hideButtons);
-
+#ifndef QT_NO_ACCESSIBILITY
+ button->setAccessibleName(QDockWidget::tr("Close"));
+ button->setAccessibleDescription(QDockWidget::tr("Closes the dock widget"));
+#endif
q->setAttribute(Qt::WA_ContentsPropagated,
(canFloat || canClose) && !hideButtons);