From e73d38ae2fd49f63a539696342efba669238f767 Mon Sep 17 00:00:00 2001 From: Hartmnt Date: Thu, 29 Jun 2023 09:48:53 +0000 Subject: [PATCH] FIX(a11y): Improve accessibility of configuration dialog --- src/mumble/ConfigDialog.cpp | 172 ++++++++++++++++++++++++++++++++++++ src/mumble/ConfigDialog.h | 2 + 2 files changed, 174 insertions(+) diff --git a/src/mumble/ConfigDialog.cpp b/src/mumble/ConfigDialog.cpp index 9572cd36756..7eea113e131 100644 --- a/src/mumble/ConfigDialog.cpp +++ b/src/mumble/ConfigDialog.cpp @@ -13,9 +13,12 @@ #include #include #include +#include #include #include +#include + // init static member fields QMutex ConfigDialog::s_existingWidgetsMutex; @@ -62,6 +65,8 @@ ConfigDialog::ConfigDialog(QWidget *p) : QDialog(p) { applyButton->setToolTip(tr("Apply changes")); applyButton->setWhatsThis(tr("This button will immediately apply all changes.")); + pageButtonBox->setFocusPolicy(Qt::NoFocus); + QPushButton *resetButton = pageButtonBox->addButton(QDialogButtonBox::Reset); resetButton->setToolTip(tr("Undo changes for current page")); resetButton->setWhatsThis( @@ -77,6 +82,7 @@ ConfigDialog::ConfigDialog(QWidget *p) : QDialog(p) { QPushButton *restoreAllButton = pageButtonBox->addButton(tr("Defaults (All)"), QDialogButtonBox::ResetRole); restoreAllButton->setToolTip(tr("Restore all defaults")); restoreAllButton->setWhatsThis(tr("This button will restore the defaults for all settings.")); + //restoreAllButton->setFocusPolicy(Qt::NoFocus); if (!Global::get().s.qbaConfigGeometry.isEmpty()) { #ifdef USE_OVERLAY @@ -84,6 +90,9 @@ ConfigDialog::ConfigDialog(QWidget *p) : QDialog(p) { #endif restoreGeometry(Global::get().s.qbaConfigGeometry); } + + updateTabOrder(); + qlwIcons->setFocus(); } void ConfigDialog::addPage(ConfigWidget *cw, unsigned int idx) { @@ -109,6 +118,7 @@ void ConfigDialog::addPage(ConfigWidget *cw, unsigned int idx) { qsa->setFrameShape(QFrame::NoFrame); qsa->setWidgetResizable(true); qsa->setWidget(cw); + qsa->setFocusPolicy(Qt::NoFocus); qhPages.insert(cw, qsa); qswPages->addWidget(qsa); } else { @@ -196,7 +206,169 @@ void ConfigDialog::on_qlwIcons_currentItemChanged(QListWidgetItem *current, QLis QWidget *w = qhPages.value(qmIconWidgets.value(current)); if (w) qswPages->setCurrentWidget(w); + + updateTabOrder(); + } +} + +void ConfigDialog::updateTabOrder() { + //QPushButton *okButton = dialogButtonBox->button(QDialogButtonBox::Ok); + //QPushButton *cancelButton = dialogButtonBox->button(QDialogButtonBox::Cancel); + QPushButton *applyButton = dialogButtonBox->button(QDialogButtonBox::Apply); + QPushButton *resetButton = pageButtonBox->button(QDialogButtonBox::Reset); + QPushButton *restoreButton = pageButtonBox->button(QDialogButtonBox::RestoreDefaults); + QPushButton *restoreAllButton = static_cast< QPushButton * >(pageButtonBox->buttons().last()); + + QWidget *contentFocusWidget = qswPages; + + ConfigWidget *page; + QScrollArea *qsa = qobject_cast< QScrollArea * >(qswPages->currentWidget()); + if (qsa) { + page = qobject_cast< ConfigWidget * >(qsa->widget()); + } else { + page = qobject_cast< ConfigWidget * >(qswPages->currentWidget()); + } + + if (page) { + contentFocusWidget = page; + /* + if (contentFocusWidget->nextInFocusChain()) { + contentFocusWidget = contentFocusWidget->nextInFocusChain(); + } + while (contentFocusWidget + && (qobject_cast< QGroupBox * >(contentFocusWidget) || contentFocusWidget->focusPolicy() == Qt::NoFocus) + && contentFocusWidget->nextInFocusChain()) { + contentFocusWidget = contentFocusWidget->nextInFocusChain(); + }*/ + } + + if (contentFocusWidget) { + qDebug() << contentFocusWidget->accessibleName() << " " << contentFocusWidget->metaObject()->className(); + } else { + qDebug() << "No contentFocusWidget"; + } + + qDebug() << "page is: " << qswPages->currentWidget()->accessibleName() << " " + << qswPages->currentWidget()->metaObject()->className(); + + /** + setTabOrder(cancelButton, okButton); + setTabOrder(okButton, qlwIcons); + **/ + setTabOrder(dialogButtonBox, qlwIcons); + setTabOrder(qlwIcons, contentFocusWidget); + /**if (resetButton && restoreButton && restoreAllButton) { + setTabOrder(contentFocusWidget, resetButton); + setTabOrder(resetButton, restoreButton); + setTabOrder(restoreButton, restoreAllButton); + setTabOrder(restoreAllButton, applyButton); + } else { + setTabOrder(contentFocusWidget, applyButton); + } + setTabOrder(applyButton, cancelButton); + **/ + setTabOrder(contentFocusWidget, pageButtonBox); + setTabOrder(pageButtonBox, dialogButtonBox); + + + + if (resetButton && resetButton->previousInFocusChain()) { + qDebug() << "previous reset is: " << resetButton->previousInFocusChain()->accessibleName() << " " + << resetButton->previousInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(resetButton->previousInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "previous reset is nullptr"; + } + + if (resetButton && resetButton->nextInFocusChain()) { + qDebug() << "after reset is: " << resetButton->nextInFocusChain()->accessibleName() << " " + << resetButton->nextInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(resetButton->nextInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "After reset is nullptr"; + } + + if (restoreButton && restoreButton->previousInFocusChain()) { + qDebug() << "previous defaults is: " << restoreButton->previousInFocusChain()->accessibleName() << " " + << restoreButton->previousInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(restoreButton->previousInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "previous defaults is nullptr"; + } + + if (restoreButton && restoreButton->nextInFocusChain()) { + qDebug() << "after defaults is: " << restoreButton->nextInFocusChain()->accessibleName() << " " + << restoreButton->nextInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(restoreButton->nextInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "After defaults is nullptr"; + } + + + if (restoreAllButton && restoreAllButton->previousInFocusChain()) { + qDebug() << "previous defaultsall is: " << restoreAllButton->previousInFocusChain()->accessibleName() << " " + << restoreAllButton->previousInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(restoreAllButton->previousInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "previous defaultsall is nullptr"; } + + if (restoreAllButton && restoreAllButton->nextInFocusChain()) { + qDebug() << "after defaultsall is: " << restoreAllButton->nextInFocusChain()->accessibleName() << " " + << restoreAllButton->nextInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(restoreAllButton->nextInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "After defaultsall is nullptr"; + } + + if (applyButton && applyButton->previousInFocusChain()) { + qDebug() << "previous apply is: " << applyButton->previousInFocusChain()->accessibleName() << " " + << applyButton->previousInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(applyButton->previousInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "previous apply is nullptr"; + } + + if (applyButton && applyButton->nextInFocusChain()) { + qDebug() << "after apply is: " << applyButton->nextInFocusChain()->accessibleName() << " " + << applyButton->nextInFocusChain()->metaObject()->className(); + + QAbstractButton *button = qobject_cast< QAbstractButton * >(applyButton->nextInFocusChain()); + if(button){ + qDebug() << button->text(); + } + } else { + qDebug() << "After apply is nullptr"; + } + } void ConfigDialog::updateListView() { diff --git a/src/mumble/ConfigDialog.h b/src/mumble/ConfigDialog.h index 4fdd7202731..b0196e48367 100644 --- a/src/mumble/ConfigDialog.h +++ b/src/mumble/ConfigDialog.h @@ -17,6 +17,8 @@ class ConfigDialog : public QDialog, public Ui::ConfigDialog { private: Q_OBJECT Q_DISABLE_COPY(ConfigDialog) + + void updateTabOrder(); protected: static QMutex s_existingWidgetsMutex; static QHash< QString, ConfigWidget * > s_existingWidgets;