Accessibility: Added accessibility text to dialogs

Qt5 provides different ways of improving the accessibility of the
application. One of these are accessibility names. This basically
assigns a given UI element a name that can be used by e.g. a screen
reader.

This commit adds lots of these names to almost all dialogs.
This commit is contained in:
Ethin Probst 2020-05-27 15:57:05 -05:00 committed by Robert Adam
parent 1d7fbd9365
commit c73f967711
23 changed files with 160 additions and 6 deletions

View File

@ -33,6 +33,22 @@ ACLEditor::ACLEditor(int channelparentid, QWidget *p) : QDialog(p) {
setupUi(this);
qwChannel->setAccessibleName(tr("Properties"));
rteChannelDescription->setAccessibleName(tr("Description"));
qleChannelPassword->setAccessibleName(tr("Channel password"));
qsbChannelPosition->setAccessibleName(tr("Position"));
qsbChannelMaxUsers->setAccessibleName(tr("Maximum users"));
qleChannelName->setAccessibleName(tr("Channel name"));
qcbGroupList->setAccessibleName(tr("List of groups"));
qlwGroupAdd->setAccessibleName(tr("Inherited group members"));
qlwGroupRemove->setAccessibleName(tr("Foreign group members"));
qlwGroupInherit->setAccessibleName(tr("Inherited channel members"));
qcbGroupAdd->setAccessibleName(tr("Add members to group"));
qcbGroupRemove->setAccessibleName(tr("Remove member from group"));
qlwACLs->setAccessibleName(tr("List of ACL entries"));
qcbACLGroup->setAccessibleName(tr("Group this entry applies to"));
qcbACLUser->setAccessibleName(tr("User this entry applies to"));
qsbChannelPosition->setRange(INT_MIN, INT_MAX);
setWindowTitle(tr("Mumble - Add channel"));
@ -77,6 +93,22 @@ ACLEditor::ACLEditor(int channelid, const MumbleProto::ACL &mea, QWidget *p) : Q
setupUi(this);
qwChannel->setAccessibleName(tr("Properties"));
rteChannelDescription->setAccessibleName(tr("Description"));
qleChannelPassword->setAccessibleName(tr("Channel password"));
qsbChannelPosition->setAccessibleName(tr("Position"));
qsbChannelMaxUsers->setAccessibleName(tr("Maximum users"));
qleChannelName->setAccessibleName(tr("Channel name"));
qcbGroupList->setAccessibleName(tr("List of groups"));
qlwGroupAdd->setAccessibleName(tr("Inherited group members"));
qlwGroupRemove->setAccessibleName(tr("Foreign group members"));
qlwGroupInherit->setAccessibleName(tr("Inherited channel members"));
qcbGroupAdd->setAccessibleName(tr("Add members to group"));
qcbGroupRemove->setAccessibleName(tr("Remove member from group"));
qlwACLs->setAccessibleName(tr("List of ACL entries"));
qcbACLGroup->setAccessibleName(tr("Group this entry applies to"));
qcbACLUser->setAccessibleName(tr("User this entry applies to"));
qcbChannelTemporary->hide();
iId = mea.channel_id();

View File

@ -129,6 +129,10 @@ ASIOInput *ASIOInput::aiSelf;
ASIOConfig::ASIOConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qcbDevice->setAccessibleName(tr("Device to use for microphone"));
qlwMic->setAccessibleName(tr("List of microphones"));
qlwSpeaker->setAccessibleName(tr("List of speakers"));
// List of devices known to misbehave or be totally useless
QStringList blacklist;
blacklist << QLatin1String("{a91eaba1-cf4c-11d3-b96a-00a0c9c7b61a}"); // ASIO DirectX

View File

@ -24,14 +24,17 @@ AboutDialog::AboutDialog(QWidget *p) : QDialog(p) {
QTextEdit *qteLicense = new QTextEdit(qtwTab);
qteLicense->setReadOnly(true);
qteLicense->setPlainText(License::license());
qteLicense->setAccessibleName(tr("License agreement"));
QTextEdit *qteAuthors = new QTextEdit(qtwTab);
qteAuthors->setReadOnly(true);
qteAuthors->setPlainText(License::authors());
qteAuthors->setAccessibleName(tr("Authors"));
QTextBrowser *qtb3rdPartyLicense = new QTextBrowser(qtwTab);
qtb3rdPartyLicense->setReadOnly(true);
qtb3rdPartyLicense->setOpenExternalLinks(true);
qtb3rdPartyLicense->setAccessibleName(tr("Third-party license agreements"));
QList<LicenseInfo> thirdPartyLicenses = License::thirdPartyLicenses();
foreach(LicenseInfo li, thirdPartyLicenses) {

View File

@ -76,6 +76,25 @@ AudioInputDialog::AudioInputDialog(Settings &st) : ConfigWidget(st) {
setupUi(this);
qcbSystem->setAccessibleName(tr("Audio system"));
qcbDevice->setAccessibleName(tr("Input device"));
qcbEcho->setAccessibleName(tr("Echo cancellation mode"));
qcbTransmit->setAccessibleName(tr("Transmission mode"));
qsDoublePush->setAccessibleName(tr("PTT lock threshold"));
qsPTTHold->setAccessibleName(tr("PTT hold threshold"));
qsTransmitHold->setAccessibleName(tr("Silence below"));
abSpeech->setAccessibleName(tr("Current speech detection chance"));
qsTransmitMin->setAccessibleName(tr("Speech above"));
qsTransmitMax->setAccessibleName(tr("Speech below"));
qsFrames->setAccessibleName(tr("Audio per packet"));
qsQuality->setAccessibleName(tr("Quality of compression (peak bandwidth)"));
qsNoise->setAccessibleName(tr("Noise suppression"));
qsAmp->setAccessibleName(tr("Maximum amplification"));
qlePushClickPathOn->setAccessibleName(tr("Transmission started sound"));
qlePushClickPathOff->setAccessibleName(tr("Transmission stopped sound"));
qsbIdle->setAccessibleName(tr("Initiate idle action after (in minutes)"));
qcbIdleAction->setAccessibleName(tr("Idle action"));
if (AudioInputRegistrar::qmNew) {
QList<QString> keys = AudioInputRegistrar::qmNew->keys();
foreach(QString key, keys) {
@ -452,6 +471,20 @@ void AudioInputDialog::on_qcbIdleAction_currentIndexChanged(int v) {
AudioOutputDialog::AudioOutputDialog(Settings &st) : ConfigWidget(st) {
setupUi(this);
qcbSystem->setAccessibleName(tr("Output system"));
qcbDevice->setAccessibleName(tr("Output device"));
qsJitter->setAccessibleName(tr("Default jitter buffer"));
qsVolume->setAccessibleName(tr("Volume of incoming speech"));
qsDelay->setAccessibleName(tr("Output delay"));
qsOtherVolume->setAccessibleName(tr("Attenuation of other applications during speech"));
qsMinDistance->setAccessibleName(tr("Minimum distance"));
qsMaxDistance->setAccessibleName(tr("Maximum distance"));
qsMaxDistVolume->setAccessibleName(tr("Minimum volume"));
qsBloom->setAccessibleName(tr("Bloom"));
qsPacketDelay->setAccessibleName(tr("Delay variance"));
qsPacketLoss->setAccessibleName(tr("Packet loss"));
qcbLoopback->setAccessibleName(tr("Loopback"));
if (AudioOutputRegistrar::qmNew) {
QList<QString> keys = AudioOutputRegistrar::qmNew->keys();
foreach(QString key, keys) {

View File

@ -279,6 +279,11 @@ AudioStats::AudioStats(QWidget *p) : QDialog(p) {
qtTick->start(50);
setupUi(this);
abSpeech->setAccessibleName(tr("Current speech detection chance"));
anwNoise->setAccessibleName(tr("Power spectrum of input signal and noise estimate"));
aewEcho->setAccessibleName(tr("Weights of the echo canceller"));
AudioInputPtr ai = g.ai;
if (ai && ai->sesEcho) {

View File

@ -43,6 +43,15 @@ AudioWizard::AudioWizard(QWidget *p) : QWizard(p) {
setupUi(this);
qcbInput->setAccessibleName(tr("Input system"));
qcbInputDevice->setAccessibleName(tr("Input device"));
qcbOutput->setAccessibleName(tr("Output system"));
qcbOutputDevice->setAccessibleName(tr("Output device"));
qsOutputDelay->setAccessibleName(tr("Output delay"));
qsMaxAmp->setAccessibleName(tr("Maximum amplification"));
skwPTT->setAccessibleName(tr("PTT key"));
qsVAD->setAccessibleName(tr("VAD level"));
// Done
qcbUsage->setChecked(g.s.bUsage);

View File

@ -15,6 +15,17 @@
BanEditor::BanEditor(const MumbleProto::BanList &msg, QWidget *p) : QDialog(p)
, maskDefaultValue(32) {
setupUi(this);
qleSearch->setAccessibleName(tr("Search"));
qleUser->setAccessibleName(tr("User"));
qleIP->setAccessibleName(tr("IP Address"));
qsbMask->setAccessibleName(tr("Mask"));
qleReason->setAccessibleName(tr("Reason"));
qdteStart->setAccessibleName(tr("Start date/time"));
qdteEnd->setAccessibleName(tr("End date/time"));
qleHash->setAccessibleName(tr("Certificate hash"));
qlwBans->setAccessibleName(tr("Banned users"));
qlwBans->setFocus();
qlBans.clear();

View File

@ -119,6 +119,17 @@ void CertView::setCert(const QList<QSslCertificate> &cert) {
CertWizard::CertWizard(QWidget *p) : QWizard(p) {
setupUi(this);
cvWelcome->setAccessibleName(tr("Current certificate"));
qleImportFile->setAccessibleName(tr("Certificate file to import"));
qlePassword->setAccessibleName(tr("Certificate password"));
cvImport->setAccessibleName(tr("Certificate to import"));
cvCurrent->setAccessibleName(tr("Current certificate"));
cvNew->setAccessibleName(tr("New certificate"));
qleExportFile->setAccessibleName(tr("File to export certificate to"));
cvExport->setAccessibleName(tr("Current certificate"));
qleEmail->setAccessibleName(tr("Email address"));
qleName->setAccessibleName(tr("Your name"));
setOption(QWizard::NoCancelButton, false);
qwpExport->setCommitPage(true);

View File

@ -23,6 +23,8 @@ QHash<QString, ConfigWidget *> ConfigDialog::s_existingWidgets;
ConfigDialog::ConfigDialog(QWidget *p) : QDialog(p) {
setupUi(this);
qlwIcons->setAccessibleName(tr("Configuration categories"));
{
QMutexLocker lock(&s_existingWidgetsMutex);
s_existingWidgets.clear();

View File

@ -958,6 +958,7 @@ void ConnectDialogEdit::on_qcbShowPassword_toggled(bool checked) {
ConnectDialog::ConnectDialog(QWidget *p, bool autoconnect) : QDialog(p), bAutoConnect(autoconnect) {
setupUi(this);
qtwServers->setAccessibleName(tr("Server list"));
#ifdef Q_OS_MAC
setWindowModality(Qt::WindowModal);
#endif

View File

@ -194,6 +194,7 @@ ShortcutTargetDialog::ShortcutTargetDialog(const ShortcutTarget &st, QWidget *pw
stTarget = st;
setupUi(this);
// Load current shortcut configuration
qcbForceCenter->setChecked(st.bForceCenter);
qgbModifiers->setVisible(true);
@ -548,6 +549,7 @@ QString ShortcutDelegate::displayText(const QVariant &item, const QLocale &loc)
GlobalShortcutConfig::GlobalShortcutConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qtwShortcuts->setAccessibleName(tr("Configured shortcuts"));
installEventFilter(this);
bool canSuppress = GlobalShortcutEngine::engine->canSuppress();

View File

@ -82,7 +82,10 @@ static LCDDeviceManager devmgr;
LCDConfig::LCDConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qtwDevices->setAccessibleName(tr("Devices"));
qsMinColWidth->setAccessibleName(tr("Minimum column width"));
qsSplitterWidth->setAccessibleName(tr("Splitter width"));
QTreeWidgetItem *qtwi;
foreach(LCDDevice *d, devmgr.qlDevices) {
qtwi = new QTreeWidgetItem(qtwDevices);

View File

@ -39,7 +39,12 @@ static ConfigRegistrar registrar(4000, LogConfigDialogNew);
LogConfig::LogConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qtwMessages->setAccessibleName(tr("Log messages"));
qsVolume->setAccessibleName(tr("TTS engine volume"));
qsbThreshold->setAccessibleName(tr("Length threshold"));
qsbMaxBlocks->setAccessibleName(tr("Maximum chat length"));
qsbChatMessageMargins->setAccessibleName(tr("Chat message marjins"));
#ifdef USE_NO_TTS
qgbTTS->setDisabled(true);
#endif

View File

@ -27,7 +27,21 @@ static ConfigRegistrar registrar(1100, LookConfigNew);
LookConfig::LookConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qsbSilentUserLifetime->setAccessibleName(tr("Silent userlifetime"));
qsbPrefixCharCount->setAccessibleName(tr("Prefix character count"));
qsbChannelHierarchyDepth->setAccessibleName(tr("Channel hierarchy depth"));
qleChannelSeparator->setAccessibleName(tr("Channel separator"));
qsbPostfixCharCount->setAccessibleName(tr("Postfix character count"));
qleAbbreviationReplacement->setAccessibleName(tr("Abbreviation replacement"));
qsbMaxNameLength->setAccessibleName(tr("Maximum name length"));
qsbRelFontSize->setAccessibleName(tr("Relative font size"));
qcbLanguage->setAccessibleName(tr("Language"));
qcbTheme->setAccessibleName(tr("Theme"));
qcbAlwaysOnTop->setAccessibleName(tr("Always on top"));
qcbChannelDrag->setAccessibleName(tr("Channel dragging"));
qcbExpand->setAccessibleName(tr("Automatically expand channels when"));
qcbUserDrag->setAccessibleName(tr("User dragging behavior"));
#ifndef Q_OS_MAC
if (! QSystemTrayIcon::isSystemTrayAvailable())
#endif

View File

@ -160,7 +160,9 @@ MainWindow::MainWindow(QWidget *p) : QMainWindow(p) {
createActions();
setupUi(this);
setupGui();
qtvUsers->setAccessibleName(tr("Channels and users"));
qteLog->setAccessibleName(tr("Activity log"));
qteChat->setAccessibleName(tr("Chat message"));
connect(qmUser, SIGNAL(aboutToShow()), this, SLOT(qmUser_aboutToShow()));
connect(qmChannel, SIGNAL(aboutToShow()), this, SLOT(qmChannel_aboutToShow()));
connect(qmListener, SIGNAL(aboutToShow()), this, SLOT(qmListener_aboutToShow()));

View File

@ -26,6 +26,12 @@ static ConfigRegistrar registrar(1300, NetworkConfigNew);
NetworkConfig::NetworkConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qcbType->setAccessibleName(tr("Type"));
qleHostname->setAccessibleName(tr("Hostname"));
qlePort->setAccessibleName(tr("Port"));
qleUsername->setAccessibleName(tr("Username"));
qlePassword->setAccessibleName(tr("Password"));
}
QString NetworkConfig::title() const {

View File

@ -27,7 +27,7 @@ OverlayEditor::OverlayEditor(QWidget *p, QGraphicsItem *qgi, OverlaySettings *os
qgiPromote(qgi),
oes(g.s.os) {
setupUi(this);
qsZoom->setAccessibleName(tr("Zoom level"));
os = osptr ? osptr : &g.s.os;
connect(qdbbBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply()));

View File

@ -74,7 +74,7 @@ struct PluginFetchMeta {
PluginConfig::PluginConfig(Settings &st) : ConfigWidget(st) {
setupUi(this);
qtwPlugins->setAccessibleName(tr("Plugins"));
qtwPlugins->header()->setSectionResizeMode(0, QHeaderView::Stretch);
qtwPlugins->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);

View File

@ -7,6 +7,7 @@
TextMessage::TextMessage(QWidget *p, QString title, bool bChannel) : QDialog(p) {
setupUi(this);
rteMessage->setAccessibleName(tr("Message"));
if (!bChannel)
qcbTreeMessage->setHidden(true);
setWindowTitle(title);

View File

@ -13,6 +13,7 @@
Tokens::Tokens(QWidget *p) : QDialog(p) {
setupUi(this);
qlwTokens->setAccessibleName(tr("Tokens"));
qbaDigest = g.sh->qbaDigest;
QStringList tokens = g.db->getTokens(qbaDigest);

View File

@ -22,6 +22,10 @@ UserEdit::UserEdit(const MumbleProto::UserList &userList, QWidget *p)
, m_filter(new UserListFilterProxyModel(this)) {
setupUi(this);
qlSearch->setAccessibleName(tr("Search"));
qcbInactive->setAccessibleName(tr("Inactive for"));
qsbInactive->setAccessibleName(tr("Inactive for"));
qtvUserList->setAccessibleName(tr("User list"));
const int userCount = userList.users_size();
setWindowTitle(tr("Registered users: %n account(s)", "", userCount));

View File

@ -52,6 +52,8 @@ UserLocalVolumeDialog::UserLocalVolumeDialog(unsigned int sessionId,
, m_clientSession(sessionId)
, m_qmUserVolTracker(qmUserVolTracker) {
setupUi(this);
qsUserLocalVolume->setAccessibleName(tr("User volume"));
qsbUserLocalVolume->setAccessibleName(tr("User volume"));
ClientUser *user = ClientUser::get(sessionId);
if (user) {

View File

@ -20,6 +20,9 @@ VoiceRecorderDialog::VoiceRecorderDialog(QWidget *p) : QDialog(p), qtTimer(new Q
qtTimer->setObjectName(QLatin1String("qtTimer"));
qtTimer->setInterval(200);
setupUi(this);
qcbFormat->setAccessibleName(tr("Output format"));
qleTargetDirectory->setAccessibleName(tr("Target directory"));
qleFilename->setAccessibleName(tr("Filename"));
qleTargetDirectory->setText(g.s.qsRecordingPath);
qleFilename->setText(g.s.qsRecordingFile);