Files
AareDAQ/CHANGELOG.md
semantic-release 19c612024d
CI / lint (push) Failing after 21s
Docs build and publish / docker (push) Successful in 4s
CI / test-with-beamline-plugins (pxi_bec) (push) Failing after 16s
CI / test (3.13) (push) Failing after 22s
CI / test-with-beamline-plugins (pxiii_bec) (push) Failing after 16s
Build and Publish / release (push) Successful in 14s
CI / test (3.14) (push) Successful in 1m0s
CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m4s
CI / test (3.12) (push) Successful in 1m23s
CI / test-with-coverage (push) Successful in 1m38s
CI / coverage-analysis (push) Skipped
0.17.5
Automatically generated by python-semantic-release
2026-08-27 15:10:31 +00:00

81 KiB

CHANGELOG

v0.17.5 (2026-08-27)

Bug Fixes

v0.17.4 (2026-08-27)

Bug Fixes

Code Style

v0.17.3 (2026-08-26)

Bug Fixes

  • Update different macro sigs for 10s vs 6d (3a24f20)

v0.17.2 (2026-08-25)

Bug Fixes

  • New import locations and types for bec macros (caa4e22)

Continuous Integration

v0.17.1 (2026-08-25)

Bug Fixes

  • Add harder timeouts to uvicorn.run (2b85428)

  • Tidy bec client init and shutdown (1ac4908)

v0.17.0 (2026-08-25)

Code Style

  • Reorder the position of measured tab (838ae18)

Features

  • Disable Reload DB params and related usage (96d7e82)

v0.16.0 (2026-08-25)

Bug Fixes

Features

  • Guard beam steering and auto exposure (e87a207)

v0.15.0 (2026-08-25)

Bug Fixes

  • Beam centre model instantiation (24c3741)

  • Reference to beamline in bec worker (8ad3042)

  • Typing in dispatch (15a7ca4)

Chores

  • Bump aarecommon minimum (98c2376)

Features

  • Extend beamline dispatch with geo class (7e1a816)

  • Load beam centre model from config (59300da)

  • Use beam centre model for diffractiongeometry (7e203ce)

  • Use live beam center throughout daq (df376ca)

v0.14.0 (2026-08-24)

Bug Fixes

  • Energy spin movestate colors never rendered (b984a36)

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)

  • Wheel include png and svg (855632d)

Chores

  • Cleanup repeating code (09f81c8)

  • Sync uv.lock with 0.13.4 version bump (d65ff27)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Code Style

  • Make the banner text colored (3192fd2)

so it shows on white/black background

Features

  • Allow dismissing notification. Trial. If not good, revert this. (bdafc03)

  • Bound Set Energy to a 4-20 keV placeholder range (225d706)

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)

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)

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)

  • No need to test energy 0 and update tolerance (a19cbf1)

test: update test...

  • Sample padding pixel so movestate colors survive Linux fonts (a7bd46c)

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)

  • remove now-redundant "dry" endpoint

  • Update gui to remove dangerous robot commands (772ba2c)

v0.13.4 (2026-08-24)

Bug Fixes

  • No moving to combined view in moving state (1a17e26)

Code Style

Testing

  • Moving state no longer flips to combined view (1a9f4d8)

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

v0.13.2 (2026-08-21)

Bug Fixes

  • Truncate detector distance parameter calculation at soft limit (a6ad306)

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)

v0.13.0 (2026-08-20)

Bug Fixes

  • Combined view only when state is moving or when in robotsampleexchange (d5c66af)

  • Dialog not going away after getting baton, and the accept/cancel too small (1af38fc)

  • Satisfy lint and diff-coverage gates for admin gating (8b6ae51)

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)

Chores

  • Do not use the special red tooltip, stay consistent (ef4bc01)

  • Enhance contract between input box and button (47f2939)

  • Fix wording (d52a31b)

  • Rename button to make it more sensible (4917b62)

  • Sync uv.lock with 0.12.0 version bump (3b2fa59)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

  • Sync uv.lock with 0.12.4 version bump (0cff706)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

  • Sync uv.lock with 0.12.5 version bump (3df3683)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Features

  • Admin-gate beam diagnostics states, warn via passive red tip (569b024)

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)

  • Auto-centering row with apply-after-mount, grid button raster-only (36675e0)

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)

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)

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)

  • Magnet position sensor timeout (a39e974)

v0.12.4 (2026-08-20)

Bug Fixes

  • Pitch scan message for correct beamline (4f5cb08)

v0.12.3 (2026-08-20)

Bug Fixes

  • Do not multiply screening request by steps (1756cab)

  • Read beamline state from BEC on server startup (dd04a2f)

v0.12.2 (2026-08-20)

Bug Fixes

  • Save collimator positions (002dba7)

v0.12.1 (2026-08-20)

Bug Fixes

  • Update bs x and y instead of z (a36a051)

v0.12.0 (2026-08-19)

Features

  • Connect beam steering routine to GUI (de0445e)

v0.11.0 (2026-08-18)

Bug Fixes

  • No BEAMLINE BUSY overlay during Sample alignment (16b61b8)

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)

Code Style

  • Collapse multiline _status calls for ruff format (167d78d)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Features

  • Status bar splits passive left / operable right (7a01a86)

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)

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)

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)

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)

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)

Code Style

  • Expanded help overlay opens top center, under the badge (3053aaa)

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)

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)

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)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Features

  • Add Unflag to the sample table context menu (900bc2f)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

_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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

  • Rename Beamline Setup to Beamline setup, comment tweaks (75d7bed)

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)

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)

  • Use rock and goto for better understanding (252e083)

  • Using aare_banner.png since svg could be rendered wrong at rhel9 consoles (d94fb88)

