0.8.0
CI / lint (push) Successful in 28s
Docs build and publish / docker (push) Successful in 8s
Build and Publish / release (push) Successful in 11s
CI / test (3.11) (push) Successful in 1m28s
CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m29s
CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 2m9s
CI / test (3.13) (push) Successful in 2m57s
CI / test (3.12) (push) Successful in 3m5s
CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 3m19s
CI / test-with-coverage (push) Successful in 3m37s
CI / coverage-analysis (push) Skipped

Automatically generated by python-semantic-release
This commit is contained in:
semantic-release
2026-08-11 09:03:07 +00:00
parent 833a6d136f
commit aade051074
2 changed files with 581 additions and 1 deletions
+580
View File
@@ -1,6 +1,586 @@
# CHANGELOG
## v0.8.0 (2026-08-11)
### Bug Fixes
- Adapt main window to monitor size instead of overflowing
([`f4f3c5e`](https://gitea.psi.ch/mx/AareDAQ/commit/f4f3c5ec3d7d734dc34cf6c2c72d053deea4a200))
The window's minimum was 1400x1207 - taller than a 1920x1200 console - so the status bar was pushed
off-screen on every monitor. Three causes:
- the standard page's combined panel minimums: now wrapped in a QScrollArea so scrollbars appear
instead of clamping the window - hidden portrait/compact stack pages inflating the QStackedWidget
minimum (portrait alone demands 720px height): only the visible page contributes now - launching
at the natural size hint (1577x1612): launch maximized so the window takes whatever the monitor
offers
Minimum drops to 1400x555; verified on a 1920x1200 X display that the status bar is visible and
panels scroll when space runs out.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Dark-mode legibility for the status bar, sample tables, and surfaces
([`7b30c95`](https://gitea.psi.ch/mx/AareDAQ/commit/7b30c959a20e62c58f190f5b06dddbdcafa5d956))
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>
- Declutter the Local Contact view
([`c14d93f`](https://gitea.psi.ch/mx/AareDAQ/commit/c14d93ffcf0a9f8c3f3b98318ec772cd153789a8))
- drop the redundant Local Contact banner (the window title carries it) - remove the three
parent=self config spinboxes that painted themselves over the top-left corner; parentless
placeholders are replaced in _build_config_tab - remove all rounded corners (status card, value
badges, group boxes, transfer-error frame, recovery panels) - tighten status rows to 2px spacing
with a per-row minimum height so word-wrapped value labels can never compress rows until text
clips (previously visible on the Hardware tab)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Heal poisoned all-docks-hidden layout and restore layout before watch-only close
([`3a7f1f5`](https://gitea.psi.ch/mx/AareDAQ/commit/3a7f1f584ad49d72b1fae6617ffa5d7aa9147d7c))
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>
- Opaque faces for floating windows and theme-aware pop-out icons
([`7f838f4`](https://gitea.psi.ch/mx/AareDAQ/commit/7f838f4b985c24a5003aa5d559e65acc4b27ce4a))
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>
- Scroll Local Contact tabs so rows keep text height
([`7a57d85`](https://gitea.psi.ch/mx/AareDAQ/commit/7a57d85282888bf967e6c6e6b756a610dfa4ebf0))
The dialog's explicit minimum size is smaller than some tabs' content; without a scroll area Qt
squeezes rows below text height (clipped labels on the Hardware tab). Wrap every tab in a
QScrollArea.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Window and dock sizing behavior
([`266f833`](https://gitea.psi.ch/mx/AareDAQ/commit/266f8337a9a1fcc163d2abf8a70a2b1038c454d2))
Three main-window chrome fixes: the un-maximized geometry is pre-set to half-screen centered so
leaving maximized mode no longer restores an oversized size hint (the beamline state bar also
stops imposing its ~2000px minimum width); closing a popped-out dock re-docks it instead of
silently hiding the panel, and pop-outs open enlarged and clamped to the screen; state-bar buttons
only update font/stylesheet/cursor when values change, since repolishing every DAQ tick dropped
the hover cursor under a resting mouse.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Code Style
- Add typography, tooltip, scrollbar, and card tokens to the palette
([`e63ddb0`](https://gitea.psi.ch/mx/AareDAQ/commit/e63ddb090f68524b5193fe472176f46534dd1c7f))
The QSS gains a role-named font-size ladder (FONT_HERO..FONT_FINE), borderless QToolTip styling for
both themes, soft rounded scrollbars without end arrows, and a card_style() helper with one shared
CARD_RADIUS so card-shaped frames keep uniform geometry. Banner text flips to near-white with a
shadow constant for the painted emboss. Recovery-card and console-log colors are marked TODO for a
later retheme.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Apply the typography ladder and card_style across the GUI
([`913089b`](https://gitea.psi.ch/mx/AareDAQ/commit/913089b9b62793f74e003c7afa2fd35c12f25864))
Inline font-size literals become FONT_* tokens and hand-written card QSS collapses into card_style()
(recovery cards and console-log notifications keep FLAT_CARD_RADIUS). TitleLabel paints its text
by hand — QSS has no text-shadow — for an embossed banner title, elided when narrow, and gains a
section_title() helper for small in-panel headings.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Centralize the GUI color palette in styles.py
([`271ca54`](https://gitea.psi.ch/mx/AareDAQ/commit/271ca54d9ad3a2001dddaa5c4f960c8929f13d3c))
Every color literal in the GUI moves into one palette module: ~200 grouped constants, a qcolor()
helper (hue from the theme, alpha at the call site), and both QSS stylesheets become
string.Templates fed by _palette() so a renamed constant fails loudly. Also retints: light
background #d8e4fd -> #e2e7ee, banner indigo -> #a2b7e4, and the portrait dark theme adopts
Catppuccin Macchiato.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Clear the basedpyright gate for the new-code lines
([`4ef2ad6`](https://gitea.psi.ch/mx/AareDAQ/commit/4ef2ad64d706c2fbc0631668f00bdd8266f5ace3))
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>
- Clear the basedpyright gate for the ported round
([`84ccf27`](https://gitea.psi.ch/mx/AareDAQ/commit/84ccf275f9e2e954ee415ee905b7e3d90a43d518))
Declare MainWindow's lazily-set attributes, guard Optional layouts and the sample tab bar, wrap
QSettings reads (typed object even with type=...), include _press_geom in the pop-out resize
guard, and ignore the PySide6 stub gap on setGraphicsEffect(None).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Clear the two portrait-mode diff-gate violations
([`ed42738`](https://gitea.psi.ch/mx/AareDAQ/commit/ed42738693e6033ebeb5877c15bb842ed52e915e))
The sample-name labels are created in __init__ now (the build helper only styles and mounts them) so
reportUninitializedInstanceVariable stops firing on the ported styling lines, and the queue
placeholder uses the scoped Qt.AlignmentFlag.AlignCenter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Compact the control panels
([`5f44be2`](https://gitea.psi.ch/mx/AareDAQ/commit/5f44be2a62a8d978d51ee29398aaa4845456147e))
Vertical-space pass: samcam merges exposure+gain onto one row, ABR and monochromator tighten their
grids (energy now displayed in keV, DAQ API stays eV), beam-mark's clear button shares the
readings row, the data collection pages move Run/Abort under the last configurable row and the tab
area becomes QTabBar+QStackedWidget, the raster grid table gets a fixed height, and the automation
panel drops its own title since the dock title bar already says it. Control panels start expanded
via default_collapsed=False.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Cool the sunset gradient base
([`0b696a5`](https://gitea.psi.ch/mx/AareDAQ/commit/0b696a56f0f051dc1da01f9da86c5b0e6444a361))
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>
- Declare HoverableButton state attribute for the pyright gate
([`e818682`](https://gitea.psi.ch/mx/AareDAQ/commit/e818682abdcdc5e4c1db04c48180af7f4218ee3e))
The dynamic _beamline_state assignment was a pre-existing pattern, but the panel rewrite turned its
line into a changed line, so the basedpyright diff gate now counts it. Declare the attribute
instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Extend the palette with selection, frame, slider, and sample-status tokens
([`0bfa9db`](https://gitea.psi.ch/mx/AareDAQ/commit/0bfa9dbbeb5f8798fac8506c420d5ccdb33ed514))
SELECTION_BG/TEXT pin the app-wide selection blue to the banner color (was Qt's undeclared palette
default); FRAME_L1/L2/L3 knobs put window, panel, and data-view borders on three tunable levels
(panel etching off by default); QTabBar tabs and filter chips go borderless with a hover
underline; QSlider matches the scrollbar look; scrollbar tracks turn square with a track-colored
corner; SAMPLE_STATUS_* and SAMPLE_ROW_ALT_BG drive the sample-table status tints.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fix lint for the banner/adaptive changes
([`ce0ed20`](https://gitea.psi.ch/mx/AareDAQ/commit/ce0ed20d5a1d4d2f33e662eb8be7bd58fbe2d368))
- ruff format and import ordering (main_window, data_collection_settings, beam_center_panel,
beamline_state_panel) - rename unused unpacked variable in test_title_label - replace the
mousePressEvent monkeypatch on the beamline state title with a proper eventFilter so basedpyright
accepts the diff
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Move panel and model colors to the shared palette
([`b7d6610`](https://gitea.psi.ch/mx/AareDAQ/commit/b7d6610261840ad45ad91b9663c37c52f5915d89))
Mechanical swap of hardcoded color literals for styles.py constants and qcolor() across panels,
models, and scan_logic. portrait_mode.py drops its private palette block; beamline_controls and
data_collection_settings gain object names so the new $border QSS rules can target them. The
status-panel test asserts the palette hex instead of 'red'.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Move widget colors to the shared palette
([`590e500`](https://gitea.psi.ch/mx/AareDAQ/commit/590e500da5f7ed22b4d1ac515356dff13b06992b))
Same mechanical swap for the widgets and the tutorial manager: painter QColors go through qcolor(),
inline QSS literals become palette constants (baton dialog, busy overlay, status bar, camera
overlays, splash screen, numeric inputs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Narrow Optionals for basedpyright diff gate
([`ee7a835`](https://gitea.psi.ch/mx/AareDAQ/commit/ee7a8356a6d46de5e97a010886eb6e7cb1a4f051))
QLayout.itemAt/QWidget.layout return Optionals; pyright cannot narrow across repeated method calls,
so hold them in locals before use in tighten_column, _apply_collapsed and _set_visible.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Narrow the log pop-out view for the pyright gate
([`2adf8ff`](https://gitea.psi.ch/mx/AareDAQ/commit/2adf8ff6d5a57d98527f45b7450dd3b9565d65e4))
The Optional _popout_view is assert-narrowed once after opening; the unguarded accesses were the
last three diff-gate violations.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Narrow the manual-resize press state for the pyright gate
([`763a258`](https://gitea.psi.ch/mx/AareDAQ/commit/763a25837c4c880bc9c50d707084237c756c0463))
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>
- Relabel theme entries, tuck prototype views into the View menu
([`c179ea9`](https://gitea.psi.ch/mx/AareDAQ/commit/c179ea992c8d57d45423317b64b7283296ae485d))
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>
- Ruff-format the ported round, scope splash Qt enums
([`2638308`](https://gitea.psi.ch/mx/AareDAQ/commit/263830841208776fc9b65648313ca2c32775bd87))
The sandbox port was ruff-check clean but not ruff-format clean (CI formats before linting);
splash_screen's alignment flags move to the scoped enum since the port put that line into the diff
gate's scope.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Small panel polish
([`f7194ca`](https://gitea.psi.ch/mx/AareDAQ/commit/f7194ca3a4fa98a0ab3fa76a40a5955955e113fa))
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>
- Swap the splash banner text to the white variant
([`cd4b623`](https://gitea.psi.ch/mx/AareDAQ/commit/cd4b62323c509717641d858fc1d5cb8d9d364603))
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>
- Visual and interaction polish
([`833a6d1`](https://gitea.psi.ch/mx/AareDAQ/commit/833a6d136f1b862cd38932c0b24083fbe0ebd95a))
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>
### Documentation
- Note the spreadsheet log-spam TODO in daq_worker
([`27c9b93`](https://gitea.psi.ch/mx/AareDAQ/commit/27c9b93d5ca87093db33fe3a3fb540421024e75a))
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>
### Features
- Add spin-arrow and check-mark glyph assets
([`900315d`](https://gitea.psi.ch/mx/AareDAQ/commit/900315d412db59d85a54cd3d5d3409b12b91909b))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Camera help overlay, camera-error message, and session badge hover feedback
([`3db8b11`](https://gitea.psi.ch/mx/AareDAQ/commit/3db8b11dd1039439a844bbe74ab784634fac1bcc))
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>
- Camera session badge and collapsible legend
([`2054f07`](https://gitea.psi.ch/mx/AareDAQ/commit/2054f078b0d9ad3e982cbace0ccf34dc6c02b562))
The camera overlay gains a clickable session badge (opens the session menu at the click position)
and a baton gate: watching stays free, operating clicks are blocked when the baton is elsewhere.
The legend collapses to a ? badge until clicked - the full box covered too much image.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Collapsible half-height panel banners with a universal gap
([`a9137b3`](https://gitea.psi.ch/mx/AareDAQ/commit/a9137b3221fff7364d0a3c98d9d6a4199eeb95b9))
TitleLabel gains an optional collapsible mode: whole-banner click target, bare +/- glyph (no pill
background), per-title collapsed state persisted in QSettings, and an expand() helper. Banners are
halved to 25px with plain text + QSS font (H3 margins would clip vertically).
- convert Zoom, Light, Omega, Smargon, Sample camera, Monochromator, ABR meas. pos., Beam mark, Beam
center, Beam size, Dataset path and Loop centering to collapsible banners - new collapsible Exp.
Config. section wrapping the scan tabs - move Manual sample from a bottom dock into the left
column between Dataset path and Exp. Config.; Ctrl+M now expands it instead of raising the dock -
Beamline state banner restyled to match (25px, plain font, bare glyph, whole banner clickable) -
universal 11px banner gap via tighten_column() shared by both panel columns and the left column
stack; ABR banner spans all grid columns and file path / manual sample drop side margins so widths
align - abort button sits under the tabs instead of pinned to the bottom - unit tests for the
collapse behavior
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Cross-fade and palette flip on theme switch
([`ed8b2bd`](https://gitea.psi.ch/mx/AareDAQ/commit/ed8b2bd16539d22ad2c0b4b5b37c5dc1ac20044d))
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>
- Dusk-gradient theme overhaul with transparent-widget scheme
([`1946430`](https://gitea.psi.ch/mx/AareDAQ/commit/1946430f0d69c46a41191e9c54e189dd0fa49dd1))
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>
- Float alert banners over content as anchored toasts
([`1f2a538`](https://gitea.psi.ch/mx/AareDAQ/commit/1f2a538959b7f654dfde6d1d8ac9b2a177a8cab0))
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>
- Group beam mark/center/size under one Beam Config banner
([`00e5d11`](https://gitea.psi.ch/mx/AareDAQ/commit/00e5d116a61c16e91bbf456c05e90ca8341f18d9))
The three small beam panels shared a column with three collapsible banners; BeamConfigPanel puts
them under a single collapsible 'Beam Config.' TitleLabel with section_title() sub-headings.
beam_mark/beam_center/beam_size stay as aliases on BeamlineControls so main_window signal wiring
is untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Hide operation panels in watch-only mode
([`d127863`](https://gitea.psi.ch/mx/AareDAQ/commit/d127863b1f8fc6907828aef9b8aca26a64bfe03d))
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>
- Horizontal beamline state bar above the status bar
([`9ef4032`](https://gitea.psi.ch/mx/AareDAQ/commit/9ef4032d06274fb1448907f21b53b53b2ac34400))
Replaces the vertical station map that consumed left-column space with a slim always-visible strip
in the bottom toolbar area, directly above the status bar:
- states in physical beamline order, 18px text, one line when the bar is wide enough and wrapped at
the last space otherwise - availability coloring from the route graph plus the status-bar shortcut
transitions: bold blue = active (red for Maintenance), orange = reachable in one step, grey = not
reachable; no backgrounds or rounded corners - transitions only via right-click 'Go to <state>';
left click shows a reminder tip for available states and the reachability explanation for grey
ones; hovering a grey state for 3 s shows the same explanation - whole entry is the hover/click
region; tips anchor to the entry and disappear when the mouse leaves - always visible: no
View-menu toggle, not hidden by portrait or compact modes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Let panels opt out of starting collapsed
([`460f703`](https://gitea.psi.ch/mx/AareDAQ/commit/460f7034c37033f5bca7729471a4eb5aa8106aee))
TitleLabel gains default_collapsed; the small motor/light panels start open (their per-title
persisted choice still wins).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Merge Automation progress and Console log into one Information dock
([`e457236`](https://gitea.psi.ch/mx/AareDAQ/commit/e457236777b80514bc5f24085abd1ee6a0a23df8))
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>
- Merge Sample List, Reference Tools, and the queue into one dock
([`1f90098`](https://gitea.psi.ch/mx/AareDAQ/commit/1f9009807d555c96b1be214c9a4d0791deef32e8))
Reference Tools was a separate staff-only dock tabified behind Sample List and kept vanishing (saved
dock state, raise order); the automation job list was a third dock for what is conceptually the
same table. One tabbed dock now holds Dewar samples + Auxiliary puck (concept from aaregui2's
QueuePanel): the dewar table doubles as the queue view with the queue buttons and an Unmount
button in a row beneath it, SampleQueuePanel lives on hidden as the queue engine, and queue/flag
membership is edited via right-click or row drags onto the Queued and Flagged chips. Column 0 is a
frozen #+status cell (mounted > queued > flagged > measured, tints context-dependent per chip
filter); non-staff see Auxiliary greyed out with a Staff-only popup instead of hidden.
Ctrl+L/Ctrl+R raise the Dewar/Auxiliary tab. The Sample List and log pop-outs are fully
operational second views on shared models. Riders: MainWindow installs WheelValueGuard, wires the
camera session badge, and moves samcam/monochromator/ABR/beam-config into the left column's
Beamline group (BeamlineControls keeps only zoom/light/omega/smargon).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Pointing-hand cursor on all interactive widgets
([`257edc2`](https://gitea.psi.ch/mx/AareDAQ/commit/257edc25f87a88d22a34b2410af47bfdb491eeea))
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>
- Pop-out windows instead of floating docks
([`6e1305c`](https://gitea.psi.ch/mx/AareDAQ/commit/6e1305cb927a11cc04ea86b88366961ec6aa27fd))
Floating a dock rips it from the row and reshuffles the rest, so PopoutWindow opens an ADDITIONAL
frameless top-level window instead: 12px outer resize halo (border painted OUTER_GRIP inside the
real edge so an outside-looking grab still works), hand-painted borderless titlebar glyphs, close
hides and keeps geometry. DockTitleBar puts the popout button next to the close box. The console
log adopts it: dock floating disabled, the pop-out view is a second QPlainTextEdit fed by the same
emitter (a shared QTextDocument would make two views fight over one layout), clear() clears both.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Reference-tools position column and state-driven default sample tab
([`b088170`](https://gitea.psi.ch/mx/AareDAQ/commit/b08817024dd6c03d8b7f67abfb7a9cd982d0a76e))
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>
- Rename themes to sunrise/sunset, add bluebird theme with Catppuccin-Latte light palette
([`c13ea11`](https://gitea.psi.ch/mx/AareDAQ/commit/c13ea11430cf595395fc8de83988d73de088b930))
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>
- Rest-to-reveal hint for dock separators
([`f9a6c7b`](https://gitea.psi.ch/mx/AareDAQ/commit/f9a6c7bc319bad40c015ac692c6ba7857274c712))
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>
- Start all collapsible panels collapsed by default
([`f84bee6`](https://gitea.psi.ch/mx/AareDAQ/commit/f84bee66ee726598dd38b75f5a8978a29bcc7806))
A fresh GUI shows only the banners; the Beamline state panel keeps its own expanded default. A
user's saved per-title states still override.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Swap the splash banner to an SVG
([`efcdc0c`](https://gitea.psi.ch/mx/AareDAQ/commit/efcdc0c1912c0024719105411f1bb0a7c09225dd))
The PNG banner is replaced by an SVG so the splash artwork scales; the old aare_banner.png is
removed and gui.py loads the .svg path (the stale path yielded a null splash pixmap).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Theme-aware beamline state panel
([`7801025`](https://gitea.psi.ch/mx/AareDAQ/commit/7801025802d66291d1bc46177dd1a820ffb6dbd2))
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>
- Wheel only adjusts values while the right button is held
([`f87b895`](https://gitea.psi.ch/mx/AareDAQ/commit/f87b8952c8cf9c01f863e5f9a20c96b53e99ad9c))
WheelValueGuard (app-level event filter, installed by MainWindow) makes a bare wheel over spin
boxes, sliders, dials, and combos scroll the enclosing scroll area instead of nudging the value -
motor protection. NoWheelScrollArea stops swallowing wheel events since values are now guarded at
the widget.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Refactoring
- Shared busy-badge renderer for camera and axis video views
([`e77dfb4`](https://gitea.psi.ch/mx/AareDAQ/commit/e77dfb4716f7adcb6673593c1d5075824ae9aeb1))
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>
### Testing
- Cover the beamline state bar
([`3175e43`](https://gitea.psi.ch/mx/AareDAQ/commit/3175e437a4ebf4c749d4f6c841d67f35a506fdeb))
Availability sets (routes + menu shortcuts, Moving/unknown), signal gating, palette and cursors per
availability, red/blue active states, adaptive label wrapping, left-click hint paths, hover-hint
timer lifecycle, and pending-target clearing. Lifts the PR diff coverage back over the 80 percent
gate (measured 88 percent locally).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Cover the camera overlays, theme migration, layout heal, and splash
([`7b4764e`](https://gitea.psi.ch/mx/AareDAQ/commit/7b4764e7caa336e2b26165cc3cbd43f6afed86f7))
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>
- Cover the sample-status logic, wheel guard, pop-outs, and log mirror
([`69b6813`](https://gitea.psi.ch/mx/AareDAQ/commit/69b68130259827ba2166360474959d45d0ec5310))
New tests for what the port added: status tint priority and context-dependent chip filters on the
dewar/queue model, the right-button wheel guard (motor protection), PopoutWindow edge maths,
manual-resize fallback, close-hides behavior and DockTitleBar, the chip drag-drop relabeling, and
the console-log pop-out mirror. The widgets' __main__ self-checks are superseded by these and
removed. Brings PR diff coverage from 70% to 81% (gate: 80%).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Inline smoke check for the wheel guard
([`546fb5d`](https://gitea.psi.ch/mx/AareDAQ/commit/546fb5d3f041f71410093604e8c712013a0deea5))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Track the sample-table column shift, sort imports
([`0b80c75`](https://gitea.psi.ch/mx/AareDAQ/commit/0b80c75c63d58d03666c354744c4074e8d1952c6))
The frozen #+status column shifted data columns +1, so the User-column model tests move from index 5
to 6; ruff import-sort fixes for main_window and log_panel ride along.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.7.3 (2026-08-11)
### Bug Fixes
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "aaredaq"
version = "0.7.3"
version = "0.8.0"
description = "AareDAQ (with GUI)"
readme = "README.md"
requires-python = ">=3.11"