docs/dev/Accessibility.md
In the software context, accessibility features (often shortened to "a11y") are considerations and tools meant to reduce the hassle of running a specific application by users with disabilities.
Most often, you will find features specifically crafted or tweaked for visually impaired users, but other disabilities such as cognitive or motor impairments should also be considered.
The most basic approach to accessibility in software is to use empathy. Ask yourself: "If I had %disability%, would I still be able to use this application without much effort?". If the answer is "No", you might want to start investigating on how to improve that situation.
Some "accessibility features" are not even that special, but more of a common sense decision. For example:
If your application needs to function in a way that is inherently inaccessible to some users, consider offering an alternative accessible way for that function or a similar feature.
Make your application keyboard navigable for those, who struggle using a mouse for various reasons.
For some disabilities, external assistive tools exist which help to make any application more accessible. A prime example for such a tool is a screen reader mostly used by visually impaired users. Screen readers are able to read UI elements on the screen, once the users selects them with the mouse or the keyboard. To make screen readers work though, sometimes the developer needs to add additional information. That information is processed by the screen reader to give context to certain UI elements, which are normally communicated visually.
Qt, the UI toolkit Mumble uses, provides accessibility features
and they are fine for 90% of use-cases. The accessibleName and accessibleDescription field found
in every QWidget help to convey much of the needed information for screen readers.
However, in certain situations you may find that Qt does not offer neat ways to implement everything that
is necessary for a good, accessible experience. In those cases, especially when designing custom or
complex QWidgets, you will find yourself tinkering and testing quite a while until the result is
somewhat acceptable.
Feel free to ask for advice at any time.
When changing a UI element or implementing a new one, make sure that the changes meet all the following criteria:
The change MUST NOT break tab navigation
The change itself MUST be keyboard navigable
All UI dialogs MUST have a sensible tab order
Interactive UI elements MUST have an accessibleName
accessibleName. That is usually enough!accessibleName of buttons and other elements of inherent labels ONLY when there is any contextual advantageaccessibleNameaccessibleNameLabeled interactive UI elements MUST correctly set their buddy label
accessibleName. This is called a "buddy" Interactive UI elements SHOULD have an accessibleDescription, when it makes sense to do so
accessibleDescription field can be used to explain context to a user that is otherwise only communicated visuallyaccessibleDescription field can be used to explain a feature (e.g. voice activity detection) that is otherwise harder to grasp by just reading the nameaccessibleDescription field as the tooltip or "What's this?" for screen readers. Some screen readers might even fall back to the tooltip, if no description is set Abbreviations that are application specific MUST NOT be used in accessibleName or accessibleDescription
accessibleName and accessibleDescriptions MUST be set in the .ui files, e.g. using the QtCreator
Additional visual context MUST be made available to screen reader users
ServerInformation.ui uses the AccessibleGroupBox class instead of QGroupBox to solve that problemaccessibleDescription of another element New status for users or channels MUST be made accessible using the userToText and channelToText functions in Accessibility.cpp
New actions MUST be made available through a menu item. Only adding a toolbar button is not enough. The toolbar is not accessible.
All menu items MUST follow state-of-the-art design concepts
Sliders MAY use the SemanticSlider class as a base to enhance the screenreading experience
UI elements MAY inform the user about other UI elements
This text and checklist was written with the best intentions and the current understanding of accessibility by the development team. This should in no way be considered final or absolute and there is always room for improvement. Always use common sense when developing.
Also, feel free to submit corrections, additions or updates to this text or checklist. As technology changes, our current understanding might become outdated at some point.