diff --git a/src/mumble/ConfigDialog.cpp b/src/mumble/ConfigDialog.cpp index 9572cd36756..fe2013b665d 100644 --- a/src/mumble/ConfigDialog.cpp +++ b/src/mumble/ConfigDialog.cpp @@ -7,6 +7,7 @@ #include "AudioInput.h" #include "AudioOutput.h" +#include "InlineWidgets.h" #include "Global.h" #include @@ -77,6 +78,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->installEventFilter(new OverrideTabOrderFilter(restoreAllButton, applyButton)); if (!Global::get().s.qbaConfigGeometry.isEmpty()) { #ifdef USE_OVERLAY @@ -84,6 +86,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 +114,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 +202,45 @@ 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; + } + + setTabOrder(cancelButton, okButton); + setTabOrder(okButton, 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); } 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;