Theme overhaul: sunrise/sunset/bluebird themes and camera overlay rework #130

Merged
duan_j merged 26 commits from feat/theme-overhaul into collapsable-and-adaptive 2026-08-11 10:24:48 +02:00
26 Commits
Author SHA1 Message Date
duan_jandClaude Fable 5 4d845aa568 style: visual and interaction polish
CI / lint (push) Skipped
CI / test (3.11) (push) Skipped
CI / test (3.12) (push) Skipped
CI / test (3.13) (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m23s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m34s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m37s
CI / test (3.11) (pull_request) Successful in 1m54s
CI / test (3.13) (pull_request) Successful in 1m51s
CI / test (3.12) (pull_request) Successful in 1m57s
CI / test-with-coverage (pull_request) Successful in 1m53s
CI / coverage-analysis (pull_request) Successful in 3s
CI / lint (pull_request) Successful in 2m39s
Windowed startup at 50%x70% instead of maximized; overlay legend now
defaults off (it covers the camera image); square slider handles with
grip-line PNG assets (the round handle clipped flat); warmer sunrise
gradient bottom; abr/beam-mark layout tweaks; hover cues on the
beamline-state entries; DPI/font-aware pop-out titlebar icons; the
out-of-date Tutorial menu entries are hidden until content is redone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 09:48:56 +02:00
duan_jandClaude Fable 5 c8dbf7f8a4 feat: reference-tools position column and state-driven default sample tab
The reference table gets a display-only '#' column (like the Dewar
list) with sort indices shifted around it; the sample dock switches to
the Auxiliary puck tab on entering alignment/maintenance states and
back to Dewar elsewhere, only on state transitions so a manual choice
sticks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 09:47:06 +02:00
duan_jandClaude Fable 5 612bc60b89 fix: dark-mode legibility for the status bar, sample tables, and surfaces
Status-bar flags get status_colors(theme) (Mocha variants on Sunset) via
a new set_theme; sample tables stop hard-filling rows WHITE and pin dark
ink on tinted rows via ForegroundRole; dewar tab and log panel get solid
dark surfaces (transparent renders black on the non-composited X11
container); developer help cards go square for the same reason.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 09:45:55 +02:00
duan_jandClaude Fable 5 c95e652dfb refactor: shared busy-badge renderer for camera and axis video views
draw_busy_badge in busy_overlay renders the title+subtext pill once;
the sample camera and axis video overlays both delegate to it instead
of keeping diverging copies. The axis panel's dot+label status pill and
its per-theme QSS go away with it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 09:38:46 +02:00
duan_jandClaude Fable 5 a9165a604c feat: float alert banners over content as anchored toasts
Banners in the root layout shifted the whole UI on every message; now
they float over the content root (repositioned on resize) and the baton
toast anchors as a compact pill under the camera view, auto-clearing in
4s instead of 10s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 09:26:52 +02:00
duan_jandClaude Fable 5 e572a439b5 feat: merge Automation progress and Console log into one Information dock
The two tabified bottom docks left their switcher tabs stranded at the
window bottom; one Information dock with proper tabs mirrors the Sample
List dock's layout. LogDock becomes the LogPanel widget with mirror
views for the pop-out and a reveal_requested signal so the owner
controls visibility (Ctrl+Shift+L, notifications).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 17:09:18 +02:00
duan_jandClaude Fable 5 669ba90317 test: cover the camera overlays, theme migration, layout heal, and splash
CI / lint (push) Skipped
CI / test (3.11) (push) Skipped
CI / test (3.12) (push) Skipped
CI / test (3.13) (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
CI / test (3.11) (pull_request) Successful in 1m22s
CI / test (3.12) (pull_request) Successful in 1m25s
CI / test (3.13) (pull_request) Successful in 1m25s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m26s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m38s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m41s
CI / test-with-coverage (pull_request) Successful in 2m4s
CI / coverage-analysis (pull_request) Successful in 3s
CI / lint (pull_request) Successful in 2m44s
Diff coverage vs main was 77%, under the 80% CI gate; the new camera
help/error/badge code and the theme+layout main_window paths were the
uncovered bulk. Locally: 82%.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 10:56:17 +02:00
duan_jandClaude Fable 5 2317aca442 style: swap the splash banner text to the white variant
Copied from aare_banner_w.svg; the black glyphs vanished on the dark
splash panel, the white fills read on it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 10:47:57 +02:00
duan_jandClaude Fable 5 52b812bada style: narrow the manual-resize press state for the pyright gate
CI / lint (push) Skipped
CI / test (3.11) (push) Skipped
CI / test (3.12) (push) Skipped
CI / test (3.13) (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
CI / test (3.13) (pull_request) Successful in 1m1s
CI / test (3.12) (pull_request) Successful in 1m6s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m6s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m11s
CI / test (3.11) (pull_request) Successful in 1m27s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m26s
CI / test-with-coverage (pull_request) Successful in 1m39s
CI / coverage-analysis (pull_request) Failing after 4s
CI / lint (pull_request) Successful in 3m2s
The diff-vs-main basedpyright gate flags QRect(self._press_geom) because
only _press_global was narrowed; both are set together in
mousePressEvent, so the extra check is a no-op at runtime.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 10:23:52 +02:00
duan_jandClaude Fable 5 8fed60e73b docs: note the spreadsheet log-spam TODO in daq_worker
CI / lint (push) Skipped
CI / test (3.11) (push) Skipped
CI / test (3.12) (push) Skipped
CI / test (3.13) (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
CI / test (3.11) (pull_request) Successful in 1m6s
CI / test (3.13) (pull_request) Successful in 1m11s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m12s
CI / test (3.12) (pull_request) Successful in 1m23s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m18s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m35s
CI / test-with-coverage (pull_request) Successful in 1m43s
CI / coverage-analysis (pull_request) Failing after 3s
CI / lint (pull_request) Failing after 2m42s
load_spreadsheet/load_reference_tools log a GET they never send every
~12.5s poll while base_url is None; fix later by demoting to debug or
logging once on the None->set edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 09:45:07 +02:00
duan_jandClaude Fable 5 30a0c19736 fix: heal poisoned all-docks-hidden layout and restore layout before watch-only close
A window state saved during the watch-only fold restores as every dock
hidden (the vanished-Sample-List-on-restart bug). Fall back to the
default layout when a restore comes back all-hidden, and put the
pre-watch layout back before saving state in closeEvent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 09:44:53 +02:00
duan_jandClaude Fable 5 262260b956 feat: camera help overlay, camera-error message, and session badge hover feedback
The controls cheatsheet gets its own help badge/overlay instead of
riding the detection legend; the camera-unavailable state now draws the
actual error reason bottom-center (pushed from MainWindow to all three
camera views); the session badge shows hover feedback and the vacant
overlay reads 'In viewing mode' with a grab-baton hint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 09:43:30 +02:00
duan_jandClaude Fable 5 ac6a651414 feat: rename themes to sunrise/sunset, add bluebird theme with Catppuccin-Latte light palette
Sunrise/sunset replace the original/portrait tokens (QSettings values
migrate on restore); bluebird is sunrise with a flat sky. The light
palette is repainted with Catppuccin Latte across alerts, chips, cards,
log, splash, inputs, and status flags, plus button/input height caps
and hover rules in the QSS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 09:41:20 +02:00
duan_jandClaude Fable 5 d1ebc6cf9e style: clear the basedpyright gate for the new-code lines
Narrow QApplication.instance() before use, wrap the theme QSettings
read in str(), hand QPropertyAnimation a real QByteArray, and declare
the lazily-set watch-mode attributes on the class.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 10:08:23 +02:00
duan_jandClaude Fable 5 5f1141c8a5 style: cool the sunset gradient base
The warm glow at the bottom of the dusk sky didn't fit — stay in the
blue range.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 18:42:58 +02:00
duan_jandClaude Fable 5 64a71a9ec7 test: inline smoke check for the wheel guard
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 18:42:14 +02:00
duan_jandClaude Fable 5 7b547309e2 style: small panel polish
Energy unit moves from spinbox suffix to the label (the suffix ate
field width next to the new spin arrows); samcam exposure/gain get a
3:2 stretch so 3-decimal exposure isn't cut; the Exp. Config. tab bar
gets a BANNER_TAB_GAP spacer under its banner.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 18:42:04 +02:00
duan_jandClaude Fable 5 e01f90bae8 style: relabel theme entries, tuck prototype views into the View menu
Legacy/Portrait themes become Sunrise (default)/Sunset. Automation View
and Portrait (now Playlist) Mode leave the menubar for the View menu
with in-progress labels; Return to Main View stays top-level since it
only shows inside the automation view.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 18:40:59 +02:00
duan_jandClaude Fable 5 5ea4024f86 fix: opaque faces for floating windows and theme-aware pop-out icons
A transparent top-level renders black on the container's non-composited
X11, so floating docks get a dynamic floating property feeding the
QSS [floating="true"] opaque face, and PopoutWindow sets
WA_StyledBackground. Pop-out titlebar glyphs are now painted in the
palette's WindowText color and re-tint on PaletteChange, so they stay
visible after a theme flip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 18:40:23 +02:00
duan_jandClaude Fable 5 c697049ce6 feat: hide operation panels in watch-only mode
Without the baton the GUI now shows only the camera stream and status
bar; every operating surface (panels, docks, pop-out mirrors) is hidden
outright. Regaining the baton restores dock layout via saveState/
restoreState — per-dock visibility snapshots lose docks tabbed behind
others — so LogDock gains the objectName restoreState requires.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:10:27 +02:00
duan_jandClaude Fable 5 90ba13ad23 feat: rest-to-reveal hint for dock separators
Separators stay invisible until the mouse rests on one for ~1s (or a
drag starts); the QSS ::separator:hover rule does the hit-testing and a
dynamic separatorHint property gates it, so event() never needs to know
where separators are.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:09:30 +02:00
duan_jandClaude Fable 5 d5c9ed7467 feat: pointing-hand cursor on all interactive widgets
QSS cannot set cursors and per-widget setCursor calls get forgotten as
widgets are added, so an app-level filter catches every Polish event on
buttons, combos, and sliders — dialogs and pop-outs included.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:08:18 +02:00
duan_jandClaude Fable 5 fbbb236844 feat: cross-fade and palette flip on theme switch
Freeze the old look in a click-through screenshot overlay and fade it
out over the restyled window — QSS has no transitions and animating the
palette would re-polish every widget per frame. Sunset also flips the
app-palette text roles so native primitives QSS can't recolor (spin and
combo arrow glyphs) follow the theme.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:07:23 +02:00
duan_jandClaude Fable 5 ab65193443 feat: theme-aware beamline state panel
The panel paints availability/message colors in code per DAQ tick, so
QSS can't retint it — state_colors(theme) hands it a per-theme dict
(Catppuccin Mocha inks for Sunset) and _apply_theme pushes theme flips.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:06:23 +02:00
duan_jandClaude Fable 5 d198297881 feat: dusk-gradient theme overhaul with transparent-widget scheme
Both stylesheets move to transparent children over a gradient painted
only by top-level windows; inputs, buttons, headers, and menus get
opaque faces back. Sunset drops Catppuccin Macchiato for the Daemmerung
dusk palette. Spin/combo arrows and check indicators become theme-tinted
PNGs. Widgets stop carrying inline input/text stylesheets so the theme
QSS can win (empty stylesheet = theme reset).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:05:34 +02:00
duan_jandClaude Fable 5 2f9fb10a8a feat: add spin-arrow and check-mark glyph assets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:59:42 +02:00