Commit Graph
1600 Commits
Author SHA1 Message Date
perl_d 110bfb3f5f fix: allow workflow dispatch of release wf
CI / lint (pull_request) Successful in 38s
CI / test (3.11) (pull_request) Successful in 1m23s
CI / test (3.12) (pull_request) Successful in 1m22s
CI / test (3.13) (pull_request) Successful in 1m23s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m27s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m32s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m41s
CI / test-with-coverage (pull_request) Successful in 2m8s
CI / lint (push) Successful in 34s
Docs build and publish / docker (push) Successful in 6s
Build and Publish / release (push) Successful in 12s
CI / test (3.13) (push) Canceled after 1m15s
CI / test (3.11) (push) Canceled after 1m20s
CI / test (3.12) (push) Canceled after 1m15s
CI / test-with-beamline-plugins (pxi_bec) (push) Canceled after 1m10s
CI / test-with-beamline-plugins (pxii_bec) (push) Canceled after 1m10s
CI / test-with-beamline-plugins (pxiii_bec) (push) Canceled after 56s
CI / test-with-coverage (push) Canceled after 45s
CI / coverage-analysis (push) Canceled after 0s
CI / coverage-analysis (pull_request) Successful in 6s
2026-08-11 13:38:48 +02:00
semantic-release 296bc98bbb 0.8.0
CI / lint (push) Skipped
CI / test (3.11) (push) Skipped
CI / test (3.12) (push) Skipped
CI / test (3.13) (push) Skipped
CI / test-with-beamline-plugins (pxi_bec) (push) Skipped
CI / test-with-beamline-plugins (pxii_bec) (push) Skipped
CI / test-with-beamline-plugins (pxiii_bec) (push) Skipped
Docs build and publish / docker (push) Successful in 8s
CI / test-with-coverage (push) Successful in 2m7s
CI / coverage-analysis (push) Skipped
Build and Publish / release (push) Successful in 6s
Automatically generated by python-semantic-release
v0.8.0
2026-08-11 11:08:06 +00:00
perl_d 7a60b7d932 fix: reset connection state if cancel fails
CI / test (3.11) (pull_request) Successful in 1m25s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m24s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m33s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m50s
CI / test-with-coverage (pull_request) Successful in 1m49s
CI / lint (pull_request) Successful in 2m11s
CI / coverage-analysis (pull_request) Successful in 3s
CI / test (3.13) (pull_request) Successful in 2m35s
CI / test (3.12) (pull_request) Successful in 2m45s
CI / lint (push) Successful in 29s
Docs build and publish / docker (push) Successful in 10s
CI / test (3.11) (push) Canceled after 36s
CI / test (3.12) (push) Canceled after 33s
CI / test (3.13) (push) Canceled after 31s
CI / test-with-beamline-plugins (pxi_bec) (push) Canceled after 28s
CI / test-with-beamline-plugins (pxii_bec) (push) Canceled after 26s
CI / test-with-beamline-plugins (pxiii_bec) (push) Canceled after 23s
CI / test-with-coverage (push) Canceled after 21s
CI / coverage-analysis (push) Canceled after 0s
Build and Publish / release (push) Failing after 4s
2026-08-11 13:02:54 +02:00
perl_d 8a51eef4f0 feat: lazily init jfj client 2026-08-11 13:02:54 +02:00
semantic-release aade051074 0.8.0
CI / lint (push) Successful in 28s
Docs build and publish / docker (push) Successful in 8s
Build and Publish / release (push) Successful in 11s
CI / test (3.11) (push) Successful in 1m28s
CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m29s
CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 2m9s
CI / test (3.13) (push) Successful in 2m57s
CI / test (3.12) (push) Successful in 3m5s
CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 3m19s
CI / test-with-coverage (push) Successful in 3m37s
CI / coverage-analysis (push) Skipped
Automatically generated by python-semantic-release
2026-08-11 09:03:07 +00:00
duan_jandClaude Fable 5 833a6d136f style: visual and interaction polish
CI / test (3.11) (pull_request) Successful in 1m23s
CI / test (3.12) (pull_request) Successful in 1m22s
CI / test (3.13) (pull_request) Successful in 1m21s
CI / test-with-beamline-plugins (pxii_bec) (pull_request) Successful in 1m26s
CI / test-with-beamline-plugins (pxi_bec) (pull_request) Successful in 1m42s
CI / test-with-beamline-plugins (pxiii_bec) (pull_request) Successful in 1m40s
CI / test-with-coverage (pull_request) Successful in 2m2s
CI / coverage-analysis (pull_request) Successful in 4s
CI / lint (pull_request) Successful in 2m37s
CI / lint (push) Successful in 29s
Docs build and publish / docker (push) Successful in 12s
CI / test (3.11) (push) Canceled after 34s
CI / test (3.12) (push) Canceled after 30s
CI / test (3.13) (push) Canceled after 29s
CI / test-with-beamline-plugins (pxi_bec) (push) Canceled after 25s
CI / test-with-coverage (push) Canceled after 19s
CI / test-with-beamline-plugins (pxii_bec) (push) Canceled after 24s
CI / test-with-beamline-plugins (pxiii_bec) (push) Canceled after 20s
CI / coverage-analysis (push) Canceled after 0s
Build and Publish / release (push) Failing after 5s
Windowed startup at 50%x70% instead of maximized; overlay legend now
defaults off (it covers the camera image); square slider handles with
grip-line PNG assets (the round handle clipped flat); warmer sunrise
gradient bottom; abr/beam-mark layout tweaks; hover cues on the
beamline-state entries; DPI/font-aware pop-out titlebar icons; the
out-of-date Tutorial menu entries are hidden until content is redone.

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

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

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

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

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

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:35:55 +02:00
duan_jandClaude Fable 5 7b4764e7ca test: cover the camera overlays, theme migration, layout heal, and splash
Diff coverage vs main was 77%, under the 80% CI gate; the new camera
help/error/badge code and the theme+layout main_window paths were the
uncovered bulk. Locally: 82%.

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

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:35:55 +02:00
duan_jandClaude Fable 5 763a25837c style: narrow the manual-resize press state for the pyright gate
The diff-vs-main basedpyright gate flags QRect(self._press_geom) because
only _press_global was narrowed; both are set together in
mousePressEvent, so the extra check is a no-op at runtime.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:35:55 +02:00
duan_jandClaude Fable 5 27c9b93d5c docs: note the spreadsheet log-spam TODO in daq_worker
load_spreadsheet/load_reference_tools log a GET they never send every
~12.5s poll while base_url is None; fix later by demoting to debug or
logging once on the None->set edge.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 900315d412 feat: add spin-arrow and check-mark glyph assets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 2adf8ff6d5 style: narrow the log pop-out view for the pyright gate
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>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 69b6813025 test: cover the sample-status logic, wheel guard, pop-outs, and log mirror
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>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 ed42738693 style: clear the two portrait-mode diff-gate violations
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>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 2638308412 style: ruff-format the ported round, scope splash Qt enums
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>
2026-08-11 10:35:54 +02:00
duan_jandClaude Fable 5 84ccf275f9 style: clear the basedpyright gate for the ported round
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 0b80c75c63 test: track the sample-table column shift, sort imports
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 1f9009807d feat: merge Sample List, Reference Tools, and the queue into one dock
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 2054f078b0 feat: camera session badge and collapsible legend
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 5f44be2a62 style: compact the control panels
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 6e1305cb92 feat: pop-out windows instead of floating docks
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 f87b8952c8 feat: wheel only adjusts values while the right button is held
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 460f7034c3 feat: let panels opt out of starting collapsed
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 0bfa9dbbeb style: extend the palette with selection, frame, slider, and sample-status tokens
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 efcdc0c191 feat: swap the splash banner to an SVG
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 266f8337a9 fix: window and dock sizing behavior
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 00e5d116a6 feat: group beam mark/center/size under one Beam Config banner
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 913089b9b6 style: apply the typography ladder and card_style across the GUI
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 e63ddb090f style: add typography, tooltip, scrollbar, and card tokens to the palette
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>
2026-08-11 10:35:46 +02:00
duan_jandClaude Fable 5 590e500da5 style: move widget colors to the shared palette
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>
2026-08-11 10:35:46 +02:00