Files
AareDAQ/CHANGELOG.md
T
semantic-release 523bd32606
Docs build and publish / docker (push) Successful in 3s
CI / test (3.13) (push) Failing after 31s
CI / lint (push) Failing after 32s
CI / test-with-coverage (push) Failing after 28s
CI / coverage-analysis (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Failing after 31s
CI / test (3.14) (push) Failing after 35s
CI / test-with-beamline-plugins (pxii_bec) (push) Failing after 31s
CI / test-with-beamline-plugins (pxiii_bec) (push) Failing after 32s
CI / test (3.12) (push) Successful in 1m18s
1.4.0
Automatically generated by python-semantic-release
2026-10-06 13:53:23 +00:00

3137 lines
131 KiB
Markdown

# CHANGELOG
## v1.4.0 (2026-10-06)
### Features
- Put current zoom level in redis
([`4ac6f4a`](https://gitea.psi.ch/mx/AareDAQ/commit/4ac6f4a947276f71fd4295e622659b10753dcb49))
## v1.3.8 (2026-10-02)
### Bug Fixes
- Fix test related to last change
([`2cccc8a`](https://gitea.psi.ch/mx/AareDAQ/commit/2cccc8a345453ef0b342c0c3b6595bb1c3491ca1))
- Standard DTY offset is 0 mm now
([`4430585`](https://gitea.psi.ch/mx/AareDAQ/commit/4430585e3cba6d89da687c656519b0fb152b588d))
## v1.3.7 (2026-10-02)
### Bug Fixes
- User macro reload from BEC client, not dispatch
([`6ba560f`](https://gitea.psi.ch/mx/AareDAQ/commit/6ba560fc6991a7fe587ae77ce24e52501245e667))
## v1.3.6 (2026-10-01)
### Bug Fixes
- Sleep 2 seconds between grid and rotation - proper fix
([`84a8711`](https://gitea.psi.ch/mx/AareDAQ/commit/84a871122a1101e2618cd9b4922ff6fb59493f8a))
## v1.3.5 (2026-10-01)
### Bug Fixes
- Sleep 2 seconds between grid and rotation
([`9606d26`](https://gitea.psi.ch/mx/AareDAQ/commit/9606d266abd9bd6673de9fc8935cdc2167cbbe8e))
## v1.3.4 (2026-09-30)
### Bug Fixes
- Update color of the mounted row in AareGUI
([`70f9a14`](https://gitea.psi.ch/mx/AareDAQ/commit/70f9a143253aa99cc5a3052087843e3b6eb0e0b3))
- **gui**: Fire mount auto-centering on the first idle status tick
([`3409d01`](https://gitea.psi.ch/mx/AareDAQ/commit/3409d01efdd75e778675d7fb1d9cfa4e70b604ea))
The "apply after mounting" checkbox clicked Auto Centering as soon as the status poll showed a new
sample id. /sample/mount still holds the hw lock at that point, /alc/center_loop takes the same
lock non-blocking, and the resulting BeamlineBusyException is a quiet error the GUI swallows. So
the automatic click never did anything; only a later manual click worked.
Arm on the sample-id change and click on the first status tick with busy=False, which is exactly
what the user did by hand. Skip arming while queue automation runs: it mounts and centers on its
own and frees the lock between /scan/auto calls, so a GUI centering in that gap would steal the
lock from the next scan. Pause during a scan's mount phase can still arm that one sample, but
Pause ends in an unmount, so the window is a ms-wide lock gap sampled at 2 Hz; accepted, noted in
the code.
Supersedes the three-commit approach on fix/auto-center-after-mount-wait-idle (PR 243).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Remove not longer needed return to main window at close and cleanup
([`2c388ff`](https://gitea.psi.ch/mx/AareDAQ/commit/2c388ff7ad6dca80ef092305541a6be8749cde7c))
### Testing
- Patch the test
([`5cb32ba`](https://gitea.psi.ch/mx/AareDAQ/commit/5cb32ba5fca61fd7d2d81f0a6189516d2dc9937e))
## v1.3.3 (2026-09-29)
### Bug Fixes
- Add detector y offset for 10s
([`ee7c4cb`](https://gitea.psi.ch/mx/AareDAQ/commit/ee7c4cb946978a40cb3b6c79c277a6027fe4d754))
## v1.3.2 (2026-09-24)
### Bug Fixes
- 10% transmission for X10SA automation raster
([`4ac8313`](https://gitea.psi.ch/mx/AareDAQ/commit/4ac83137339b62ab6247f0fb0ae819a013e4fe31))
Reverting back to 10% transmission for rasters at 10S
## v1.3.1 (2026-09-23)
### Bug Fixes
- 100% transmission for X10SA automation raster
([`f5dd8cf`](https://gitea.psi.ch/mx/AareDAQ/commit/f5dd8cf0b8d257868454fa6f64cb0855c360e751))
Release trigger for 0348929a, whose non-conventional commit message ("Update ...") was not picked up
by semantic-release, so v1.3.0 still ships transmission 0.1 for the X10SA auto-raster defaults.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## v1.3.0 (2026-09-22)
### Features
- Switch off tell air blower before moving chi away from zero
([`11f22b5`](https://gitea.psi.ch/mx/AareDAQ/commit/11f22b57cd271798299e8f7d8509a903f03a1c10))
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## v1.2.0 (2026-09-21)
### Features
- Fixed per-beamline raster parameters in automation
([`8a24025`](https://gitea.psi.ch/mx/AareDAQ/commit/8a24025c2726e9dfd1bd092e93150dae84e8a984))
Release trigger for e1175c9d, whose capitalized "Feat:" prefix was not recognized by
semantic-release.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## v1.1.1 (2026-09-18)
### Bug Fixes
- **gui**: Add "Show beam crosshair" toggle to the camera right-click menu
([`b5e6159`](https://gitea.psi.ch/mx/AareDAQ/commit/b5e6159118d9d4067b779fc3e43eb4e4c1f9dc84))
Right-clicking the sample camera now offers a checkable "Show beam crosshair" entry. When on, two
full-frame lines through the beam center are drawn with the same pen as the beam box, so the
crosshair follows the beam state color. Off by default so the view stays as before.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
### Code Style
- Have the cross hair not too long, just a small cross
([`3f404af`](https://gitea.psi.ch/mx/AareDAQ/commit/3f404af06942053a2b45600cb2f36ac9bdfc883e))
Anuschka and Katherine really need it
- **gui**: Soften the mounted-sample HUD ink on light themes
([`79bb351`](https://gitea.psi.ch/mx/AareDAQ/commit/79bb351437b6db06369ca2388a8663e36ded850b))
Pure black (SHADOW) over the camera image read too harsh; use the theme text ink (TEXT) with the
same white halo instead. Sunset keeps white on black.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v1.1.0 (2026-09-17)
### Bug Fixes
- **gui**: App-level event filters tolerate PySide's stray QWidgetItem
([`90f6533`](https://gitea.psi.ch/mx/AareDAQ/commit/90f653386adbf5a9e5a24fb7fc9ba8e79cf78660))
CI (3.12, PR 232) failed test_font_zoom_keeps_frozen_column_aligned_and_reautosizes with a pytest-qt
CALL ERROR: PySide 6.9 handed both app-level filters a QWidgetItem instead of a QEvent during
layout teardown, and event.type() raised. The wheel guard now keys on isinstance(event,
QWheelEvent) and returns False itself instead of super().eventFilter() (which type-checks its
arguments and would raise the same way); the cursor filter ignores anything that is not a QEvent.
Regression test for each.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Keep queue head until /status confirms unmount on Mount next
([`1ea607b`](https://gitea.psi.ch/mx/AareDAQ/commit/1ea607ba56cb6ab65113ba6a40f3146f873f5bd4))
Mount next popped the mounted head before posting the exchange, so a failed unmount dropped a sample
that was still on the gonio. Now the head stays queued and is removed only when /status shows a
different (or no) sample mounted; a failed exchange leaves the queue intact for a retry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Keep the file-name preview in the plain theme color
([`d70cac4`](https://gitea.psi.ch/mx/AareDAQ/commit/d70cac45bf910d644601102170345ba130d47c89))
Dawn: the red "file exists" tint on the path label reads as an error across the whole panel. The Run
guard's popup already reports a clash, so the label stays in the standard text color. The popup
now also asks the user to run the data collection again after the run number bump.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Make the file-exists guard literal: popup, run +1, no scan
([`646de67`](https://gitea.psi.ch/mx/AareDAQ/commit/646de672917ce8ed6a05803f157290bbbf9c60a7))
update_filename() still skipped to the next free run number on every edit and refresh, so the name
was always free by the time Run was clicked and the guard never fired. The name is now exactly
what the fields say (label turns red on a clash); on Run, an existing target pops "File already
exists", bumps the run number by one and does nothing else.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Pop up "File already exists" instead of silently bumping the run
([`8798a81`](https://gitea.psi.ch/mx/AareDAQ/commit/8798a815555dd41f76a455cf534922bbbb940f69))
The Run guard called set_scan_kind(), which runs update_filename() and skips to the next free run
number before the existence check, so the check never fired and the scan started under a new
number without a word. Now the check runs first, then a warning box names the existing master file
and the run number it moved to, and the run is blocked.
- Simple tab "Run rotation" had no guard at all; same guard added - "Taken" also matches
<run>_*_master.h5: X-ray Centering writes <run>_raster2d_master.h5, which the exact name missed -
Camera context-menu "Evaluate grid" presses the panel button, so it gets the guard and stays inert
while the button is disabled - Dead next_free_run_from() removed
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Reach the file-exists guard from every tab, test exact names
([`010513e`](https://gitea.psi.ch/mx/AareDAQ/commit/010513e1412006c6cd8e808386574db101463300))
The tabs are handed parent=DataCollectionSettings but QStackedWidget.addWidget() reparents them to
the stack, so the guard's parent() lookup never found file_path_panel and every Run (rotation,
screening, raster, X-ray centering, Simple) skipped the check. Lookup now walks up the widget
tree; regression test drives all five runs through the real DataCollectionSettings.
The "taken" test is exact again: <run>_master.h5 plus the DAQ's derived
<run>_raster2d/_raster1d_master.h5. The directory test and the _*_master.h5 glob are gone: neither
is a file a run writes, and they painted run numbers red that nothing would ever produce.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- **gui**: Zoom-proof the Dewar table and control heights, theme the mounted HUD ink
([`bf11528`](https://gitea.psi.ch/mx/AareDAQ/commit/bf11528e8680e5df6a0b853b8a2524dd22f4881a))
Dewar "#" column sat 1px above the other rows at some zoom steps: the frozen-column overlay sizes
its own header from "#" alone while the main header also sees the symbol columns, whose
fallback-font glyphs have a taller line box. The overlay header is now pinned to the main header
height on resize and (deferred, receiver-bound) on font/style change.
Zoom also left columns at their startup widths (headers truncated) and clipped descenders in every
button/combo/entry box: the 16px height pin in both sheets was raw px while the body font grew to
18/21px. Columns re-autosize on FontChange and the pin scales with the font ladder.
Camera "Currently mounted" HUD: black ink on a white halo in the light themes, white on black in
Sunset, instead of white-on-black everywhere.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
### Chores
- Better wording, make user calm
([`7458ea0`](https://gitea.psi.ch/mx/AareDAQ/commit/7458ea04006e7151e6e647f5397d1bc23a54c7ed))
### Features
- **gui**: Pin status-bar operables right, stop readout width jitter
([`1b6a32d`](https://gitea.psi.ch/mx/AareDAQ/commit/1b6a32d1372c7ac7350aadd2b8f6e6cb2d61f39b))
- Fast Shutter / State / p-group / Session are addPermanentWidget now: QStatusBar itself pins them
to the right corner, so wrapping of the other readouts never moves them - passive readouts keep
wrapping in the FlowHost on narrow windows - grow-only min-width ratchet on every readout:
changing number widths used to re-flow the row each DAQ tick and jitter every neighbour
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v1.0.3 (2026-09-17)
### Bug Fixes
- Report better errors on critical failures
([`735650a`](https://gitea.psi.ch/mx/AareDAQ/commit/735650aea7cccef6ca9dedb234329520fdf94557))
## v1.0.2 (2026-09-17)
### Bug Fixes
- Don't wait for jfjoch cancellation
([`4fc93b9`](https://gitea.psi.ch/mx/AareDAQ/commit/4fc93b92aa649df982b80efa007e5d786bf5c065))
- Make _safe_sample safer
([`5d770bd`](https://gitea.psi.ch/mx/AareDAQ/commit/5d770bddc0a7b2d97c9284645b590aa86095829c))
### Documentation
- Add comment to timeout adjustment
([`b385559`](https://gitea.psi.ch/mx/AareDAQ/commit/b385559842ece937491a474d3aca183274c56079))
## v1.0.1 (2026-09-17)
### Bug Fixes
- Guillaume's fix for pin exclusion
([`c545910`](https://gitea.psi.ch/mx/AareDAQ/commit/c545910f350e47fef5a313105fc00327c49eda2c))
## v1.0.0 (2026-09-16)
### Bug Fixes
- Cast the mocked daq.unmount for basedpyright on CI
([`e31b0e9`](https://gitea.psi.ch/mx/AareDAQ/commit/e31b0e9a6f7bd8adb0ce60e1cfe4b8eefecbe2d2))
CI's basedpyright (latest from the index, newer than the local venv) types win.daq as the real
DAQWorker, so assert_not_called on the patched-in MagicMock flagged the two new gate-test lines.
Note: the pytest job segfaults are NOT from this branch — plain origin/main crashes 2/4 runs under
PySide6 6.11.2 (what CI installs; uv.lock pins 6.9.0 which is stable). Needs a separate dependency
fix.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Full-length hint line on resize-bar hover/drag, short grip idle
([`750559f`](https://gitea.psi.ch/mx/AareDAQ/commit/750559fadedbdbefa09b7e8d58fbbf1475c706df))
User feedback: idle bars stay short centered grips, but hovering or grabbing a resize bar brings
back the full-length 2px line + shadow gradient so the active bar reads over its whole run. The
now-unused hint grip PNGs are removed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Give deferred singleShot callbacks a receiver context
([`26fbe2c`](https://gitea.psi.ch/mx/AareDAQ/commit/26fbe2ca421eafd550b2696173fb40c6d8114abc))
Root cause of the long-standing cross-test SystemError flake ("QPushButton returned NULL", CI
failing test_title_label after an unrelated file): TitleLabel schedules QTimer.singleShot(0,
self._apply_collapsed) at construction; when the banner is deleted before the event loop spins
(what every panel test does), the pending timer fires into the dead C++ object and poisons
whatever test runs next. Deterministic repro added as a regression test. The receiver-context
overload singleShot(0, self, ...) auto-cancels the callback when the widget dies. Same fix for the
two deferred main-window callbacks (dock split, floating-dock enlarge).
Note for the record: the LOCAL segfault storm this afternoon was the dev machine's disk hitting 100%
full (uv cache at 15G) — Bus errors from mmap on a full disk, unrelated to any code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Pin PySide6 below 6.10 so CI stops segfaulting
([`32f98d7`](https://gitea.psi.ch/mx/AareDAQ/commit/32f98d7285e4dc78cac80085602a2d3d8385e99f))
CI installs latest index deps (it does not read uv.lock) and resolved PySide6 6.11.2, which
segfaults the unit suite in teardown on about half the runs - reproduced on PLAIN origin/main, so
it is not this branch's code. 6.9.0 (the uv.lock pin) is stable. Cap the dependency so CI resolves
a 6.9.x build; drop the cap once the teardown crash is hunted down. uv.lock re-locked (it was
stale at aaredaq 0.22.1).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Re-pin PySide6 after the beamline-plugin install in CI
([`c203a65`](https://gitea.psi.ch/mx/AareDAQ/commit/c203a657c5694cd3f67ceb079ed3a32096c7c5e9))
The bec plugin editable installs upgrade PySide6 to 6.11.x past the pyproject cap, which brings the
teardown segfault back in exactly the test-with-beamline-plugins jobs. Reinstall the capped
version after the plugin install.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Suppress takeAt override complaint from newer basedpyright stubs
([`145b94b`](https://gitea.psi.ch/mx/AareDAQ/commit/145b94b7eff87c9585681ba4c6c5acbcb5ccd613))
Qt's takeAt contract is nullptr-if-out-of-range; the newer PySide stubs on CI declare a non-Optional
return. Suppress rather than lie.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Chores
- Retrigger CI (pxi_bec job hit the known eventFilter teardown flake)
([`7fb9f8b`](https://gitea.psi.ch/mx/AareDAQ/commit/7fb9f8bf9cf2623591417fe7d3774f71caa10f64))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Retrigger CI (pxi_bec job hit the known eventFilter teardown flake)
([`b29b5f1`](https://gitea.psi.ch/mx/AareDAQ/commit/b29b5f121e1cb011b22c73fe85b78b190457ddb7))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Features
- Remove Playlist Mode and Automation View, unpin window minimum
([`809959d`](https://gitea.psi.ch/mx/AareDAQ/commit/809959df33fbf4f023b42347d86f73a7a03bcdae))
Why the width shrink only worked after a Playlist Mode round-trip: Qt auto-pins a top-level window's
minimum size to its layout minimum, and returning from Playlist Mode hid the Information dock (and
every side dock), which happened to drop that layout minimum. The main view now gets an explicit
small minimum (320x240) which disables the auto-pin outright, so the window shrinks directly and
the dock contents clip or scroll instead.
The Playlist Mode (Ctrl+6) and Automation View (Ctrl+5) prototypes are deleted per user decision:
panels, pages, the content stack (the standard page is the only page left), menu actions, camera
fan-out to their view copies, portrait alert interceptors (now plain runtime notification
routers), and their styles (portraitRoot, compact* cards, COMPACT_* and FONT_HERO knobs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Status-bar readouts wrap on narrow windows instead of clipping
([`5cb57f4`](https://gitea.psi.ch/mx/AareDAQ/commit/5cb57f4737812f9a781334be88eef46bf2586868))
All readouts (sharpness ... Cryo | Fast Shutter | State | p-group | Session) now live in one
FlowLayout host: when the window gets narrow the bar grows extra rows and every value stays
readable, where QStatusBar used to clip the permanent group and hide the rest. FlowLayout is the
canonical Qt example trimmed down (Qt ships no built-in); the host pins its minimum height to the
wrapped height because QStatusBar ignores heightForWidth. The old left/right addWidget vs
addPermanentWidget split is gone with the wrap.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Refactoring
- Drop the camera-region splitter, side columns fixed again
([`33239bf`](https://gitea.psi.ch/mx/AareDAQ/commit/33239bf51f9cb5aa070ef7b9664e82e7a5198885))
User decision: the drag-resize bars beside the Sample camera view are not wanted - the side panels
don't need resizing. Back to the plain HBox with zoom-scaled fixed column widths; the View-menu
collapse toggles and the camera minimum-width clamp stay.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.32.1 (2026-09-16)
### Bug Fixes
- Give a better error on attempting to run raster with no sample
([`6b6c364`](https://gitea.psi.ch/mx/AareDAQ/commit/6b6c364843043a46bbfd4089b101126e469b4cd3))
- Reduce log verbosity in raster results
([`fab6e8e`](https://gitea.psi.ch/mx/AareDAQ/commit/fab6e8ed3004a98541c718dc685b4f367f14e5c3))
### Code Style
- Format
([`21a462d`](https://gitea.psi.ch/mx/AareDAQ/commit/21a462d4df9c4bee989e534b6d9ce6851a5401f3))
## v0.32.0 (2026-09-14)
### Code Style
- Format
([`8142908`](https://gitea.psi.ch/mx/AareDAQ/commit/814290829dd403238d6f239f329a421978d0888e))
### Features
- Full-name tooltips on the glyph count column headers
([`f1f932b`](https://gitea.psi.ch/mx/AareDAQ/commit/f1f932bc7cd1d72805916c1f09d740054934f3c1))
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>
- Show the mounted sample name on the camera view
([`6d09ae4`](https://gitea.psi.ch/mx/AareDAQ/commit/6d09ae4fe304058b991c29bcde72c63b0d53559a))
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>
- Text zoom shortcuts and high-contrast resize lines
([`1fc7264`](https://gitea.psi.ch/mx/AareDAQ/commit/1fc72649b0d1ef24884d189e0a924da28bf53eb6))
- 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>
### Refactoring
- Transmission is a per-mode setting, placed in its section
([`1fe3c7f`](https://gitea.psi.ch/mx/AareDAQ/commit/1fe3c7f4e5e4c18c323b97bec49da32846b280e9))
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>
## v0.31.3 (2026-09-14)
### Bug Fixes
- Clarify wording in screening panel
([`d37c571`](https://gitea.psi.ch/mx/AareDAQ/commit/d37c5712d5e806e1a68495e9d5b267e5fc7475d1))
- Update time param in aarescan calls for screening and raster
([`9b58d77`](https://gitea.psi.ch/mx/AareDAQ/commit/9b58d77e5b221fbe4a0d757ecec3bb1e1a071b8d))
## v0.31.2 (2026-09-14)
### Bug Fixes
- Combine park and dry to one action for after-queue cleanup
([`1b5a3bd`](https://gitea.psi.ch/mx/AareDAQ/commit/1b5a3bd0c451833f2201c97f7774a6a780483568))
## v0.31.1 (2026-09-11)
### Bug Fixes
- Use res of selected gridscan image
([`bab5177`](https://gitea.psi.ch/mx/AareDAQ/commit/bab5177528613977ed2783821274f36a5592e83c))
### Code Style
- Unused import
([`69e944f`](https://gitea.psi.ch/mx/AareDAQ/commit/69e944fd499fc5d0a65bf4ab84ca584a3e285a7f))
## v0.31.0 (2026-09-11)
### Features
- Add per-beamline default datacollection params
([`32086ff`](https://gitea.psi.ch/mx/AareDAQ/commit/32086ffc6135eb4f444b9ede22b626b8c96ca788))
## v0.30.1 (2026-09-10)
### Bug Fixes
- Only set transmission when it actually differs
([`702eb7d`](https://gitea.psi.ch/mx/AareDAQ/commit/702eb7d9f9a8ae02142ee3c40f4bab460d597c2a))
The guard introduced with the transmission IOC workaround was inverted: `abs(request - readback) <
0.001` fires only when the beamline is already at the requested value, so any real transmission
change was skipped and collections ran at whatever transmission happened to be set.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ni1Uhb1WqzpXPwcYsvqnH1
## v0.30.0 (2026-09-10)
### Bug Fixes
- According to 6124 planner feedback, use 10 to 20 keV at PXII
([`b27556e`](https://gitea.psi.ch/mx/AareDAQ/commit/b27556e4cf971222d9732f8dd54e029abb60b090))
### Features
- Compact sample list headers, move Comment column
([`d5a7074`](https://gitea.psi.ch/mx/AareDAQ/commit/d5a7074ec1d528514acfb082b5806fc14720cdea))
Count columns use glyphs instead of long headers to save width, Comment moves ahead of the
data-collection params, transmission shown as the stored value instead of percent.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- X10sa energy range 6-30 keV
([`39631c5`](https://gitea.psi.ch/mx/AareDAQ/commit/39631c5206071811be1dd51b207d9bba6d134851))
Pick the mono limits by BEAMLINE env via mx_beamline(): X10SA gets 6-30 keV, other beamlines keep
the 4-20 placeholder until confirmed.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.29.1 (2026-09-10)
### Bug Fixes
- Acquire hardware lock on energy change
([`0a4e296`](https://gitea.psi.ch/mx/AareDAQ/commit/0a4e2961ce0d4a54328dcb53357300067f3a621b))
## v0.29.0 (2026-09-10)
### Features
- Add pxiii flux from lookup table
([`f7ebae2`](https://gitea.psi.ch/mx/AareDAQ/commit/f7ebae2444837b90a9184dabd9f3ec96caef1c48))
## v0.28.1 (2026-09-10)
### Bug Fixes
- Clear statistics when mounted sample changes
([`5cddae2`](https://gitea.psi.ch/mx/AareDAQ/commit/5cddae225dda0465ded97872af498c225a3b80df))
## v0.28.0 (2026-09-10)
### Features
- Hide XRF tab in data collection settings
([`871baa2`](https://gitea.psi.ch/mx/AareDAQ/commit/871baa22160dc75dfd5d432b6b5054ee614fa9f3))
Hide only, not remove: setTabVisible keeps index 3 valid so tab-change logic and panel loops stay
untouched. Unhide when XRF is ready for users.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.27.0 (2026-09-10)
### Bug Fixes
- General fixes
([`82065c0`](https://gitea.psi.ch/mx/AareDAQ/commit/82065c0f7d7741bffd8e104543498b30fa3ade7e))
- Multiply flux by transmission instead of dividing
([`891ba7b`](https://gitea.psi.ch/mx/AareDAQ/commit/891ba7bc0a36294b46c0d78347e98f6a82804807))
- Remove zoom to fit test for unused functionality
([`8d53505`](https://gitea.psi.ch/mx/AareDAQ/commit/8d535052814085face6d7ba94a227ee5656111f9))
- Use old calculation for smargon coord from new center
([`d74adc0`](https://gitea.psi.ch/mx/AareDAQ/commit/d74adc06aae329a350e5e5c952c17118795972a4))
- Workaround transmission PV issue
([`926e940`](https://gitea.psi.ch/mx/AareDAQ/commit/926e940d90ba5936aab31461be7940d1595477a7))
### Features
- Forward v2 scan results decision to DB and move calculation to analysis stage
([`f3ba37e`](https://gitea.psi.ch/mx/AareDAQ/commit/f3ba37e6a35389e9bd2306d2d848be443c88e81c))
- Introduce switching gridscan analysis modes
([`20b5b12`](https://gitea.psi.ch/mx/AareDAQ/commit/20b5b1205dbc8bcc8f08d637b802c1dba1ca9627))
with raster service refactor
- Propagate gridscan analysis choice to GUI
([`947863d`](https://gitea.psi.ch/mx/AareDAQ/commit/947863d0c80d060ab981e6feb3a1f2a84bcda8ab))
## v0.26.0 (2026-09-09)
### Bug Fixes
- Display flux more nicely
([`6e4e28c`](https://gitea.psi.ch/mx/AareDAQ/commit/6e4e28ca8c3dfb00d40b338092d5a1385ff4ef6d))
- Don't require lock to cancel
([`8b62da1`](https://gitea.psi.ch/mx/AareDAQ/commit/8b62da13182f7a20dcd092af24a2c325e53f0190))
- Don't show beamline is busy error message
([`ac0242d`](https://gitea.psi.ch/mx/AareDAQ/commit/ac0242d36e8bb90649e6e99f34922145b6eeb3a8))
- Implement simulated flux
([`06c66c1`](https://gitea.psi.ch/mx/AareDAQ/commit/06c66c1944a353aa727ef649ae767ba629083136))
### Code Style
- Format
([`477d72a`](https://gitea.psi.ch/mx/AareDAQ/commit/477d72a46cbd396ec7f4fd3428b548061d99cbd5))
### Features
- Add flux to macros
([`e5d0bd2`](https://gitea.psi.ch/mx/AareDAQ/commit/e5d0bd22212e84a7d856aa28641d7387c851d272))
## v0.25.0 (2026-09-09)
### Features
- Highlight whole mounted row in sample list
([`22228c0`](https://gitea.psi.ch/mx/AareDAQ/commit/22228c0868d7276a0e8aa1da8cba2a93024b76de))
The mounted sample used to tint only the frozen "#" cell. Paint the full row in the same blue so it
is findable at a glance, and keep the theme's own text color on it (the mid-tone blue reads fine
without the dark ink that the pastel status tints need). Repaint the whole row span on
mount/unmount, not just column 0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Show spreadsheet params in sample list
([`a2c5ed3`](https://gitea.psi.ch/mx/AareDAQ/commit/a2c5ed3d5cb9fb622e5ac3abf6aae705de727dde))
Add Oscillation, Exposure, Total range and Transmission columns to the dewar sample table, read from
SampleShortInfo.aaredb_params (already filled by spreadsheetupdater from AareDB, so no server
change). Transmission is shown as percent like the user spreadsheet.
The new columns are nullable, so the header sort key now puts None last instead of raising on None <
float.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.24.6 (2026-09-09)
### Bug Fixes
- Make xraycenter line scan on box center and twice box height
([`76062d5`](https://gitea.psi.ch/mx/AareDAQ/commit/76062d5d7de7427c5c6592cb890e08bc4bcd5d42))
## v0.24.5 (2026-09-09)
### Bug Fixes
- Validate screening instead of running it
([`29f5357`](https://gitea.psi.ch/mx/AareDAQ/commit/29f5357d10a700d37910c63a601cdcff78366e22))
## v0.24.4 (2026-09-09)
### Bug Fixes
- Unmount sample at end of automation
([`9e6f50a`](https://gitea.psi.ch/mx/AareDAQ/commit/9e6f50ae782783aa75c4101014e5863cfb720574))
## v0.24.3 (2026-09-09)
### Bug Fixes
- Validate rotation scan instead of running it
([`3439233`](https://gitea.psi.ch/mx/AareDAQ/commit/343923391d3cc21675df6fd41d11bc0f0f47f956))
## v0.24.2 (2026-09-09)
### Bug Fixes
- Spreadsheetupdate config refrence
([`df54ed5`](https://gitea.psi.ch/mx/AareDAQ/commit/df54ed5b050414334966ad2d9b8d983580fb7cd6))
- Tellupdater config refrence
([`d52cf30`](https://gitea.psi.ch/mx/AareDAQ/commit/d52cf30ab0e0adc4b0a370074054bd4919a43385))
- Update spreadsheetupdater tests
([`9f12167`](https://gitea.psi.ch/mx/AareDAQ/commit/9f12167599c90dc9e71ea71d6fb0e03fd10ca7bb))
- Update tellupdater tests
([`aa90dea`](https://gitea.psi.ch/mx/AareDAQ/commit/aa90dea2eb3fd449de48176119fa229765ee0138))
## v0.24.1 (2026-09-09)
### Bug Fixes
- Call jfjoch cancel in failed operation exception handler
([`ace1615`](https://gitea.psi.ch/mx/AareDAQ/commit/ace161590c5a3fd1a9ab98e857acdd584aeed5ff))
- Reduce TELL client log verbosity
([`7c6350e`](https://gitea.psi.ch/mx/AareDAQ/commit/7c6350ee94aab9a3a74d86c5edfccd5489d3c6a7))
- Validate gridscan params
([`7cc8fca`](https://gitea.psi.ch/mx/AareDAQ/commit/7cc8fcaaaf5cda554050de03c9e8dd50af265567))
- Validate params with aarescan
([`7c893ce`](https://gitea.psi.ch/mx/AareDAQ/commit/7c893ce6984bdedf27eeb82fcd9077d8695e7891))
### Chores
- Update aaresccan-client dependency
([`2eb5e3a`](https://gitea.psi.ch/mx/AareDAQ/commit/2eb5e3a5102c03ee19af11efab4b7ba56f76cf42))
### Code Style
- Fix type hints and naming
([`69fbf4b`](https://gitea.psi.ch/mx/AareDAQ/commit/69fbf4b95bf9f3f1a0f9ce33180ef9b6d1afcded))
## v0.24.0 (2026-09-09)
### Bug Fixes
- Add tests and cleanup after exceptions
([`1cd8102`](https://gitea.psi.ch/mx/AareDAQ/commit/1cd8102b691e71a48c6c6644fd8398d919738f5c))
### Code Style
- Ignore pyright issues in redis return values
([`6483d50`](https://gitea.psi.ch/mx/AareDAQ/commit/6483d50d1d0ae0dc788cd3c541ff97935c31d8b5))
### Features
- Add hardware lock to server
([`18bcbdb`](https://gitea.psi.ch/mx/AareDAQ/commit/18bcbdba10225ba5955e506594083c629226d0ea))
- Remove all busy-state handling
([`fbfe773`](https://gitea.psi.ch/mx/AareDAQ/commit/fbfe7739547e43d567fc4aaa47f8af435c5f2c0c))
## v0.23.1 (2026-09-08)
### Bug Fixes
- Bound the sample camera SUB receive queue
([`4c3b0ce`](https://gitea.psi.ch/mx/AareDAQ/commit/4c3b0ce64d59fa401913158a15d6a2c33232d56d))
The socket used library defaults, so a GUI that stalls builds its own private FIFO of up to 1000
messages — 20 s of video at 50 Hz — plus whatever the autotuned kernel receive buffer holds on
top. PUB/SUB pipes are per-subscriber, which is why only aareGUI lagged while the other receivers
stayed current.
RCVHWM=4 makes the producer drop frames for this subscriber once it is muted, instead of queueing
them, and a fixed RCVBUF stops the kernel hiding a further few dozen frames behind the HWM.
Measured against a flooding publisher, the buffered backlog drops from 1000 frames to 4.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP
- Build the sample camera QPixmap on the GUI thread
([`c842856`](https://gitea.psi.ch/mx/AareDAQ/commit/c842856fe0482e93374c561f3fb83de7d39e59fe))
QPixmap is a GUI-thread-only class in Qt; the worker was constructing one per frame via
QPixmap.fromImage. It happens to work with the raster backend, which is why this has not bitten
us, but it is not supported and the guarantee is not ours to rely on.
The subscriber now emits QImage — which is explicitly safe to build and move between threads — and
_on_sample_camera_frame converts once on the GUI thread before handing the pixmap to the visible
view. No extra copy: the .copy() that detaches the QImage from the numpy buffer was already there.
Verified end to end against a real PUB socket: the payload delivered is QImage, the slot runs only
on the main thread, and frames still decode.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP
- Drain the sample camera SUB socket to the newest frame
([`d63b4ad`](https://gitea.psi.ch/mx/AareDAQ/commit/d63b4ad1799c5c97eb6992eebeb56b77b23f7253))
The SUB socket is strictly FIFO, so once the GUI falls behind at 50 Hz it stays behind: every recv
returns the oldest queued frame and the lag never recovers on its own. zmq.CONFLATE cannot fix
this because it keeps only the last *part* of a message, which shreds the multipart header+payload
frames the producer sends.
recv_multipart is atomic, though — a non-blocking recv either yields a whole message or raises Again
— so draining in a loop is a multipart-safe conflate. The drain runs after the previous frame's
decode, so it discards exactly the backlog that built up while we were busy, and the socket is
consumed at line rate regardless of how long a frame takes to decode.
Verified against a real PUB/SUB pair: 100 queued multipart messages collapse to the newest one with
both parts intact, and RCVTIMEO is still honoured when the queue is empty.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP
- Pace sample camera frames to what the GUI can paint
([`a4a8b80`](https://gitea.psi.ch/mx/AareDAQ/commit/a4a8b8029abdb14d1aafd380486562216af369e4))
image is a queued cross-thread signal and Qt's event queue has no high-water mark, so this queue
grew without bound independently of ZMQ: with a 50 Hz feed and a GUI painting slower, the
displayed frame fell further behind for as long as the stream ran. Measured on a stand-in at 15 ms
decode / 25 ms paint, the displayed frame aged from 40 ms to 2010 ms over three seconds and kept
going.
Two changes:
- Emit once and fan out on the GUI thread to whichever view is actually on screen, rather than
connecting all three SampleCameraImageLabels. Two of the three are always hidden (tab / compact
page / portrait page), so this is one repaint per frame instead of three.
- Cap the frames in flight and drop rather than queue past it. The cap is 2, not 1, so a frame can
be queued while the GUI paints the other: at 1 the GUI idles waiting for the next decode (33.3 fps
displayed), at 2 it does not (40.0 fps) for one extra frame of latency. Both stay bounded — 40 ms
and 62 ms respectively, flat over the run.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP
- Satisfy basedpyright on the Optional subscriber and socket
([`c0b0994`](https://gitea.psi.ch/mx/AareDAQ/commit/c0b0994feddc8a51d49fef66f601a183d16b7f4d))
CI lint failed on reportOptionalMemberAccess: prediction_thread is None when the GUI runs without a
sample feed, and _sock is nulled by run()'s cleanup, so both attributes are Optional to the
checker even though the flagged call sites cannot see None at runtime. Guard the slot and bind the
socket to a local asserted non-None in _recv_latest.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
### Code Style
- One PSI red for every busy camera badge, blue only for robot cooling
([`7c1efe4`](https://gitea.psi.ch/mx/AareDAQ/commit/7c1efe43847d5e0216b8889b84f82eb39a77551a))
AUTO CENTERING, ROBOT MOUNTING/UNMOUNTING/DRYING and BEAMLINE BUSY each had their own accent
(purple, red, orange, yellow, maroon), so the sample camera read as a per-activity rainbow instead
of one "hands off" signal. All busy states now share BUSY_PSI_RED; ROBOT COOLING keeps blue
because it is the long, harmless phase the operator should read as "wait".
The five near-identical BusyOverlayStyle blocks collapse into one _animated() helper plus a text
lookup, and the now-unused purple/orange/ red-badge constants are dropped from styles.py.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Paint the unknown-session badge with the viewing-mode style
([`dbd5b90`](https://gitea.psi.ch/mx/AareDAQ/commit/dbd5b9078f6223ff81bc5af1448fa952a09ea141))
The sample camera drew its own gold/orange/red "Session Vacant / Baton Requested / Guest Mode" box
whenever the busy overlay had nothing to show. Since the busy-style builder already receives the
session state, that box only ever appeared while the session was still unknown (no status yet, or
one without a session), so it flashed a different color and shape than the yellow "Viewing mode,
click here to grab the baton" badge every known not-owned state gets.
Hoist that badge into VIEWING_MODE_STYLE and paint it from both paths; the hover fill is shared
through _badge_fill. The three MARK_TOOLTIP constants had no other users and are dropped.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
### Testing
- Cover the sample camera pacing, the newest-frame drain and the frame slot
([`c3e7b9a`](https://gitea.psi.ch/mx/AareDAQ/commit/c3e7b9a2cc2670e6a4cf83e5e00f6aabc0a5918b))
CI's diff-coverage gate sat at 29% because the ZMQ fixes live in code no test reached: the
subscriber's socket setup, _emit_image/notify_frame_ displayed, _recv_latest and the run() frame
path, plus the main window's frame slot. The subscriber now runs against a real inproc socket (the
drain and the in-flight cap are the fix, so a mock would prove nothing); run() is driven with a
stubbed _recv_latest that hands over one JPEG and then stops. The busy overlay gets a check that
cooling is the only blue busy state.
The subscriber fixture takes qapp so no QImage is built before the QApplication exists.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Format the mocked token and cast the tell-state stand-in for basedpyright
([`ccb71bf`](https://gitea.psi.ch/mx/AareDAQ/commit/ccb71bf43fb511eed4bde5d594a032075cc48734))
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Route the tell-state stand-in through object for basedpyright
([`a56457d`](https://gitea.psi.ch/mx/AareDAQ/commit/a56457d03bb6fe7f4f1e3bef0fec64703f46a226))
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.23.0 (2026-09-08)
### Bug Fixes
- Keep user values in the scan panels across sample mounts
([`8833f3a`](https://gitea.psi.ch/mx/AareDAQ/commit/8833f3a9d1ed21f79c2f2f6a15365bf0e86718ea))
The panels kept the effective detector distance, resolution and transmission in their own
attributes, and a sample change overwrote those from the spreadsheet whatever the Database/User
toggle said. The fields went on showing the user's numbers while the scan request carried the
database ones, so a value had to be re-entered after every mount.
The fields are now the only place a value lives. Each setting is worth, in order: what the user
typed while "User values" is selected, what the mounted sample asks for, the panel default - one
rule, ScanSettingsPanel ._setting, that each panel spells out a line at a time. Overrides are per
setting, so a setting the user did not touch keeps following the sample.
Along the way:
* DbOverrideLineEdit is gone; the panels use NumberLineEdit directly, and the per-widget
database/user bookkeeping is replaced by SampleParameters, the one place that knows the aareDB
spreadsheet column names. * The (name, widget, converter) mapping loops with getattr/hasattr are
replaced by explicit per-field commit slots. * The omega speed cap no longer drives one field's
validator from another field's value: it is a read-out plus a check on the pair at Run time. *
_add_row/_add_pair_row build the label/field/unit rows, which also puts the Total angle degree
sign on its own row instead of the header above.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JHoUkj66jxByS2ypY5h9Mn
- Put Mount next in the automation row, gated to the Queued view
([`bc8137a`](https://gitea.psi.ch/mx/AareDAQ/commit/bc8137a389653208ea13f262711da4dd8f7ece94))
The button was parented to the dewar tab but never added to a layout, so Qt painted it at (0, 0)
over the TELL sample changer banner. It now sits left of Unmount in the automation row (docked and
pop-out), greyed out outside the Queued view like Remove/Clear. A trailing stretch keeps the row's
buttons at their natural width instead of sharing the spare space.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Read the aareDB total angle from the column that exists
([`7cc662b`](https://gitea.psi.ch/mx/AareDAQ/commit/7cc662bfd85df3f23823587835a8a6443e6f34fc))
The column is totalangle, not totalrange, so reading it raised AttributeError four times a second in
the status loop.
Reading a spreadsheet cell now goes through _spreadsheet_float, which treats a missing column, an
empty cell and a cell that does not hold a number all as "not set" and logs the column once.
aareDB owns these names; the GUI should fall back to its defaults when one moves, not die on the
status loop it is read from.
Note that the same misspelling is still in daq.py (spreadsheet_params and get_auto_raster_params),
where getattr's default hides it: automation has never picked up the total angle from the
spreadsheet either.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JHoUkj66jxByS2ypY5h9Mn
- Read the aareDB transmission as the percentage it is
([`63d902a`](https://gitea.psi.ch/mx/AareDAQ/commit/63d902a82acce4742f635f999b302d78ca731788))
DataCollectionParameters.transmission is a StrictInt documented as "positive, between 0 and 100"
(aareDB's own API description of the spreadsheet payload), while every model that consumes it
wants a 0-to-1 fraction. The old "divide by 100 only when above 1.0" guess therefore turned a
spreadsheet asking for 1% into a scan at 100% transmission - a hundredfold dose on the sample. A
fraction cannot be stored in that column at all: the model rejects 0.2.
The mapping test now builds a real DataCollectionParameters instead of a stand-in namespace, so a
renamed column fails the test rather than the beamline. That is what let 'totalrange' through.
daq.py's spreadsheet_params and get_auto_raster_params still carry both the old column name and the
same transmission guess.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JHoUkj66jxByS2ypY5h9Mn
- Take the aareDB transmission as the fraction aarecommon >= 0.7 declares
([`f1cf55a`](https://gitea.psi.ch/mx/AareDAQ/commit/f1cf55adb9b9be3c244128115cb51123e5df8a3d))
CI resolves aarecommon 0.7.3, where DataCollectionParameters.transmission is a 0-to-1 fraction that
rejects anything above 1.0 (the percent sheets are converted inside AareDB >= 0.83, which main
already requires). The divide-by-100 from the earlier 'percentage' fix therefore failed the model
test on CI and would have turned 20% into 0.2% at the beamline. Pass the fraction through and pin
aarecommon>=0.7.3 so the older int percentage model can no longer be installed; relock.
Also satisfy the diff typecheck gate: basedpyright only counts instance variables assigned in
__init__, so the Database/User toggle widgets are created there and _build_source_toggle only lays
them out.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
### Features
- Show AUTO CENTERING in the sample camera view while a loop centering runs
([`f20bd06`](https://gitea.psi.ch/mx/AareDAQ/commit/f20bd065f561fd123855e189a165ec0dbdf9e266))
/status cannot tell an auto centering from a manual alignment move (both are busy + SampleAlignment,
the combo the overlay deliberately hides), so the DAQ worker emits its own auto_centering flag:
True while its own /alc/center_loop POST is in flight (the endpoint blocks until done) or while
the automation progress reports the Center step running. The sample camera views pass it to
build_busy_overlay_style, which paints a purple AUTO CENTERING wave text like the ROBOT
MOUNTING/COOLING ones.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.22.1 (2026-09-08)
### Bug Fixes
- Update aaredb dependency
([`3ff0f41`](https://gitea.psi.ch/mx/AareDAQ/commit/3ff0f4132267aeea6549c6507a1a3465df31d6b8))
## v0.22.0 (2026-09-07)
### Bug Fixes
- Increase baton hand over button size and make divider more visible
([`cb368f8`](https://gitea.psi.ch/mx/AareDAQ/commit/cb368f87cd06172a05f39d2a1ce527b192c89091))
- Lint error
([`9c489ff`](https://gitea.psi.ch/mx/AareDAQ/commit/9c489ffbb5a5577cb90794bf0547bb4b0bc8acbd))
- Max Chi should be 30 instead of 40
([`046720a`](https://gitea.psi.ch/mx/AareDAQ/commit/046720ae43e093cbd22f2d13a1543814fab15aaf))
### Code Style
- Increase visibility of separator
([`c32f708`](https://gitea.psi.ch/mx/AareDAQ/commit/c32f708716c1fe090e9c3d446b4240b5a7a90ff8))
### Features
- 900 Hz at 6d and 120 Hz at 10s for data collection. Paint input correspondingly.
([`4163022`](https://gitea.psi.ch/mx/AareDAQ/commit/416302224ce5c67746a84180462c7c16ae50054e))
- Just mount the next sample in the queue list
([`8581527`](https://gitea.psi.ch/mx/AareDAQ/commit/85815278bb64986bd780becd5447f84f8126352d))
- **gui**: Hide ML detections by default
([`50c0885`](https://gitea.psi.ch/mx/AareDAQ/commit/50c08853d80d268520963352b0fe0684e9c0b31c))
Fresh profiles start with the sample-camera ML box overlay off; the QSettings key
samcam/show_detections still persists a user opt-in.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
## v0.21.3 (2026-09-04)
### Bug Fixes
- Add more debug logging to aarescan commands
([`da73c15`](https://gitea.psi.ch/mx/AareDAQ/commit/da73c15f9a07462f8372dc87862f4fc90e93036c))
## v0.21.2 (2026-09-04)
### Bug Fixes
- Add more debug info logging to automation runs
([`339f666`](https://gitea.psi.ch/mx/AareDAQ/commit/339f6666da887f37336d86cae28e480c0e338057))
## v0.21.1 (2026-09-02)
### Bug Fixes
- Truncate chi metadata at 0
([`386e301`](https://gitea.psi.ch/mx/AareDAQ/commit/386e301dde192b91be4103f72b278a3ff594d426))
## v0.21.0 (2026-09-02)
### Code Style
- Rearrange order and give more space to omega symbol
([`3e5f5fb`](https://gitea.psi.ch/mx/AareDAQ/commit/3e5f5fb7a4029b944061a1a0e14e3fd9eb54cbf5))
- Update wording to put action first, for clarity
([`47c4e3a`](https://gitea.psi.ch/mx/AareDAQ/commit/47c4e3ab04c555d87ac5133daae97a99c91a8cc5))
### Features
- Make the raster grid stronger and more visible
([`675dd2c`](https://gitea.psi.ch/mx/AareDAQ/commit/675dd2c1c33b116c18125e7c7f5413bd12fcbe77))
### Testing
- No need to compare wording
([`0696b58`](https://gitea.psi.ch/mx/AareDAQ/commit/0696b583b03fb0d8de8c3647196348ab21a149c6))
## v0.20.0 (2026-09-01)
### Features
- Pass smargon phi and chi positions to jfjoch
([`13a42c9`](https://gitea.psi.ch/mx/AareDAQ/commit/13a42c98a38086b9aa77ce1b00b21643c419226b))
## v0.19.5 (2026-09-01)
### Bug Fixes
- Set zoom to 300 for auto xray center grid prediction
([`52c40da`](https://gitea.psi.ch/mx/AareDAQ/commit/52c40da1147d3b148e4b05ec1c8a1aecc2273197))
## v0.19.4 (2026-09-01)
### Bug Fixes
- Default detector tilt in gui to 0
([`d3ff38f`](https://gitea.psi.ch/mx/AareDAQ/commit/d3ff38f484a3f0f27237960f4b422cdce26154be))
- Separate detector tilt geometry per beamline
([`9939df6`](https://gitea.psi.ch/mx/AareDAQ/commit/9939df6767f995c8cc92eafbebe9613ad4df222f))
### Chores
- Update jfjoch client dependency
([`08866f8`](https://gitea.psi.ch/mx/AareDAQ/commit/08866f8cc5991d6d624fa3fc25eaf74b373fe644))
## v0.19.3 (2026-09-01)
### Bug Fixes
- Adjust gap when changing energy
([`e8bd2f5`](https://gitea.psi.ch/mx/AareDAQ/commit/e8bd2f59c6a8377443f700f67629f827c49a5e19))
- Cached read from BEC client devices
([`db6b09f`](https://gitea.psi.ch/mx/AareDAQ/commit/db6b09fa2441b136d5732b96ae880fbda4dfcefa))
## v0.19.2 (2026-08-31)
### Bug Fixes
- Return beam center in correct format
([`e027ccb`](https://gitea.psi.ch/mx/AareDAQ/commit/e027ccbfb181b455bc622be7a1b1a5227cf2dda5))
## v0.19.1 (2026-08-31)
### Bug Fixes
- Add .json to package data
([`40ea80b`](https://gitea.psi.ch/mx/AareDAQ/commit/40ea80bb81f9413acbadd7ee85e7de987792ab72))
- Report user friendly error on attempted file overwrite
([`6e1085b`](https://gitea.psi.ch/mx/AareDAQ/commit/6e1085bfdf6d66956f0caf8319149267358070a5))
## v0.19.0 (2026-08-31)
### Features
- Add 1D beam center config for 10S
([`8797d55`](https://gitea.psi.ch/mx/AareDAQ/commit/8797d555a72b472bd909d725a42150e14cafd008))
## v0.18.0 (2026-08-31)
### Bug Fixes
- Add the transmission_updated signal back
([`49d7089`](https://gitea.psi.ch/mx/AareDAQ/commit/49d7089d69a5227a1c9b97e77d8374833b9ee6de))
- Move beam transmission back and just add a new name for screening transmission
([`07e0cad`](https://gitea.psi.ch/mx/AareDAQ/commit/07e0cad909b30f0069be0d05bc09e3492a54c649))
### Code Style
- Check QPushButton height
([`84ab3ce`](https://gitea.psi.ch/mx/AareDAQ/commit/84ab3ce57a882d37e5916d6c0261e11cf3585edf))
- Reduce separator hint deplay to 66
([`3d60293`](https://gitea.psi.ch/mx/AareDAQ/commit/3d602931e9b5612c51acc90d549833502531f925))
### Features
- Add 4x60 and 5x45 for screening
([`0ba8c5c`](https://gitea.psi.ch/mx/AareDAQ/commit/0ba8c5cef67eed574ece4d948bb89b6c63dfcc4f))
- Allow screening to take a different transmission input
([`5515673`](https://gitea.psi.ch/mx/AareDAQ/commit/5515673d81fb3b2d336a508abcb6b0d79b0cd6c3))
- Demote warning from reference tools so it does not be too obvious in user GUI
([`7b1ee68`](https://gitea.psi.ch/mx/AareDAQ/commit/7b1ee682d1e44b722c351dfa76305374f7f007c1))
## v0.17.5 (2026-08-27)
### Bug Fixes
- From debugging
([`c5b3bd9`](https://gitea.psi.ch/mx/AareDAQ/commit/c5b3bd9e9efddd3d8df77bfd61c1c736654ee507))
## v0.17.4 (2026-08-27)
### Bug Fixes
- Current state reading
([`588419c`](https://gitea.psi.ch/mx/AareDAQ/commit/588419c05743c9fa577ed375f9ec8c92094b6911))
- Improve log messages
([`3b7fe21`](https://gitea.psi.ch/mx/AareDAQ/commit/3b7fe21fcd37fc3a440326e2ecc0617a8af373ac))
### Code Style
- Reformat
([`8029a93`](https://gitea.psi.ch/mx/AareDAQ/commit/8029a937e5a4b9da8235a9691879db28bb3f0daf))
## v0.17.3 (2026-08-26)
### Bug Fixes
- Update different macro sigs for 10s vs 6d
([`3a24f20`](https://gitea.psi.ch/mx/AareDAQ/commit/3a24f2010f89bfe174f4f2748fdf3f8a45de5990))
## v0.17.2 (2026-08-25)
### Bug Fixes
- New import locations and types for bec macros
([`caa4e22`](https://gitea.psi.ch/mx/AareDAQ/commit/caa4e22cc4edf7a16d671ca3a010d8fb36781f46))
### Continuous Integration
- Skip 3.11
([`228f3b9`](https://gitea.psi.ch/mx/AareDAQ/commit/228f3b9cc20b848ef604b7942f3195a69ca07ca3))
## v0.17.1 (2026-08-25)
### Bug Fixes
- Add harder timeouts to uvicorn.run
([`2b85428`](https://gitea.psi.ch/mx/AareDAQ/commit/2b85428ebe072799c8ee21e4b393666bcaf32ada))
- Tidy bec client init and shutdown
([`1ac4908`](https://gitea.psi.ch/mx/AareDAQ/commit/1ac4908053637abb72c3b1c452c8332998113efc))
## v0.17.0 (2026-08-25)
### Code Style
- Reorder the position of measured tab
([`838ae18`](https://gitea.psi.ch/mx/AareDAQ/commit/838ae1828b6321bb59727013ddb58523052539c9))
### Features
- Disable Reload DB params and related usage
([`96d7e82`](https://gitea.psi.ch/mx/AareDAQ/commit/96d7e82f48cab8669f5bcff68a8844a7758aa13d))
## v0.16.0 (2026-08-25)
### Bug Fixes
- Simulated bec macros
([`1902749`](https://gitea.psi.ch/mx/AareDAQ/commit/1902749fa563906ee0fd4bc31c663e4e60d5ebf9))
### Features
- Guard beam steering and auto exposure
([`e87a207`](https://gitea.psi.ch/mx/AareDAQ/commit/e87a20745257e9eb9de93c958c2615a2289a1d3c))
## v0.15.0 (2026-08-25)
### Bug Fixes
- Beam centre model instantiation
([`24c3741`](https://gitea.psi.ch/mx/AareDAQ/commit/24c3741465b8ebeb64d914da04e4e7b23fd2eb8f))
- Reference to beamline in bec worker
([`8ad3042`](https://gitea.psi.ch/mx/AareDAQ/commit/8ad3042e0dd32b579622b341d37820afe6655b05))
- Typing in dispatch
([`15a7ca4`](https://gitea.psi.ch/mx/AareDAQ/commit/15a7ca464e3f4e8c450a3f47ae1ca8661a21fecf))
### Chores
- Bump aarecommon minimum
([`98c2376`](https://gitea.psi.ch/mx/AareDAQ/commit/98c2376b666ad7d5664b4ad0f261b51842e6be97))
### Features
- Extend beamline dispatch with geo class
([`7e1a816`](https://gitea.psi.ch/mx/AareDAQ/commit/7e1a8162b2c5d9b1818808b33d1b677bd140b5ff))
- Load beam centre model from config
([`59300da`](https://gitea.psi.ch/mx/AareDAQ/commit/59300da4acdecff8e324f06a4ca2d02bffccc84c))
- Use beam centre model for diffractiongeometry
([`7e203ce`](https://gitea.psi.ch/mx/AareDAQ/commit/7e203ce4a9823fe00132fc8c33f0b5b892935c53))
- Use live beam center throughout daq
([`df376ca`](https://gitea.psi.ch/mx/AareDAQ/commit/df376caf659fd96a73e4ff5d73c4353c4b8d3abe))
## v0.14.0 (2026-08-24)
### Bug Fixes
- Energy spin movestate colors never rendered
([`b984a36`](https://gitea.psi.ch/mx/AareDAQ/commit/b984a36f7cc3c5fd03e16f21d4d2772b748b5894))
The movestate property sat on the spinbox's inner QLineEdit, which both themes deliberately paint
transparent (QAbstractSpinBox QLineEdit rule) - the state machine worked but no color ever showed,
and the tests only asserted the property, not the paint. The property now lives on the spinbox
itself with QAbstractSpinBox[movestate=...] added to both themes' rules, verified by a
pixel-sampling regression test that grabs the rendered widget through the real stylesheet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Energy tolerance to 0.001 instead of 0.01
([`789b2ae`](https://gitea.psi.ch/mx/AareDAQ/commit/789b2ae6e207abadc94a45efb89f6111520ea429))
- Wheel include png and svg
([`855632d`](https://gitea.psi.ch/mx/AareDAQ/commit/855632d5b54425d0a848fa3267448dfd9942723c))
### Chores
- Cleanup repeating code
([`09f81c8`](https://gitea.psi.ch/mx/AareDAQ/commit/09f81c8392426cc3e940e885b06bd6785d720889))
- Sync uv.lock with 0.13.4 version bump
([`d65ff27`](https://gitea.psi.ch/mx/AareDAQ/commit/d65ff27b3a96921ad29be13faa059ac96a189567))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Code Style
- Make the banner text colored
([`3192fd2`](https://gitea.psi.ch/mx/AareDAQ/commit/3192fd2388f96dbeaf0fd3091f368f337f627bac))
so it shows on white/black background
### Features
- Allow dismissing notification. Trial. If not good, revert this.
([`bdafc03`](https://gitea.psi.ch/mx/AareDAQ/commit/bdafc03963346490d27f343a5896609e434241c8))
- Bound Set Energy to a 4-20 keV placeholder range
([`225d706`](https://gitea.psi.ch/mx/AareDAQ/commit/225d7064c40d12651bdcf59a3e71e35a2c058b2b))
Both Set Energy rows allowed 1-30 keV, an arbitrary spinbox default; nothing downstream validates
the request (daq.change_energy forwards straight to bec). Shared ENERGY_MIN/MAX_KEV constants now
bound both spins to 4-20 keV with a tooltip flagging the range as pending Beamline Scientist
confirmation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Motormovegroup semantics for both Set Energy rows
([`e1d11aa`](https://gitea.psi.ch/mx/AareDAQ/commit/e1d11aa94904b2411cc0142d155d720d25c3cbe8))
The energy setpoint applies via the Change Energy button, not Enter, so it gets the full motor state
machine instead of the typing-pending color: neutral tracks the readback, a user edit stages
pending (and is the only thing that enables the button), the click turns moving, and readback
arrival within tol returns to neutral. New SpinMoveState in motor_move_group.py adapts the pattern
to a QDoubleSpinBox+button pair (colors ride the movestate QSS via the spin's internal QLineEdit);
replaces the hand-rolled pending-until-click in the exp-config row and covers the Beamline setup
row that had no color at all. The server's 0.0 detector-unavailable energy is kept out of the
readback feed so it cannot clamp the spin to the range minimum.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Pending color while typing in Experiment configuration values
([`3e7c334`](https://gitea.psi.ch/mx/AareDAQ/commit/3e7c334abb9a518f97c990affcb59468180882a5))
Values inside the Experiment configuration banner now show the same pending color as the motor move
boxes while the typed text differs from the applied value; Enter (or focus-out) commits as before
and clears it. Opt-in via NumberLineEdit(track_pending=True) because MotorMoveGroup owns the
movestate property on its registered boxes; reuses the existing movestate QSS, so no new styling.
The Set Energy spinbox marks pending until Change Energy is clicked, since its apply gate is the
button.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Testing
- Log panel
([`c71676a`](https://gitea.psi.ch/mx/AareDAQ/commit/c71676a29c73ce3a0fb07ce193f6569d17ccfdf2))
- No need to test energy 0 and update tolerance
([`a19cbf1`](https://gitea.psi.ch/mx/AareDAQ/commit/a19cbf10815c8faa5595c6118d4d58319ae0d62c))
test: update test...
- Sample padding pixel so movestate colors survive Linux fonts
([`a7bd46c`](https://gitea.psi.ch/mx/AareDAQ/commit/a7bd46c14be06735fd195c38687b032db9a79096))
x=20 sits on a digit glyph with CI's Linux fonts, so the assert compared an antialiased glyph blend
against the pure background. The padding area (border 1px + padding 6px) can never contain text on
any font.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147jE48bQUTm9AqNQApT6b2
## v0.13.5 (2026-08-24)
### Bug Fixes
- Dont unmoount sample on park and dry recovery
([`4379b8a`](https://gitea.psi.ch/mx/AareDAQ/commit/4379b8a1a54c4cff8e7405edbb3527d9441dbb6f))
- remove now-redundant "dry" endpoint
- Update gui to remove dangerous robot commands
([`772ba2c`](https://gitea.psi.ch/mx/AareDAQ/commit/772ba2c026baff1d05703e35259dedca31b52c29))
## v0.13.4 (2026-08-24)
### Bug Fixes
- No moving to combined view in moving state
([`1a17e26`](https://gitea.psi.ch/mx/AareDAQ/commit/1a17e260562bf2fac1a45ea706f497d4f9c98706))
### Code Style
- Linting fix
([`fc5daae`](https://gitea.psi.ch/mx/AareDAQ/commit/fc5daaefa4b196ec4b071e3ca0123b81dfd04038))
### Testing
- Moving state no longer flips to combined view
([`1a9f4d8`](https://gitea.psi.ch/mx/AareDAQ/commit/1a9f4d8709d479ea35ffb31c8a3b9220d967b8b2))
The fix removed Moving from the motion-watch trigger but the unit test and code comment still
described the old behavior, so pre-push failed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.13.3 (2026-08-21)
### Bug Fixes
- Always trunacte dtz
([`4a4b58a`](https://gitea.psi.ch/mx/AareDAQ/commit/4a4b58ae10c1b442249d1051a9cb76114394920f))
## v0.13.2 (2026-08-21)
### Bug Fixes
- Truncate detector distance parameter calculation at soft limit
([`a6ad306`](https://gitea.psi.ch/mx/AareDAQ/commit/a6ad306849e136c8f23827724aa1b835d0ca0e74))
## v0.13.1 (2026-08-21)
### Bug Fixes
- Actually bump the version and also remove the CLAUDE.md that is used for local testing only
([`d66aa49`](https://gitea.psi.ch/mx/AareDAQ/commit/d66aa49ed383d1b050c8bfcbd19cbe60a1fc5013))
## v0.13.0 (2026-08-20)
### Bug Fixes
- Combined view only when state is moving or when in robotsampleexchange
([`d5c66af`](https://gitea.psi.ch/mx/AareDAQ/commit/d5c66afba9a84a2614676480381d745184c14ddb))
- Dialog not going away after getting baton, and the accept/cancel too small
([`1af38fc`](https://gitea.psi.ch/mx/AareDAQ/commit/1af38fcbd3c93627eb47bb76ed6fcd3af8a26cb4))
- Satisfy lint and diff-coverage gates for admin gating
([`8b6ae51`](https://gitea.psi.ch/mx/AareDAQ/commit/8b6ae51ce6106d37b3d393fafb26136276e0f860))
basedpyright requires _admin_tip_anchor to exist after __init__, so the anchor is created eagerly
instead of lazily. Cover the red-tip branch and the status-bar menu gate; the menu test swaps in a
QMenu subclass with a no-op exec because PySide method lookup ignores class-attr monkeypatches.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Update staff linux group
([`a37d622`](https://gitea.psi.ch/mx/AareDAQ/commit/a37d622e0aee734174c1dbb445746ca70c4128ec))
### Chores
- Do not use the special red tooltip, stay consistent
([`ef4bc01`](https://gitea.psi.ch/mx/AareDAQ/commit/ef4bc011ab89d309f99a90dc95fdf0d4a756a0a7))
- Enhance contract between input box and button
([`47f2939`](https://gitea.psi.ch/mx/AareDAQ/commit/47f2939d476f67342a18220f21a7cbbdd2ccaab9))
- Fix wording
([`d52a31b`](https://gitea.psi.ch/mx/AareDAQ/commit/d52a31be5413d06c61a06f5eb32e4d21cea06df3))
- Rename button to make it more sensible
([`4917b62`](https://gitea.psi.ch/mx/AareDAQ/commit/4917b62e53cee59de147cbabad73333807357c2e))
- Sync uv.lock with 0.12.0 version bump
([`3b2fa59`](https://gitea.psi.ch/mx/AareDAQ/commit/3b2fa597a67eb527c084a8e85cbea6455cced1b3))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Sync uv.lock with 0.12.4 version bump
([`0cff706`](https://gitea.psi.ch/mx/AareDAQ/commit/0cff706a11fd5133f68819d45ce8957791dc98d5))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Sync uv.lock with 0.12.5 version bump
([`3df3683`](https://gitea.psi.ch/mx/AareDAQ/commit/3df3683b75cb0aab5ea96fa81203447c588c7815))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Features
- Admin-gate beam diagnostics states, warn via passive red tip
([`569b024`](https://gitea.psi.ch/mx/AareDAQ/commit/569b0244565b547d57faace86faffdb73191c24c))
Beam location, Beamstop alignment and Flux measurement grey out for non-staff in the state strip and
the status-bar transitions menu. All "not admin" denials now show as an auto-dismissing QToolTip
on a Catppuccin red wash instead of a click-to-close QMessageBox.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Allow non-staff to change energy
([`4fbda86`](https://gitea.psi.ch/mx/AareDAQ/commit/4fbda86631b78c14061b0f58137f9cb598abbb00))
- Auto-centering row with apply-after-mount, grid button raster-only
([`36675e0`](https://gitea.psi.ch/mx/AareDAQ/commit/36675e02048de2c1c5712140825193226909e5bc))
Auto Centering moves out of the experiment tabs to its own row between Manual sample and Exp.
Config., with an apply-after-mount checkbox that re-runs it on every detected sample mount
(guarded against firing on GUI startup). Draw a Grid now only shows on the Raster scan tab.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fold expanded help cheatsheet when mouse leaves the box
([`64058ae`](https://gitea.psi.ch/mx/AareDAQ/commit/64058ae6c8a1a84f0e05d345584842230cf1e3da))
Click is no longer the only way back to the "?" badge: moving the pointer off the expanded box, or
out of the widget entirely, folds it. Checked before the interaction gate so it works in viewing
mode too.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Hover HUD with pixel coords and grey scale bar on sample camera
([`5f068a6`](https://gitea.psi.ch/mx/AareDAQ/commit/5f068a630563cab6c8f82f208bd8f1be9ca6c8fe))
Bottom-right corner shows the hovered pixel coordinates with a grey 1-2-5 scale bar above them,
derived from geom.pixel_in_mm and the current zoom. Works in viewing mode (before the interaction
gate), clears on leave, and skips drawing outside the image.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.12.5 (2026-08-20)
### Bug Fixes
- Aerotech position update
([`d29ace1`](https://gitea.psi.ch/mx/AareDAQ/commit/d29ace156e73593513296c5f1e831875d766d0a5))
- Magnet position sensor timeout
([`a39e974`](https://gitea.psi.ch/mx/AareDAQ/commit/a39e97469fca485880ff36ee35bb55781b7936a0))
## v0.12.4 (2026-08-20)
### Bug Fixes
- Pitch scan message for correct beamline
([`4f5cb08`](https://gitea.psi.ch/mx/AareDAQ/commit/4f5cb08319dc61b6b28b99c1950b516192da4389))
## v0.12.3 (2026-08-20)
### Bug Fixes
- Do not multiply screening request by steps
([`1756cab`](https://gitea.psi.ch/mx/AareDAQ/commit/1756caba690f637db7bb8787318346fa66aecc30))
- Read beamline state from BEC on server startup
([`dd04a2f`](https://gitea.psi.ch/mx/AareDAQ/commit/dd04a2fc89c81e71c84669312bc48afe76126574))
## v0.12.2 (2026-08-20)
### Bug Fixes
- Save collimator positions
([`002dba7`](https://gitea.psi.ch/mx/AareDAQ/commit/002dba774245ea35b0ec90a8ede3fc91b30bbc4c))
## v0.12.1 (2026-08-20)
### Bug Fixes
- Update bs x and y instead of z
([`a36a051`](https://gitea.psi.ch/mx/AareDAQ/commit/a36a051a2b968a8e5c345319cd909223ab591d7e))
## v0.12.0 (2026-08-19)
### Features
- Connect beam steering routine to GUI
([`de0445e`](https://gitea.psi.ch/mx/AareDAQ/commit/de0445efdd671940d926989892260cb104bb6f71))
## v0.11.0 (2026-08-18)
### Bug Fixes
- No BEAMLINE BUSY overlay during Sample alignment
([`16b61b8`](https://gitea.psi.ch/mx/AareDAQ/commit/16b61b886b2c97664c148f0e52cdbca70856ec80))
Same exception as the motion watch: busy in Sample alignment is the alignment itself, and the sample
motion is watched in these very views - the curtain hid exactly what the user needed to see. Gated
at both style call sites (sample camera and the Axis views); the session-driven 'In viewing mode'
badge is unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Chores
- Update png so they have gaps
([`0f12b68`](https://gitea.psi.ch/mx/AareDAQ/commit/0f12b688fe79c776b9492d86052f22b611bc43eb))
### Code Style
- Collapse multiline _status calls for ruff format
([`167d78d`](https://gitea.psi.ch/mx/AareDAQ/commit/167d78db68a528af8c275e1923e2ef8cecd0b65d))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Features
- Status bar splits passive left / operable right
([`7a01a86`](https://gitea.psi.ch/mx/AareDAQ/commit/7a01a866ef5f942b3b5543bcc9c66c9210196dad))
Operable controls (Fast Shutter, State, p-group, Session) group right via addPermanentWidget and
share one hover affordance - hand cursor + underline - now owned by ClickableLabel; ValueLabel
opts out for the passive readouts, and the unwired busy label becomes a plain QLabel. Cryo sits
first in the operable group but stays passive: a cryo operation is planned (TODO in
status_bar.py), the placement just reserves its spot.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.10.0 (2026-08-17)
### Bug Fixes
- Measured threshold is rotation count >= 1
([`2909182`](https://gitea.psi.ch/mx/AareDAQ/commit/2909182bb104d96a5b2d44ae8bb33a5056a69d67))
Confirmed by Dawn: any rotation data counts as measured; unmeasured is exactly rotation count 0. The
old > 1 rule left single-rotation samples looking like still-to-do work in the Unmeasured view.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- No auto-switch to beamline view during Sample alignment
([`cb5837d`](https://gitea.psi.ch/mx/AareDAQ/commit/cb5837d90f03c02c56fd017f9eb714a2164e1753))
Busy in Sample alignment IS the alignment (centring moves) - yanking the view away to the combined
beamline tab hid exactly what the user was doing. The motion-watch switch now skips that state;
robot exchange and other busy transitions still switch as before.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Order sample count columns by workflow, unwire crossed columns
([`f303f29`](https://gitea.psi.ch/mx/AareDAQ/commit/f303f29214c780b9c97e360b598d6a849e2f7a14))
Both bottom-dock tables now list mount -> raster -> screening -> rotation, the order the work
actually happens in. In the Auxiliary table the swap also fixes a real bug: data() feeds get_entry
header-index-minus-1, but rotation/raster were crossed against the header, so 'Raster count'
displayed rotation counts and vice versa.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Pyright-style ignore for setGraphicsEffect(None)
([`03ae77f`](https://gitea.psi.ch/mx/AareDAQ/commit/03ae77fa749a216412dc23045f2660e840ae1b98))
basedpyright disables mypy-style 'type: ignore' comments by default, so the diff-quality gate still
counted the violation; match the existing 'pyright: ignore[reportArgumentType]' convention from
main_window.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Chores
- Clarify move to mounting position in smargon movement
([`adcc63d`](https://gitea.psi.ch/mx/AareDAQ/commit/adcc63d45cfaf95357b86fd311d8b5c8a5d06b22))
### Code Style
- Expanded help overlay opens top center, under the badge
([`3053aaa`](https://gitea.psi.ch/mx/AareDAQ/commit/3053aaae9386bc108b429b036dab0b359a9446f1))
The '?' badge moved to the top middle but the cheat sheet still opened bottom-left, sending the
mouse across the view to close it. The overlay now drops in where the badge was.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Help badge at center top, More link right-aligned
([`a0baa2b`](https://gitea.psi.ch/mx/AareDAQ/commit/a0baa2b54dde762af27be62c7c15658728e797b6))
The '?' badge sat in a corner, which drifts oddly when the view is scaled to fit; the top middle
stays put and out of the sample's way. Transparency unchanged - visible enough to find, not
disturbing. 'More... (F1)' moves to the overlay's right edge, reading like a dialog's action
button.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Move Unmeasured next to All, 1px gap between filter chips
([`378c257`](https://gitea.psi.ch/mx/AareDAQ/commit/378c25799f9da4e393619439776d2e5af69d389e))
Unmeasured and All are both 'what is left' views; the hand-applied labels (Queued/Flagged/Measured)
follow. The 1px spacing keeps the chips readable as separate buttons instead of one solid bar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Wrap shutter flag f-strings for ruff format
([`32a835b`](https://gitea.psi.ch/mx/AareDAQ/commit/32a835b6616425fca6b2a9444705212cc98a5b1c))
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Features
- Add Unflag to the sample table context menu
([`900bc2f`](https://gitea.psi.ch/mx/AareDAQ/commit/900bc2f6f7f9c58a8c45d123f5c9bfb70319cb5e))
Below Mount/Unmount, acting on the selection like the queue actions. Flagging happens by dropping
rows on the Flagged chip; until now there was no way back. Disabled when nothing in the selection
is flagged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add Unmeasured filter chip to the sample table
([`4175cb8`](https://gitea.psi.ch/mx/AareDAQ/commit/4175cb8edfa6b732260d9a4f2c3f339216e9ba04))
Complement of Measured (rotation count <= 1): one click shows everything still to be done, so it can
be selected wholesale and queued. Plain chip like All - unmeasured rows carry no tint, so there is
no legend color to wear; cross-status marks (queued/ flagged) show like in the Measured view.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Breathe the pending transition target in the state strip
([`fbd40ee`](https://gitea.psi.ch/mx/AareDAQ/commit/fbd40eee90b96e517252a757c3e00e9af4902977))
While Moving, the target state sat solid blue and read as already reached. An opacity pulse
(QGraphicsOpacityEffect + QPropertyAnimation) marks it as in progress; a stylesheet animation
would repolish the button every frame, which the guarded updates in _apply_highlight exist to
avoid.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Clicking the '#' header selects all rows
([`4a728ba`](https://gitea.psi.ch/mx/AareDAQ/commit/4a728baf79a9fa677e83ccb895a1689901b6ce23))
The status column holds no sortable data, so its header click slot was free: it now does Ctrl+A,
pairing with the Unmeasured chip to grab everything still to be done in one motion. The sort
indicator is put back afterwards - the click drags it onto '#' even though the model ignores
sorting there.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Current energy readout in Exp. Config energy row
([`1fef282`](https://gitea.psi.ch/mx/AareDAQ/commit/1fef28231b707118f645e02f04ad3cf81e953349))
Mirrors the Beamline setup live readout above Set Energy, fed by the same DAQ tick with the
zero-energy guard and repaint skip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fast shutter open/close row in Beamline setup
([`8f91f1e`](https://gitea.psi.ch/mx/AareDAQ/commit/8f91f1ed2ed1cbca04dcd00f761292b0108b19a7))
Status flag on the left (same rich-text scheme as the status bar, theme-aware via set_theme),
Open/Close buttons on the right, wired to the same daq.open_shutter/close_shutter slots
staff-gated in main_window.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Live energy/wavelength readout in Beamline setup
([`2a82c59`](https://gitea.psi.ch/mx/AareDAQ/commit/2a82c598c0010a8d766cb781f31f0a4d85f09b2e))
New 'Current energy / lambda' row above the setpoint, fed per DAQ tick from diffraction.energy_keV;
the setpoint row is renamed 'Set Energy (keV)' so 'what is' and 'what to set' are distinct. Guards
energy 0.0 (server's detector-unavailable fallback) because the wavelength property divides by it.
The copied energy row in the experiment configuration is renamed to match.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Put the ExpHutch shutter left of the fast shutter
([`977483e`](https://gitea.psi.ch/mx/AareDAQ/commit/977483ef2843d56abe921fb8c6d999a130423c2e))
Beam-path order in the status bar: the hutch shutter sits upstream of the fast shutter, so it reads
left to right along the beam.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Queue controls live only in the Queued view
([`6ace1fc`](https://gitea.psi.ch/mx/AareDAQ/commit/6ace1fcbcfd8815f75c3d4498427050b35edc659))
Run/Remove selected/Clear list act on the queue, whose order only the Queued chip view shows - in
other views they are greyed out with a tooltip pointing at the chip. Run stays enabled while
automation runs so pausing is always possible. Applies to the docked trio and the pop-out clones
alike.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Queued chip view shows the actual run order
([`344888d`](https://gitea.psi.ch/mx/AareDAQ/commit/344888dac072090fcf33a751dfb330bd2094bee1))
The queue engine keeps insertion order and Run pops its head, but the Queued view sorted by the
dewar table's header sort - the top row was not what runs next. set_queued_ids now keeps the order
it is fed (the queue model's order) and the Queued view displays exactly that; header clicks no
longer reorder it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Sample camera starts in scale-to-fit
([`b58c23d`](https://gitea.psi.ch/mx/AareDAQ/commit/b58c23d0f65207a6ed15489fbcdeaa04acc2265a))
_autoscale now defaults on, so the view fits from the first layout (the constructor's placeholder
already carries the camera size and resizeEvent refits on every resize). update_pixmap
additionally refits when the frame size changes - the real stream resolution can differ from the
placeholder, and only a view resize refit before. Right-click 'Scale to fit' still toggles back to
1:1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Wave-animate the busy overlay titles
([`80063a5`](https://gitea.psi.ch/mx/AareDAQ/commit/80063a5df1c7c8b3c0c04aed6dfb5f160e477d47))
BEAMLINE BUSY and the robot warnings now hop per letter (clipped sine) so they read as an
in-progress signal, not a frozen label. Gated by a new BusyOverlayStyle.animate flag: 'In viewing
mode' stays static because it is a passive notice. No timer - the phase rides the wall clock and
repaints ride the ~20 fps camera frames, so the wave freezes with a stalled feed (which has its
own error surface).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Refactoring
- Replace Qt overrides with native mechanisms, install app filters once
([`c24da77`](https://gitea.psi.ch/mx/AareDAQ/commit/c24da7739b2f845094b875ad2943f0d736b66b3f))
Per-window installs of the two QApplication-level filters (cursor, wheel guard) stacked one stale
copy per MainWindow; now installed once per process, parented to the app. closeEvent overrides in
the baton dialogs replaced by finished.connect(timer.stop); keyPressEvent in VideoGraphicsView
replaced by WidgetShortcut QShortcuts; hover enter/leave overrides in PlayPauseButton replaced by
underMouse(); ValueLabel inherits ClickableLabel instead of duplicating its mousePressEvent. Dead
raster-timer branch and a PyQt5-era event-position fallback deleted; redundant try/except and
getattr guards dropped now that class-level defaults cover pre-init reads.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Testing
- Pin the Sample-alignment motion-watch exception
([`e9428ca`](https://gitea.psi.ch/mx/AareDAQ/commit/e9428ca64dece6f9a9c2be6fc5867c635b08449c))
Robot motion switches to the combined view; alignment beginning switches straight back while busy is
still set, and staying busy in alignment never re-triggers. Piggybacks on the init test's window -
extra MainWindow constructions feed the PySide teardown flake.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.9.0 (2026-08-17)
### Bug Fixes
- Busy flag in Axis views as plain status text, not a badge
([`69d552c`](https://gitea.psi.ch/mx/AareDAQ/commit/69d552c0683a1c7b7768c9491b78130cf52a1330))
Gonio camera, Beamline view and the combined view showed BEAMLINE BUSY in the rounded badge pill,
which reads as a clickable button. These views are passive, so draw the same shadowed colored text
the sample camera uses for its warnings; the pill stays only on the sample-camera session badges,
which really are click targets.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Clear basedpyright diff violations
([`5871c95`](https://gitea.psi.ch/mx/AareDAQ/commit/5871c959e22f9399430195ba2a1d41b9dc16c662))
Rename NumberLineEdit.validator to range_validator: the instance attr shadowed QLineEdit.validator()
and broke type checking at call sites. Annotate the smargon _move_axes dict and cast the stand-in
self in the prediction subscriber test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Explain gated Beamline tab clicks; drop login state POST
([`6c720d2`](https://gitea.psi.ch/mx/AareDAQ/commit/6c720d29d328563ca186be6af71e17c458ce824e))
Two changes folded together because they touch the same status path:
- Revert the login-default state POST: a state transition can move motors, and merely opening the
GUI must never move hardware. The GUI now adopts whatever state the server reports. - A click on
the pgroup-gated (disabled) Beamline tab used to be eaten silently by the tab bar. An event filter
now pops the explanation: visitor-pgroup wording for staff, the staff-only message for users (same
pattern as the Auxiliary-puck tab).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Exposure wheel only increased when Alt held
([`ac5936f`](https://gitea.psi.ch/mx/AareDAQ/commit/ac5936f7be272e956a937ecf164b3ce28bb53680))
Qt xcb/windows swap wheel axes while Alt is held, so angleDelta().y() is 0 and copysign(_, 0) is
always positive. Fall back to angleDelta().x() and ignore genuine zero deltas.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Grey out whole state strip while beamline is busy
([`d659f05`](https://gitea.psi.ch/mx/AareDAQ/commit/d659f0500934e462ea195d09d7234fe1213a659a))
Busy now empties the available-target set exactly like Moving, so no entry looks clickable and no
transition can be posted mid-operation (same guard the status-bar menu already had). The
current/pending entry keeps its highlight as orientation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Install gate event filters after eventFilter's targets exist
([`190e728`](https://gitea.psi.ch/mx/AareDAQ/commit/190e728734559a22fe1155cf3932c9c7ed0cb528))
The locked-banner and Beamline-tab-bar filters were installed mid __init__, but
MainWindow.eventFilter reads sample_lists_tabs, which is created later - every event delivered in
between raised AttributeError inside the filter ('Error calling Python override of eventFilter()'
spam) and broke widget teardown, cascading errors across CI tests and wedging the pxiii_bec job.
Filters now install late, next to installEventFilter(self), and the filter guards its attribute
reads so construction/teardown-time events can never raise.
Also fold the staff-gate assertions into test_main_window_init: every extra MainWindow construction
raises the odds of the pre-existing PySide SystemError flake, so don't build a window just for
them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Prevent libzmq abort and per-frame decode errors in prediction subscriber
([`6917894`](https://gitea.psi.ch/mx/AareDAQ/commit/69178945e5b64e73413169056673714a3db2d8cf))
Sniff for '{' before JSON-parsing zmq parts: JPEG frames start with 0xff and raised
UnicodeDecodeError on every frame. Stop closing the socket from the GUI thread in stop(): zmq
sockets are not thread-safe and the concurrent close/recv tripped the signaler.cpp POLLIN
assertion (core dump); run() closes it in its own thread via the 500ms RCVTIMEO.
uv.lock: sync version to 0.8.3.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Reserve sign width for GM labels; annotate red-highlight mismatch
([`c837e6c`](https://gitea.psi.ch/mx/AareDAQ/commit/c837e6c44d26f96477a72753b7123805878803c7))
Value column was content-sized, so rows shifted whenever a value flipped negative. Labels now
reserve '-88.888' width; right alignment keeps digits anchored. Also TODO: red colors on live
aerotech while labels display aerotech_meas - intent unconfirmed, do not change condition until
decided.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Send light slider changes from every input path, guard readback
([`869a66f`](https://gitea.psi.ch/mx/AareDAQ/commit/869a66ff4b7c51133609ff7f4d5eb8d70fdbf85a))
Sliders only emitted on sliderReleased, so right-click+wheel, arrow keys and groove clicks changed
the value locally without a PUT and the 500 ms status poll snapped it back. setTracking(False) +
valueChanged now sends one PUT per deliberate change; readback setValue is wrapped in blockSignals
to avoid echoing PUTs, and a 1.5 s grace window stops in-flight stale status responses from
bouncing the slider.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Unsqueeze Chi/Phi row and widen Step box in smargon panel
([`70107e6`](https://gitea.psi.ch/mx/AareDAQ/commit/70107e6219aa25ce6736fb7af04894ecc355fe10))
Move button gets its own full-width row instead of sharing row 1 with the Chi/Phi entries; Step box
spans columns 1-4 instead of the narrow Chi column.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Chores
- Name the bluebird theme in menu the default theme
([`63f4ad7`](https://gitea.psi.ch/mx/AareDAQ/commit/63f4ad7612e87554aa3bdb92edbedeeeee81a7d2))
- Rename Beamline Setup to Beamline setup, comment tweaks
([`75d7bed`](https://gitea.psi.ch/mx/AareDAQ/commit/75d7bed380b8ababd876b86335079648ca05b51e))
Panel title case now matches the other banner names. Also clarify the splash banner comment in
gui.py.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Satisfy ruff format and SIM201 lint
([`b489610`](https://gitea.psi.ch/mx/AareDAQ/commit/b4896105ab529e62374f6f11b0424a8cc54c7d30))
ruff format collapsed lines the Beamline setup rename and other edits left splittable; SIM201 wanted
!= over 'not ... ==' in the prediction subscriber's JSON sniff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Specify the omega panel 0 degree is a go-to not a move-by
([`b8177bd`](https://gitea.psi.ch/mx/AareDAQ/commit/b8177bd764b584a09ab925dedeff811b69ec4d66))
- Use rock and goto for better understanding
([`252e083`](https://gitea.psi.ch/mx/AareDAQ/commit/252e08384dd69955f0e53151445e24a62e19a4ce))
- Using aare_banner.png since svg could be rendered wrong at rhel9 consoles
([`d94fb88`](https://gitea.psi.ch/mx/AareDAQ/commit/d94fb88148ad317f8cf7e44ca35ccc0c9eb6d184))
### Continuous Integration
- Run pytest with -s -vv in the test jobs
([`727f19d`](https://gitea.psi.ch/mx/AareDAQ/commit/727f19d52a3810a9ad7cf15cd07305b224359dae))
Per-test lines and live (uncaptured) output: the pxiii_bec job sat silent at 81 percent for hours,
and file-level dots could not say which test wedged. With -s -vv a hang names its test and streams
the last log lines before it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Features
- Add Change Energy row to experiment configuration
([`c618354`](https://gitea.psi.ch/mx/AareDAQ/commit/c618354c0146e6a071873507aad4d085c71e344f))
Copy of the Beamline Setup energy row (keV display, eV emit), placed below the ML Loop Centring /
Make Raster Grid row and always visible. Wired to the same daq.change_energy; not staff-gated,
server enforces write permission.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add More link in sample camera help overlay opening F1 dialog
([`ebe0860`](https://gitea.psi.ch/mx/AareDAQ/commit/ebe0860ed4446d76005b00493ebf2c05aec5d93e))
Underlined 'More… (F1)' line at the bottom of the painted help box emits open_full_help, wired to
the existing Mouse / Keyboard Controls dialog.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Default beamline state on login by role
([`656b441`](https://gitea.psi.ch/mx/AareDAQ/commit/656b44159322c857ef6f6a2a0623a5e0cbf8792b))
Staff land in BeamLocation, users in SampleAlignment. One-shot on the first status tick where the
GUI owns the session and the beamline is idle, so a running operation or a watch-only GUI is never
disturbed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Disable Beamline tab when active pgroup is outside token pgroups
([`c5a6a17`](https://gitea.psi.ch/mx/AareDAQ/commit/c5a6a175bddda9acb517acea74ecf93776cae3cb))
Switching to a visitor pgroup means running a user experiment: grey out the Beamline tab (tooltip:
beamline scientists only), bring the Experiment tab forward with Dataset path and Exp. Config.
opened. Gate applies on transitions only so manual tab choices survive the 1 Hz status ticks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Rename Monochromator panel to Beamline Setup, add WIP beam-to-box row
([`bb447b1`](https://gitea.psi.ch/mx/AareDAQ/commit/bb447b15670addb7fb339db41690abbe21b7533a))
Display title only; class and file keep their names. New full-width 'Move Beam to Box (center)
(WIP)' button under the Energy row, disabled with a coming-soon tooltip until a DAQ endpoint
exists.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Show locked beamline banners to non-staff
([`1bce76e`](https://gitea.psi.ch/mx/AareDAQ/commit/1bce76e6fcd0c430cee449e82679cc36c946b414))
Beamline setup, ABR meas. pos. and Beam configuration banners stay visible for non-staff instead of
vanishing, but are locked stand-ins: clicking one pops the staff-only notice (same pattern as the
Auxiliary-puck tab) telling the user to log in as staff or contact their local contact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Stage motor entry values, apply moves in one click
([`e18c7fe`](https://gitea.psi.ch/mx/AareDAQ/commit/e18c7feded837db8d26d20ee021b58057137cc5d))
Chi/Phi boxes in the Smargon tab no longer move on Enter: edits stage the target (orange), the Move
button sends all staged axes at once (green), and boxes return to neutral when the motor reports
arrival. Out-of-range entries stay red and are never sent; limit tips pop as tooltips.
MotorMoveGroup is opt-in per box so other panels can adopt the same logic later.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Switch to Beamline combined view while busy
([`58bde93`](https://gitea.psi.ch/mx/AareDAQ/commit/58bde9379bd09b6c22bf0409b829894b753e59c9))
Generalize the robot-mount auto-switch: any busy period now brings up the combined view so the
motion can be watched, and the sample camera returns when busy clears. Edge-triggered, so manual
tab choices survive between transitions; _mounting renamed to _watching_motion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
### Testing
- Cover every changed line in the branch diff
([`aa6c226`](https://gitea.psi.ch/mx/AareDAQ/commit/aa6c226103401234b371f26727c5b544aa686329))
Diff coverage vs main now 100 percent from the gui suite alone: non-staff locked banners and both
gated-tab popups, remote-close bookkeeping in update_daq_status, smargon staged moves, camera More
link and Alt-wheel axis fallback, number box relimits, energy row emit, and the gui.main()
banner/graceful-exit path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Lift diff coverage over the 80 percent gate
([`16e112f`](https://gitea.psi.ch/mx/AareDAQ/commit/16e112f44a4eac6024e94d359c17a9704e78a2a8))
Promote the illumination panel's __main__ self-check to a real pytest file so CI counts it, add
busy-overlay render checks (status text paints, video view routes through it), and cover the motor
group's incomplete-entry and below-min Enter paths. Local diff coverage from the gui suite alone:
82 percent.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## v0.8.3 (2026-08-12)
### Bug Fixes
- Rename free beamline to clear busy
([`362880e`](https://gitea.psi.ch/mx/AareDAQ/commit/362880ec820953e95c14bfd3a1c3fa3351030643))
- Rename recover beamline to force maintenance
([`63ea060`](https://gitea.psi.ch/mx/AareDAQ/commit/63ea060fb9dc4df994cc266b7084e4ba7c4c48db))
- Show viewing mode for all states
([`8e68972`](https://gitea.psi.ch/mx/AareDAQ/commit/8e6897262537e221d42d7b44e418322d2cb15d54))
### Refactoring
- Remove dead code
([`1b3b144`](https://gitea.psi.ch/mx/AareDAQ/commit/1b3b144265b825ffbe27fca63f1593b198f73861))
## v0.8.2 (2026-08-12)
### Bug Fixes
- Allow str has no get when in recovery
([`34c8182`](https://gitea.psi.ch/mx/AareDAQ/commit/34c8182cfa54da98baeed0376d9c5d32b13efc6c))
- Include graphics to wheel
([`ca05748`](https://gitea.psi.ch/mx/AareDAQ/commit/ca05748d1fdf092d962f074f570e583b3490ac54))
### Chores
- Add test to improve coverage
([`9906937`](https://gitea.psi.ch/mx/AareDAQ/commit/9906937525f73a91b658fdcb50ea7093cc76a759))
- Fix linting
([`bb35209`](https://gitea.psi.ch/mx/AareDAQ/commit/bb35209be8737f2db107f092a6cac6bfe2b0e026))
- Formatting, tab space misused
([`17bb654`](https://gitea.psi.ch/mx/AareDAQ/commit/17bb65420f85319e793873481e0f6536f26a4d66))
- Hide debug log in the log_panel
([`328a46b`](https://gitea.psi.ch/mx/AareDAQ/commit/328a46b09c4b08f3704cd9c577c687ed043b166d))
- Make default theme bluebird (solid)
([`8a9f35e`](https://gitea.psi.ch/mx/AareDAQ/commit/8a9f35ef7409465a139a33b603ab332ad151061e))
- Removing trailing space
([`23ad114`](https://gitea.psi.ch/mx/AareDAQ/commit/23ad11430bf639bc2263b25fe8bd6f8a107b4cac))
- Stop logger info display lots of pgroups
([`0ca9682`](https://gitea.psi.ch/mx/AareDAQ/commit/0ca968277c68a456f3944cd72831ee4b5a58396a))
## v0.8.1 (2026-08-11)
### Bug Fixes
- Allow workflow dispatch of release wf
([`110bfb3`](https://gitea.psi.ch/mx/AareDAQ/commit/110bfb3f5f2f53fb5093663c93f9363904160821))
## 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>
- Reset connection state if cancel fails
([`7a60b7d`](https://gitea.psi.ch/mx/AareDAQ/commit/7a60b7d9329ac8e0a9705bad6e542be9570b179d))
- 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>
- Lazily init jfj client
([`8a51eef`](https://gitea.psi.ch/mx/AareDAQ/commit/8a51eef4f08f9756e7ea8307554f1fed58a045a8))
- 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
- Kwarg name for mlbox klass
([`40a9e84`](https://gitea.psi.ch/mx/AareDAQ/commit/40a9e8464c67c2032ba5718a6bc1763690a28be4))
- Remove noisy disabled ring current log
([`1bdf056`](https://gitea.psi.ch/mx/AareDAQ/commit/1bdf056af52af86d25f2573b789bff1c4364a0b4))
## v0.7.2 (2026-08-05)
### Bug Fixes
- Don't create pixmap before qapp
([`214c204`](https://gitea.psi.ch/mx/AareDAQ/commit/214c204d062559fcdfaee4649502423d0158bc21))
### Documentation
- Make new zensical docs
([`deb1ea4`](https://gitea.psi.ch/mx/AareDAQ/commit/deb1ea4f505bad12b2705dc6e8a63b13f9093f50))
- Move the readme cheatsheet content to a docs page
- Udpate cheatsheet formatting
([`6244d77`](https://gitea.psi.ch/mx/AareDAQ/commit/6244d77a12f2e69afaa7d0e480ef750d84eecdb2))
## v0.7.1 (2026-08-04)
### Bug Fixes
- No longer load user macros through client
([`bf503e4`](https://gitea.psi.ch/mx/AareDAQ/commit/bf503e416ff2dfdf9c36661da7fcbd9564a59bbf))
- they have been moved to the dynamic beamline dispatch module, where they are concretely loaded
from each beamline repo instead
## v0.7.0 (2026-08-04)
### Continuous Integration
- Fail diff cover below threshold
([`71d9d07`](https://gitea.psi.ch/mx/AareDAQ/commit/71d9d07f3900d259716a9e1fe23bb6596b76e689))
- Fail new pyright errors
([`db520e8`](https://gitea.psi.ch/mx/AareDAQ/commit/db520e8579542f1dea4fdd83fe5b6f5a4a1d1dbd))
### Features
- Add beamline dispatch for x06da
([`e0db953`](https://gitea.psi.ch/mx/AareDAQ/commit/e0db953b86cf09ebdcd44c0e08857525594db848))
## v0.6.1 (2026-08-03)
### Bug Fixes
- Add coverage comment
([`8def022`](https://gitea.psi.ch/mx/AareDAQ/commit/8def022d4c68ac928a22b4ab214b9e7df9eb279f))
- As many ruff errors as possible, some type
([`0135129`](https://gitea.psi.ch/mx/AareDAQ/commit/0135129c89c377084cc87ee9704e21b67a94265a))
### Chores
- Update common dep
([`28dec7a`](https://gitea.psi.ch/mx/AareDAQ/commit/28dec7a3fefe82ee1246cf227e90149b14737c77))
### Code Style
- Ruff check --fix --unsafe-fixes
([`f63107a`](https://gitea.psi.ch/mx/AareDAQ/commit/f63107a1e0090ce51e8a2958d5ba1d2c4bc3574b))
### Continuous Integration
- Add better linting
([`70c81ab`](https://gitea.psi.ch/mx/AareDAQ/commit/70c81abdd86b67d6a792d13595b88e8bc5d00f95))
- Make sure main is available for diff
([`7c28b5f`](https://gitea.psi.ch/mx/AareDAQ/commit/7c28b5f023dba7e5fa952130b485398cffd90c4a))
## v0.6.0 (2026-07-31)
### Bug Fixes
- Pxi and pxiii tests shouldn't work yet
([`ba68b6b`](https://gitea.psi.ch/mx/AareDAQ/commit/ba68b6b2335535079c92a0153024a4bff533d2be))
- Remove many duplicated methods
([`03e289c`](https://gitea.psi.ch/mx/AareDAQ/commit/03e289c6d7ebe1f9f83e48171264fdfb650fd3c3))
- Use macros from dispatch
([`b492fac`](https://gitea.psi.ch/mx/AareDAQ/commit/b492face878a9ad27d9e03c64c135582d0aa85d6))
### Code Style
- Remove pointless name-mangled attrs
([`7b79dd8`](https://gitea.psi.ch/mx/AareDAQ/commit/7b79dd8ec5efb741eafa565ba1436fbff396aff5))
the fact that removing them didn't break anything shows that they were completely unneccessary -
there is no inheritance tree using the same names
- Replace dunder attributes with normal 'private' attrs
([`fb0c8ef`](https://gitea.psi.ch/mx/AareDAQ/commit/fb0c8efebec4a9270d6091902768bc2e74b8c798))
### Continuous Integration
- Add concurrency to test suite
([`1ef5b20`](https://gitea.psi.ch/mx/AareDAQ/commit/1ef5b20172b6ea5173f2a3b71776a420ea5871f9))
- Run on push only for main, otherwise PR
([`0c55bc8`](https://gitea.psi.ch/mx/AareDAQ/commit/0c55bc800821488a73541df46256bf129e91b85b))
### Features
- Beamline dispatch framework
([`991e4be`](https://gitea.psi.ch/mx/AareDAQ/commit/991e4bea474c667b50067c96b4aa6234a1782f37))
- Get auth from dispatch
([`660a0ac`](https://gitea.psi.ch/mx/AareDAQ/commit/660a0acf7c0028e16072f396787e32971e14faac))
- Make bec macros dispatched and test against beamline plugins
([`0f1aa30`](https://gitea.psi.ch/mx/AareDAQ/commit/0f1aa3090b8deb33502e710e87f92d6e3299f576))
### Testing
- Add test for dispatch against each plugin
([`e90fd52`](https://gitea.psi.ch/mx/AareDAQ/commit/e90fd52e479550d87dcb6047770324d665862041))
## v0.5.2 (2026-07-27)
### Bug Fixes
- Return 0 if ring current device is not accessible
([`69421be`](https://gitea.psi.ch/mx/AareDAQ/commit/69421be3e9e1e94a831b655801201aa0b53d11db))
## v0.5.1 (2026-07-27)
### Bug Fixes
- Unpin uvicorn
([`105e85c`](https://gitea.psi.ch/mx/AareDAQ/commit/105e85c06b0cba614c7781ba92f98e0a7772f5c9))
- Update aaredb tag
([`d3a84c9`](https://gitea.psi.ch/mx/AareDAQ/commit/d3a84c9fb832ae592477dcaf7f39b2415badf9a8))
## v0.5.0 (2026-07-27)
### Bug Fixes
- Add py 3.13 to test matrix
([`d7fa11b`](https://gitea.psi.ch/mx/AareDAQ/commit/d7fa11bc1946589fbc1bc8bfdc4cf040f644ac15))
- Added end_operation to the exception mess at the end of def measure() in daq.py
([`0a4054d`](https://gitea.psi.ch/mx/AareDAQ/commit/0a4054d69e8cc26d27b990511da341833195ca1b))
- Detector url
([`9fb2004`](https://gitea.psi.ch/mx/AareDAQ/commit/9fb2004e05d75905a595b3fe3c92d3bec6eed9c8))
- Handle mountingfailed specifically and split on critical
([`2c80ef7`](https://gitea.psi.ch/mx/AareDAQ/commit/2c80ef7381686062184551406018cd3f162f0fb4))
- One internal worker
([`2663570`](https://gitea.psi.ch/mx/AareDAQ/commit/2663570f6827ef43a563254943142e9313a2bd33))
- Persist workflow git fetch auth
([`3185811`](https://gitea.psi.ch/mx/AareDAQ/commit/3185811e6129c77d0b90c8daba169e2c27589b69))
- Remove excess warning logs
([`f821c2d`](https://gitea.psi.ch/mx/AareDAQ/commit/f821c2dd99d9cf79f581f984d2ccfa10d85ed327))
- Reset git fetch auth to token
([`bc9094d`](https://gitea.psi.ch/mx/AareDAQ/commit/bc9094dc6e09d0732b0ae328b7e221062d8af29d))
- Spurious import
([`c259e10`](https://gitea.psi.ch/mx/AareDAQ/commit/c259e102284c7265e365c6aa08c373784190d6d0))
- Supply operation to end
([`3a64439`](https://gitea.psi.ch/mx/AareDAQ/commit/3a64439c6b835d499dc971a18141a37443814a44))
- Suppress only baton error
([`fbb0143`](https://gitea.psi.ch/mx/AareDAQ/commit/fbb01439505ac9c1b3faad860fecb5781b8d3b9c))
- Typo in exception name
([`951ee05`](https://gitea.psi.ch/mx/AareDAQ/commit/951ee0591e421c70c998d8b38bd2bcf32d22ac7f))
- User values now should persist between samples, only reset to default on start up.
([`89564a5`](https://gitea.psi.ch/mx/AareDAQ/commit/89564a55e1f4972bb7232fe7b3aa78fbe44e8c9b))
### Chores
- Add gunicorn dep
([`5a9d4a2`](https://gitea.psi.ch/mx/AareDAQ/commit/5a9d4a2662641d985a69f447af1f1d6645b52ae5))
- Bump aarecommon dependency
([`aae4ea7`](https://gitea.psi.ch/mx/AareDAQ/commit/aae4ea7a32e99e7b7c29b792bd9bfd06ad112d9b))
- Removed redundant /camera/source and /beamline/imafge from server.py and test_server.py
([`60faea7`](https://gitea.psi.ch/mx/AareDAQ/commit/60faea716faf28204eca0d77cd91d3444d031624))
### Code Style
- Fix a few style issues by hand
([`2c237b6`](https://gitea.psi.ch/mx/AareDAQ/commit/2c237b66235255acfd9b44a95a04ba5488224330))
- Formatter again
([`72d96ec`](https://gitea.psi.ch/mx/AareDAQ/commit/72d96ecd6ac44cdf942cd052ae3d1ca84823aea3))
- Ruff check --fix
([`910076a`](https://gitea.psi.ch/mx/AareDAQ/commit/910076a2389bf1d93016226e6b1ae55892a6adb5))
- Ruff check --fix --unsafe-fixes
([`6affbf9`](https://gitea.psi.ch/mx/AareDAQ/commit/6affbf91480b19d11f5354eb1581c971c7563272))
- Ruff format
([`0451b8c`](https://gitea.psi.ch/mx/AareDAQ/commit/0451b8cebb87adabe8d7b2d1d91a2525bb2286b9))
### Continuous Integration
- Introduce release workflow
([`5f1a09a`](https://gitea.psi.ch/mx/AareDAQ/commit/5f1a09a1e96565c20fdc3259a7a86462fad17717))
### Features
- Added flux macro to devices for x10sa
([`014ae0f`](https://gitea.psi.ch/mx/AareDAQ/commit/014ae0f47a5175266b12a0322713360e3640c8e3))
- Server about info
([`52a9765`](https://gitea.psi.ch/mx/AareDAQ/commit/52a9765182e3372629c884295ace6a8546fb22bb))
- Updated the idle close timeout to 8 hours
([`99ec01c`](https://gitea.psi.ch/mx/AareDAQ/commit/99ec01c34ccc0eaa21ef58091f6f08742094d95a))
- Updated the idle close timeout to 8 hours
([`e6b759e`](https://gitea.psi.ch/mx/AareDAQ/commit/e6b759e6e234f116e6b4e8e853356d520ac05515))
## v0.4.0 (2026-07-08)
### Bug Fixes
- Crash on bec init failure; beamline must be set explicitly
([`12bca38`](https://gitea.psi.ch/mx/AareDAQ/commit/12bca38a124c0ceb38a9e5d0852320e8a2adfcf1))
### Chores
- Add a bunch of stuff to gitignore
([`9025c42`](https://gitea.psi.ch/mx/AareDAQ/commit/9025c425f8b5ab0f20cd02d2cf6ec748b91b7105))
- Add aarecommon dependency
([`ccc2185`](https://gitea.psi.ch/mx/AareDAQ/commit/ccc21855612f506b61101df85ebfd80d4218447b))
- Add uv to dependencies
([`3d46663`](https://gitea.psi.ch/mx/AareDAQ/commit/3d46663e23b61f37985cf817c784bdde78478c8b))
- Bump version
([`6012607`](https://gitea.psi.ch/mx/AareDAQ/commit/60126073eb8284f183134872748e02c7b9a25867))
- Remove common tests from daq
([`264e667`](https://gitea.psi.ch/mx/AareDAQ/commit/264e6671c76832dfcc7f8c01c1c80c0dcd59da70))
- Update aarecommon dependency
([`b57b26d`](https://gitea.psi.ch/mx/AareDAQ/commit/b57b26d1e23d027cf4ca5462e173bace9c900515))
- Update aarecommon dependency to 0.1.3
([`228e0ed`](https://gitea.psi.ch/mx/AareDAQ/commit/228e0edd16b830d9d0ee77ab85cb9b011bb59da4))
### Code Style
- Format with ruff
([`b0863e5`](https://gitea.psi.ch/mx/AareDAQ/commit/b0863e5ddba5d7310148a6d17752b77cc02c32cd))
- Ruff check fix
([`9932661`](https://gitea.psi.ch/mx/AareDAQ/commit/99326614aec6d94a6a50ed896c3234a303995b45))
### Features
- Add hostname+user to gui logs
([`3ec2bc0`](https://gitea.psi.ch/mx/AareDAQ/commit/3ec2bc011bbcc6cdcecd68d8c6c242349f8c119a))
- Display version, gui and env location in about
([`cebd4e8`](https://gitea.psi.ch/mx/AareDAQ/commit/cebd4e82bcd6c9a931fa91bfe360fa1925879401))
- Display version, gui and env location in about
([`cf879ee`](https://gitea.psi.ch/mx/AareDAQ/commit/cf879ee2a5606415a6610a80c8f89dc4be48a89f))
- Live changes 26-07-06
([`b0b655a`](https://gitea.psi.ch/mx/AareDAQ/commit/b0b655aea0355eb2441eaf1093534561f028e7a3))
### Refactoring
- Move qt logging to gui module
([`8f0a853`](https://gitea.psi.ch/mx/AareDAQ/commit/8f0a85316d7e6e313d09bf5f95c99a1fe0a0a5af))
- Use aarecommon and remove common
([`13bddd4`](https://gitea.psi.ch/mx/AareDAQ/commit/13bddd43c7c36624f6e93e2718d82439d39809ff))
### Testing
- Corrected test for aaredb to use db_id
([`f05ab28`](https://gitea.psi.ch/mx/AareDAQ/commit/f05ab282405780844de76156122c2c3daea642bf))
- Fixed bug in workflow test
([`95384d1`](https://gitea.psi.ch/mx/AareDAQ/commit/95384d175a0277277ca33ad5c114e6b04797692f))