Usability changes for operators who cannot read the current GUI comfortably, each as its own commit.
Text zoom (accessibility)
Ctrl+plus / Ctrl+minus / Ctrl+0, also in the View menu, scale every UI text: the QSS FONT_* ladder and the application default font together, clamped to 0.8-1.6x and persisted in QSettings.
Why: the fixed 11-14px text was too small for some operators and there was no way to enlarge it.
High-contrast resize lines and controls (WCAG)
Dock/splitter gutters keep a 5px grab area but draw a 2px line with a 1px shadow instead of an invisible fill; separators measured 1.0-1.2:1 against every theme background, now >=3.25:1 (dark theme gold at 70 percent). Scrollbar handle 1.17:1 -> 3.38:1. Unselected tab text on the sky gradient 2.07:1 -> 4.71:1.
Why: resize lines, scrollbar handles and unselected tabs were below the WCAG floors (3:1 for UI components, 4.5:1 for text) and effectively invisible.
Mounted sample on the camera view
A "Currently mounted: <sample_name>" HUD line in the top-left of the sample camera, driven by the DAQ status; clears when nothing is mounted, follows the text zoom.
Why: the operator at the camera had no direct read of which sample is on the gonio.
Per-mode transmission placement
The shared "Rotation transmission" row sat at the top of BOTH the Gridscan and Rotation tabs. Now the Gridscan tab has its own "Transmission" row, and the Rotation tab moves "Rotation transmission" below the Screening block and its Run button, as the first row of the Rotation section. Screening keeps its separate "Screening transmission". Same field and value handling, only label and placement changed.
Why: one top-level row labelled "Rotation transmission" read as applying to screening too, and made no sense in the Gridscan tab.
Tooltips on the glyph count columns
The sample list's Mount/Gridscan/Screening/Rotation count column headers are glyphs to save width; hovering now shows the full name.
Why: the icons do not explain themselves.
Verified by rendering the GUI in the RHEL9 container (screenshots, xdotool-driven), WCAG contrast ratio calculations, and unit tests. Gates: ruff clean, basedpyright diff 100 percent, unit tests green, diff coverage 92 percent.
Usability changes for operators who cannot read the current GUI comfortably, each as its own commit.
1. Text zoom (accessibility)
- Ctrl+plus / Ctrl+minus / Ctrl+0, also in the View menu, scale every UI text: the QSS FONT_* ladder and the application default font together, clamped to 0.8-1.6x and persisted in QSettings.
- Why: the fixed 11-14px text was too small for some operators and there was no way to enlarge it.
2. High-contrast resize lines and controls (WCAG)
- Dock/splitter gutters keep a 5px grab area but draw a 2px line with a 1px shadow instead of an invisible fill; separators measured 1.0-1.2:1 against every theme background, now >=3.25:1 (dark theme gold at 70 percent). Scrollbar handle 1.17:1 -> 3.38:1. Unselected tab text on the sky gradient 2.07:1 -> 4.71:1.
- Why: resize lines, scrollbar handles and unselected tabs were below the WCAG floors (3:1 for UI components, 4.5:1 for text) and effectively invisible.
3. Mounted sample on the camera view
- A "Currently mounted: <sample_name>" HUD line in the top-left of the sample camera, driven by the DAQ status; clears when nothing is mounted, follows the text zoom.
- Why: the operator at the camera had no direct read of which sample is on the gonio.
4. Per-mode transmission placement
- The shared "Rotation transmission" row sat at the top of BOTH the Gridscan and Rotation tabs. Now the Gridscan tab has its own "Transmission" row, and the Rotation tab moves "Rotation transmission" below the Screening block and its Run button, as the first row of the Rotation section. Screening keeps its separate "Screening transmission". Same field and value handling, only label and placement changed.
- Why: one top-level row labelled "Rotation transmission" read as applying to screening too, and made no sense in the Gridscan tab.
5. Tooltips on the glyph count columns
- The sample list's Mount/Gridscan/Screening/Rotation count column headers are glyphs to save width; hovering now shows the full name.
- Why: the icons do not explain themselves.
Verified by rendering the GUI in the RHEL9 container (screenshots, xdotool-driven), WCAG contrast ratio calculations, and unit tests. Gates: ruff clean, basedpyright diff 100 percent, unit tests green, diff coverage 92 percent.
Generated with Claude Code (https://claude.com/claude-code)
- Ctrl+plus / Ctrl+minus / Ctrl+0 (and View menu entries) scale the QSS
FONT_* ladder and the application default font together; the scale is
clamped to 0.8-1.6 and persisted in QSettings appearance/font_scale.
- Resize gutters keep a 5px hover/drag region but paint only a 2px line
with a 1px shadow (hard-stop gradients per orientation).
- WCAG contrast fixes: separators were 1.0-1.2:1 against every theme
background, now >=3.25:1 (dark theme gold @70%); scrollbar handle
1.17:1 -> 3.38:1; unselected tab text on the sky gradient 2.07:1 ->
4.71:1 via TAB_IDLE_TEXT.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A "Currently mounted: <sample_name>" HUD line in the top-left corner of
the sample camera, driven by the DAQ status (clears when nothing is
mounted). Painted like the other camera HUDs and sized through the text
zoom, which QSS cannot reach here.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The shared "Rotation transmission" row sat in the top rows of BOTH the
Gridscan and Rotation tabs, where it read as one setting for everything
(and as nonsense in the Gridscan tab). Now each tab places its own row:
Gridscan keeps "Transmission" with the shared resolution/distance rows,
and the Rotation tab moves "Rotation transmission" below the Screening
block and its Run button, as the first row of the Rotation section -
next to the fields it actually applies to. Screening keeps its separate
"Screening transmission". No behavior change: same field, same
spreadsheet/user-value handling, only the label and the placement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sample list's Mount/Gridscan/Screening/Rotation count columns show
only a glyph in the header to save width; hovering now shows the full
name via ToolTipRole. Text headers stay tooltip-free.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
perl_d
merged commit f1f932bc7c into main2026-09-14 13:23:33 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Usability changes for operators who cannot read the current GUI comfortably, each as its own commit.
Verified by rendering the GUI in the RHEL9 container (screenshots, xdotool-driven), WCAG contrast ratio calculations, and unit tests. Gates: ruff clean, basedpyright diff 100 percent, unit tests green, diff coverage 92 percent.
Generated with Claude Code (https://claude.com/claude-code)
Coverage report (automated)
Total line + branch coverage: 51%
Diff coverage vs main: 93% (minimum 80%)
Full report: coverage artifact on this run.