Continuous Integration

  • Run pytest with -s -vv in the test jobs (727f19d)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

  • Rename recover beamline to force maintenance (63ea060)

  • Show viewing mode for all states (8e68972)

Refactoring

v0.8.2 (2026-08-12)

Bug Fixes

  • Allow str has no get when in recovery (34c8182)

  • Include graphics to wheel (ca05748)

Chores

  • Add test to improve coverage (9906937)

  • Fix linting (bb35209)

  • Formatting, tab space misused (17bb654)

  • Hide debug log in the log_panel (328a46b)

  • Make default theme bluebird (solid) (8a9f35e)

  • Removing trailing space (23ad114)

  • Stop logger info display lots of pgroups (0ca9682)

v0.8.1 (2026-08-11)

Bug Fixes

  • Allow workflow dispatch of release wf (110bfb3)

v0.8.0 (2026-08-11)

Bug Fixes

  • Adapt main window to monitor size instead of overflowing (f4f3c5e)

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)

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)

  • 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)

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)

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)

  • Scroll Local Contact tabs so rows keep text height (7a57d85)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

  • 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)

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)

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)

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)

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)

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)

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)

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

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)

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)

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)

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)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

  • Camera help overlay, camera-error message, and session badge hover feedback (3db8b11)

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)

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)

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)

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)

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)

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)

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)

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)

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 '; 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)

  • Let panels opt out of starting collapsed (460f703)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

  • Track the sample-table column shift, sort imports (0b80c75)

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)

  • Remove noisy disabled ring current log (1bdf056)

v0.7.2 (2026-08-05)

Bug Fixes

  • Don't create pixmap before qapp (214c204)

Documentation

  • Make new zensical docs (deb1ea4)

  • Move the readme cheatsheet content to a docs page

  • Udpate cheatsheet formatting (6244d77)

v0.7.1 (2026-08-04)

Bug Fixes

  • No longer load user macros through client (bf503e4)

  • 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)

  • Fail new pyright errors (db520e8)

Features

  • Add beamline dispatch for x06da (e0db953)

v0.6.1 (2026-08-03)

Bug Fixes

  • Add coverage comment (8def022)

  • As many ruff errors as possible, some type (0135129)

Chores

Code Style

  • Ruff check --fix --unsafe-fixes (f63107a)

Continuous Integration

  • Add better linting (70c81ab)

  • Make sure main is available for diff (7c28b5f)

v0.6.0 (2026-07-31)

Bug Fixes

  • Pxi and pxiii tests shouldn't work yet (ba68b6b)

  • Remove many duplicated methods (03e289c)

  • Use macros from dispatch (b492fac)

Code Style

  • Remove pointless name-mangled attrs (7b79dd8)

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)

Continuous Integration

  • Add concurrency to test suite (1ef5b20)

  • Run on push only for main, otherwise PR (0c55bc8)

Features

  • Beamline dispatch framework (991e4be)

  • Get auth from dispatch (660a0ac)

  • Make bec macros dispatched and test against beamline plugins (0f1aa30)

Testing

  • Add test for dispatch against each plugin (e90fd52)

v0.5.2 (2026-07-27)

Bug Fixes

  • Return 0 if ring current device is not accessible (69421be)

v0.5.1 (2026-07-27)

Bug Fixes

v0.5.0 (2026-07-27)

Bug Fixes

  • Add py 3.13 to test matrix (d7fa11b)

  • Added end_operation to the exception mess at the end of def measure() in daq.py (0a4054d)

  • Detector url (9fb2004)

  • Handle mountingfailed specifically and split on critical (2c80ef7)

  • One internal worker (2663570)

  • Persist workflow git fetch auth (3185811)

  • Remove excess warning logs (f821c2d)

  • Reset git fetch auth to token (bc9094d)

  • Spurious import (c259e10)

  • Supply operation to end (3a64439)

  • Suppress only baton error (fbb0143)

  • Typo in exception name (951ee05)

  • User values now should persist between samples, only reset to default on start up. (89564a5)

Chores

  • Add gunicorn dep (5a9d4a2)

  • Bump aarecommon dependency (aae4ea7)

  • Removed redundant /camera/source and /beamline/imafge from server.py and test_server.py (60faea7)

Code Style

Continuous Integration

  • Introduce release workflow (5f1a09a)

Features

  • Added flux macro to devices for x10sa (014ae0f)

  • Server about info (52a9765)

  • Updated the idle close timeout to 8 hours (99ec01c)

  • Updated the idle close timeout to 8 hours (e6b759e)

v0.4.0 (2026-07-08)

Bug Fixes

  • Crash on bec init failure; beamline must be set explicitly (12bca38)

Chores

  • Add a bunch of stuff to gitignore (9025c42)

  • Add aarecommon dependency (ccc2185)

  • Add uv to dependencies (3d46663)

  • Bump version (6012607)

  • Remove common tests from daq (264e667)

  • Update aarecommon dependency (b57b26d)

  • Update aarecommon dependency to 0.1.3 (228e0ed)

Code Style

Features

  • Add hostname+user to gui logs (3ec2bc0)

  • Display version, gui and env location in about (cebd4e8)

  • Display version, gui and env location in about (cf879ee)

  • Live changes 26-07-06 (b0b655a)

Refactoring

  • Move qt logging to gui module (8f0a853)

  • Use aarecommon and remove common (13bddd4)

Testing

  • Corrected test for aaredb to use db_id (f05ab28)

  • Fixed bug in workflow test (95384d1)