CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>