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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
Replaces the vertical station map that consumed left-column space with a
slim always-visible strip in the bottom toolbar area, directly above the
status bar:
- states in physical beamline order, 18px text, one line when the bar is
wide enough and wrapped at the last space otherwise
- availability coloring from the route graph plus the status-bar shortcut
transitions: bold blue = active (red for Maintenance), orange =
reachable in one step, grey = not reachable; no backgrounds or rounded
corners
- transitions only via right-click 'Go to <state>'; left click shows a
reminder tip for available states and the reachability explanation for
grey ones; hovering a grey state for 3 s shows the same explanation
- whole entry is the hover/click region; tips anchor to the entry and
disappear when the mouse leaves
- always visible: no View-menu toggle, not hidden by portrait or compact
modes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 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>
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>
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>
- 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>
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>
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>