From f86ffab4023dbba092c7abdf00242f17428d86f5 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Fri, 19 Oct 2012 15:08:42 +0200 Subject: 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 --- .../accessible/widgets/qaccessiblewidgets.cpp | 228 ++++----------------- .../accessible/widgets/qaccessiblewidgets.h | 23 +-- src/widgets/widgets/qdockwidget.cpp | 10 +- 3 files changed, 44 insertions(+), 217 deletions(-) (limited to 'src') 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(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(child->object())); } QRect QAccessibleDockWidget::rect() const @@ -610,190 +629,13 @@ QDockWidget *QAccessibleDockWidget::dockWidget() const return static_cast(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(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(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(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 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(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 (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); -- cgit v1.2.3