tldr. We’re working to make Avogadro as accessible as possible. Comments welcome on priorities, defaults, and anything we’ve missed — especially from people who use screen readers, keyboard-only input, magnification, or have color-vision deficiencies.
Why
Avogadro is used in teaching as well as research, so students and instructors with disabilities need to be able to use it. Today, several parts of the app are hard or impossible to use:
- without a mouse
- with a screen reader
- for users with color-vision deficiency (CVD) — about 8% of men and 0.5% of women
- with limited dexterity, or with a one-button pointer
- for users who are sensitive to on-screen motion
Guiding principles
- Color is never the only cue. Selection, errors, interaction types, and similar states also need a shape, line style, label, or text.
- Every action is reachable from the keyboard, and the key bindings can be discovered from inside the app.
- Scientific conventions stay the default. CPK/Jmol element colors and red/blue orbital lobes remain the defaults. Accessible alternatives are opt-in presets, not silent changes.
- Follow the platform. Use standard key sequences and accessibility methods, rather than custom one-offs.
What already works well (Good News)
I ran some accessibility checks.
- Orbitals: the red/blue lobe default stays distinct under every type of CVD.
- Colormaps: Viridis, Cividis, Magma and Balance are already available for surfaces and color-by-property.
- Labels in the 3D view: the measure and draw tools pick a label colour that contrasts with the background.
- High-DPI: high-DPI scaling is handled in rendering
- Camera: the camera can be fully controlled from the keyboard:
- arrows or HJKL/WASD rotate
- Shift+arrows tilt and zoom
- Ctrl+arrows pan
- Alt makes each step 6× larger.
- Ctrl+arrows drive the camera from anywhere in the main window, except text fields.
- Tools: the first nine tools have Ctrl+1 to Ctrl+9 shortcuts, and switching tools moves keyboard focus to the 3D view.
- Draw and Template tools: you can type element symbols, bond orders, formal charges, coordination numbers and ligand/group codes.
- Moving atoms: the manipulator moves and rotates the selection with arrows, Shift and Ctrl+Shift.
- Selecting without a mouse:
- the Select menu (Select by Atom Index, by Element, by Residue, Enlarge/Shrink);
- selecting rows in the property tables selects the matching atoms.
- Periodic table dialog: full arrow-key navigation and typed symbols.
- One-button navigation: Shift+drag zooms and tilts, Ctrl/Cmd+drag pans, and Alt+drag gives trackball rotation, so you don’t need a middle or right button.
- 3D-mouse support: 3Dconnexion devices are supported in avogadroapp (on Mac and Windows), giving another input option.
- Plugin forms: forms generated from Python-plugin JSON use QFormLayout::addRow(label, widget) (jsonwidget.cpp:506), which links each label to its field automatically.
- Tactile output: PLY, VRML and POV-Ray export already make 3D-printed and other physical models possible.
Findings
tldr We really need a “Settings” dialog that includes accessibility options, e.g. alternate element colors.
1. Color and color-vision deficiency
Default element colors: As a rough guide, pairs below about 15 are hard to tell apart on small shaded spheres.
As a rough guide, pairs below about 15 are hard to tell apart on small shaded spheres.
| Pair | Normal | Protan | Deutan | Tritan |
|---|---|---|---|---|
| P / Cl | 124 | 34 | 11 | 118 |
| S / Cl | 62 | 14 | 23 | 58 |
| S / Mg | 45 | 6 | 13 | 42 |
| O / P | 40 | 26 | 14 | 41 |
| F / H | 25 | 5 | 10 | 32 |
| O / Cl | 163 | 60 | 22 | 149 |
Other colour problems
- Selection is shown by colour only, and the colour is hard-coded.
- Ball-and-stick draws a pure blue halo (
ballandstick.cpp:233), which nearly vanishes on nitrogen (48,80,255). - The selection tool uses a separate hard-coded yellow (
selectiontool.cpp:246).
- Ball-and-stick draws a pure blue halo (
- Default colormap is Turbo (
applycolors.cpp:137, 208). It is not perceptually uniform and creates false bands under CVD. - Non-covalent interaction lines default to green for halogen bonds and orange for chalcogen bonds (
noncovalent.cpp:66-72). These look the same to deutans, and the interaction type is shown only by colour. - Errors shown only as red text:
filebrowsewidget.cpp:149andunitcelldialog.cpp:344. - Hard-coded text colours with poor contrast or no dark-mode support. Contrast is measured as \frac{L_1 + 0.05}{L_2 + 0.05}, and WCAG AA asks for at least 4.5:1.
- Comments in the GAMESS input highlighter use
Qt::greenabout 1.4:1 on white. - The measure warning colour (200,120,0) is about 3.4:1 on white.
- Comments in the GAMESS input highlighter use
- Labels and the contrast helper:
- The label plugin defaults to white, so labels are invisible on light backgrounds.
contrastColor()inverts each RGB channel separately rather than using luminance, so contrast can be weak on some mid-tone backgrounds.
2. Low vision
- Label size is set separately in each display plugin. There is no global minimum font size or “large text” setting for the 3D view. (Ideally this can be set via the operating system default)
- There is no high-contrast preset for the 3D scene that sets background, label and selection colours together.
3. Keyboard control
- No keyboard way to point at an atom or bond. Every tool that works on a specific atom or bond needs a mouse: Draw, Template, Bond-centric, Measure, Align, Label. This is the biggest gap, and it also blocks screen-reader use.
- Align and Label tools have no shortcut. The app only assigns Ctrl+1 to Ctrl+9 by tool priority (
avogadroapp mainwindow.cpp:3745).- Each plugin also hard-codes its own “Ctrl+N” string in its tooltip (for example
navigator.cpp:47), so the tooltips will be wrong if the tool order changes.
- Each plugin also hard-codes its own “Ctrl+N” string in its tooltip (for example
- The 3D view can’t be reached with Tab.
GLWidgetusesQt::ClickFocus(glwidget.cpp:32). Keyboard users can only get there by switching tools (Ctrl+N), and nothing shows that the view has focus. - The Draw and Template tools swallow every printable key (
editor.cpp:353,templatetool.cpp:224). They accept the event even when the key isn’t a valid symbol or digit, and even when the layer is locked.- As a result, the HJKL/WASD camera keys don’t work while these tools are active; only the arrows do.
- Changing this is probably not right, because H and S are element symbols, but it should be documented.
- Step sizes are inconsistent.
- Auto-optimize uses a fixed 0.1 Å step and ignores Alt.
- Manipulator uses 0.1 Å, or 0.5 Å with Alt.
- Auto-optimize also emits a molecule-changed signal even for keys it ignores (
autoopt.cpp:851).
- Escape does nothing. No tool handles it: there is no way to cancel a drawing drag, clear a measurement, or abandon a label edit from the keyboard.
- Key bindings can’t be discovered from the app. None of the tool keys (camera keys, typing symbols,
[/], Space in the animation tool) are shown in the tool panels or tooltips. - Docks: There is no shortcut to move between the main docks (Tool, Display Types, Display Type Settings, Files, Layers), such as F6 or Ctrl+F6.
- The Layers dock’s icon columns (visibility, lock, delete) are probably not reachable by keyboard. The tree uses
SelectRows, so ←/→ don’t move between columns, andactivatedfires for whichever column is current. - Charts (
qtgui/chartwidget, JKQTPlotter) zoom and pan only with the mouse. Spectra dialogs have axis-range fields as a workaround. We should confirm the chart’s context menu (copy data, export) can be opened with the keyboard.
4. Screen Readers
- No accessibility APIs are used: there is no
setAccessibleName,accessibleDescriptionorQAccessible*anywhere inavogadrolibs. - Dialogs: of 46
.uifiles, only about 7 link their labels to their input fields with “buddies”, and none set accessible names. Many spin boxes and combo boxes will be announced with no label. - The 3D view is a plain
QOpenGLWidgetwith no accessible description. A screen reader hears nothing about the molecule. What should it say? - The property tables (atoms, bonds, angles, …) are standard Qt item views. They are the most practical non-visual view of a structure, and they already sync their selection with the 3D view.
5. Motor and dexterity
This section covers pointer users with limited precision, strength or endurance: trackpad, one-button mouse, head or eye pointer, switch access, and voice control.
- Typing has a 2-second limit. The draw tool, template tool and periodic table only keep typed characters for 2 seconds (
editor.cpp:360,templatetool.cpp:245,periodictableview.cpp:71). Users of sticky keys, switch scanning or on-screen keyboards may not finish typing “Cl” in time. WCAG 2.2.1 asks for time limits to be adjustable. - Some actions can only be done by dragging: WCAG 2.5.7 asks for a single-pointer, non-drag alternative.
- bonding two existing atoms;
- rubber-band selection;
- bond-centric rotation and stretching;
- dragging atoms in the manipulator and auto-optimize tools.
- Deleting one atom in the draw tool is right-click only. Selecting it and pressing Delete works but takes more steps:
- On macOS this relies on the system’s Ctrl+click → right-click emulation.
- Three tools still have
/// @todo Use modifier keys on mac(editor.cpp:426,navigator.cpp:384,templatetool.cpp:398).
- Small click targets. Clicking casts a single ray through one pixel (
GLRenderer::hits,glrenderer.cpp:282) with no tolerance. Small atoms, thin bonds and wireframe or line displays are hard to hit. WCAG 2.5.8 sets a minimum target size. - Voice control (Dragon, macOS Voice Control, Windows Voice Access) finds controls by their accessible names, so the dialog fixes in section 4 help voice users too.
Open questions for the community
- Color-blind-safe element scheme. Which palette should we use? Options include an Okabe–Ito-based scheme for common organic and biological elements (C, H, N, O, S, P, halogens), or adjusting only the pairs that collide (P/Cl, S/Cl, O/P, F/H).
- Colormap default. Should we change it (Turbo → Viridis) for everyone, or only for new installs? Have a better suggestion? (I’d personally prefer a different default.)
- Selection highlight. What should the new default look like: an outline, a different color, or both?
- Atom-cursor keys. Which keys? Tab/Shift+Tab conflicts with normal focus movement out of the view;
,/.or[/]are possible alternatives. - Missing workflows. Are there workflows we’ve missed, such as building peptides or DNA, crystal tools, or input generators, that need keyboard or screen-reader review?
- Typing timeout. Should the 2-second limit become a setting, or should typed input simply end with Enter or Escape?
- Reduce motion. Should vibrations start paused by default, or only when reduce-motion is on?
- Describe molecule. What should a text description contain to be useful in teaching? We’d especially like input from blind chemists and their instructors.
- Conformance target. WCAG 2.2 AA (adapted), EN 301 549, or something informal to start with?