diff --git a/CHANGELOG.md b/CHANGELOG.md index d823414f..f0259dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,586 @@ # CHANGELOG +## v0.8.0 (2026-08-11) + +### Bug Fixes + +- Adapt main window to monitor size instead of overflowing + ([`f4f3c5e`](https://gitea.psi.ch/mx/AareDAQ/commit/f4f3c5ec3d7d734dc34cf6c2c72d053deea4a200)) + +The window's minimum was 1400x1207 - taller than a 1920x1200 console - so the status bar was pushed + off-screen on every monitor. Three causes: + +- the standard page's combined panel minimums: now wrapped in a QScrollArea so scrollbars appear + instead of clamping the window - hidden portrait/compact stack pages inflating the QStackedWidget + minimum (portrait alone demands 720px height): only the visible page contributes now - launching + at the natural size hint (1577x1612): launch maximized so the window takes whatever the monitor + offers + +Minimum drops to 1400x555; verified on a 1920x1200 X display that the status bar is visible and + panels scroll when space runs out. + +Co-Authored-By: Claude Fable 5 + +- Dark-mode legibility for the status bar, sample tables, and surfaces + ([`7b30c95`](https://gitea.psi.ch/mx/AareDAQ/commit/7b30c959a20e62c58f190f5b06dddbdcafa5d956)) + +Status-bar flags get status_colors(theme) (Mocha variants on Sunset) via a new set_theme; sample + tables stop hard-filling rows WHITE and pin dark ink on tinted rows via ForegroundRole; dewar tab + and log panel get solid dark surfaces (transparent renders black on the non-composited X11 + container); developer help cards go square for the same reason. + +Co-Authored-By: Claude Fable 5 + +- Declutter the Local Contact view + ([`c14d93f`](https://gitea.psi.ch/mx/AareDAQ/commit/c14d93ffcf0a9f8c3f3b98318ec772cd153789a8)) + +- drop the redundant Local Contact banner (the window title carries it) - remove the three + parent=self config spinboxes that painted themselves over the top-left corner; parentless + placeholders are replaced in _build_config_tab - remove all rounded corners (status card, value + badges, group boxes, transfer-error frame, recovery panels) - tighten status rows to 2px spacing + with a per-row minimum height so word-wrapped value labels can never compress rows until text + clips (previously visible on the Hardware tab) + +Co-Authored-By: Claude Fable 5 + +- Heal poisoned all-docks-hidden layout and restore layout before watch-only close + ([`3a7f1f5`](https://gitea.psi.ch/mx/AareDAQ/commit/3a7f1f584ad49d72b1fae6617ffa5d7aa9147d7c)) + +A window state saved during the watch-only fold restores as every dock hidden (the + vanished-Sample-List-on-restart bug). Fall back to the default layout when a restore comes back + all-hidden, and put the pre-watch layout back before saving state in closeEvent. + +Co-Authored-By: Claude Fable 5 + +- Opaque faces for floating windows and theme-aware pop-out icons + ([`7f838f4`](https://gitea.psi.ch/mx/AareDAQ/commit/7f838f4b985c24a5003aa5d559e65acc4b27ce4a)) + +A transparent top-level renders black on the container's non-composited X11, so floating docks get a + dynamic floating property feeding the QSS [floating="true"] opaque face, and PopoutWindow sets + WA_StyledBackground. Pop-out titlebar glyphs are now painted in the palette's WindowText color and + re-tint on PaletteChange, so they stay visible after a theme flip. + +Co-Authored-By: Claude Fable 5 + +- Scroll Local Contact tabs so rows keep text height + ([`7a57d85`](https://gitea.psi.ch/mx/AareDAQ/commit/7a57d85282888bf967e6c6e6b756a610dfa4ebf0)) + +The dialog's explicit minimum size is smaller than some tabs' content; without a scroll area Qt + squeezes rows below text height (clipped labels on the Hardware tab). Wrap every tab in a + QScrollArea. + +Co-Authored-By: Claude Fable 5 + +- Window and dock sizing behavior + ([`266f833`](https://gitea.psi.ch/mx/AareDAQ/commit/266f8337a9a1fcc163d2abf8a70a2b1038c454d2)) + +Three main-window chrome fixes: the un-maximized geometry is pre-set to half-screen centered so + leaving maximized mode no longer restores an oversized size hint (the beamline state bar also + stops imposing its ~2000px minimum width); closing a popped-out dock re-docks it instead of + silently hiding the panel, and pop-outs open enlarged and clamped to the screen; state-bar buttons + only update font/stylesheet/cursor when values change, since repolishing every DAQ tick dropped + the hover cursor under a resting mouse. + +Co-Authored-By: Claude Fable 5 + +### Code Style + +- Add typography, tooltip, scrollbar, and card tokens to the palette + ([`e63ddb0`](https://gitea.psi.ch/mx/AareDAQ/commit/e63ddb090f68524b5193fe472176f46534dd1c7f)) + +The QSS gains a role-named font-size ladder (FONT_HERO..FONT_FINE), borderless QToolTip styling for + both themes, soft rounded scrollbars without end arrows, and a card_style() helper with one shared + CARD_RADIUS so card-shaped frames keep uniform geometry. Banner text flips to near-white with a + shadow constant for the painted emboss. Recovery-card and console-log colors are marked TODO for a + later retheme. + +Co-Authored-By: Claude Fable 5 + +- Apply the typography ladder and card_style across the GUI + ([`913089b`](https://gitea.psi.ch/mx/AareDAQ/commit/913089b9b62793f74e003c7afa2fd35c12f25864)) + +Inline font-size literals become FONT_* tokens and hand-written card QSS collapses into card_style() + (recovery cards and console-log notifications keep FLAT_CARD_RADIUS). TitleLabel paints its text + by hand — QSS has no text-shadow — for an embossed banner title, elided when narrow, and gains a + section_title() helper for small in-panel headings. + +Co-Authored-By: Claude Fable 5 + +- Centralize the GUI color palette in styles.py + ([`271ca54`](https://gitea.psi.ch/mx/AareDAQ/commit/271ca54d9ad3a2001dddaa5c4f960c8929f13d3c)) + +Every color literal in the GUI moves into one palette module: ~200 grouped constants, a qcolor() + helper (hue from the theme, alpha at the call site), and both QSS stylesheets become + string.Templates fed by _palette() so a renamed constant fails loudly. Also retints: light + background #d8e4fd -> #e2e7ee, banner indigo -> #a2b7e4, and the portrait dark theme adopts + Catppuccin Macchiato. + +Co-Authored-By: Claude Fable 5 + +- Clear the basedpyright gate for the new-code lines + ([`4ef2ad6`](https://gitea.psi.ch/mx/AareDAQ/commit/4ef2ad64d706c2fbc0631668f00bdd8266f5ace3)) + +Narrow QApplication.instance() before use, wrap the theme QSettings read in str(), hand + QPropertyAnimation a real QByteArray, and declare the lazily-set watch-mode attributes on the + class. + +Co-Authored-By: Claude Fable 5 + +- Clear the basedpyright gate for the ported round + ([`84ccf27`](https://gitea.psi.ch/mx/AareDAQ/commit/84ccf275f9e2e954ee415ee905b7e3d90a43d518)) + +Declare MainWindow's lazily-set attributes, guard Optional layouts and the sample tab bar, wrap + QSettings reads (typed object even with type=...), include _press_geom in the pop-out resize + guard, and ignore the PySide6 stub gap on setGraphicsEffect(None). + +Co-Authored-By: Claude Fable 5 + +- Clear the two portrait-mode diff-gate violations + ([`ed42738`](https://gitea.psi.ch/mx/AareDAQ/commit/ed42738693e6033ebeb5877c15bb842ed52e915e)) + +The sample-name labels are created in __init__ now (the build helper only styles and mounts them) so + reportUninitializedInstanceVariable stops firing on the ported styling lines, and the queue + placeholder uses the scoped Qt.AlignmentFlag.AlignCenter. + +Co-Authored-By: Claude Fable 5 + +- Compact the control panels + ([`5f44be2`](https://gitea.psi.ch/mx/AareDAQ/commit/5f44be2a62a8d978d51ee29398aaa4845456147e)) + +Vertical-space pass: samcam merges exposure+gain onto one row, ABR and monochromator tighten their + grids (energy now displayed in keV, DAQ API stays eV), beam-mark's clear button shares the + readings row, the data collection pages move Run/Abort under the last configurable row and the tab + area becomes QTabBar+QStackedWidget, the raster grid table gets a fixed height, and the automation + panel drops its own title since the dock title bar already says it. Control panels start expanded + via default_collapsed=False. + +Co-Authored-By: Claude Fable 5 + +- Cool the sunset gradient base + ([`0b696a5`](https://gitea.psi.ch/mx/AareDAQ/commit/0b696a56f0f051dc1da01f9da86c5b0e6444a361)) + +The warm glow at the bottom of the dusk sky didn't fit — stay in the blue range. + +Co-Authored-By: Claude Fable 5 + +- Declare HoverableButton state attribute for the pyright gate + ([`e818682`](https://gitea.psi.ch/mx/AareDAQ/commit/e818682abdcdc5e4c1db04c48180af7f4218ee3e)) + +The dynamic _beamline_state assignment was a pre-existing pattern, but the panel rewrite turned its + line into a changed line, so the basedpyright diff gate now counts it. Declare the attribute + instead. + +Co-Authored-By: Claude Fable 5 + +- Extend the palette with selection, frame, slider, and sample-status tokens + ([`0bfa9db`](https://gitea.psi.ch/mx/AareDAQ/commit/0bfa9dbbeb5f8798fac8506c420d5ccdb33ed514)) + +SELECTION_BG/TEXT pin the app-wide selection blue to the banner color (was Qt's undeclared palette + default); FRAME_L1/L2/L3 knobs put window, panel, and data-view borders on three tunable levels + (panel etching off by default); QTabBar tabs and filter chips go borderless with a hover + underline; QSlider matches the scrollbar look; scrollbar tracks turn square with a track-colored + corner; SAMPLE_STATUS_* and SAMPLE_ROW_ALT_BG drive the sample-table status tints. + +Co-Authored-By: Claude Fable 5 + +- Fix lint for the banner/adaptive changes + ([`ce0ed20`](https://gitea.psi.ch/mx/AareDAQ/commit/ce0ed20d5a1d4d2f33e662eb8be7bd58fbe2d368)) + +- ruff format and import ordering (main_window, data_collection_settings, beam_center_panel, + beamline_state_panel) - rename unused unpacked variable in test_title_label - replace the + mousePressEvent monkeypatch on the beamline state title with a proper eventFilter so basedpyright + accepts the diff + +Co-Authored-By: Claude Fable 5 + +- Move panel and model colors to the shared palette + ([`b7d6610`](https://gitea.psi.ch/mx/AareDAQ/commit/b7d6610261840ad45ad91b9663c37c52f5915d89)) + +Mechanical swap of hardcoded color literals for styles.py constants and qcolor() across panels, + models, and scan_logic. portrait_mode.py drops its private palette block; beamline_controls and + data_collection_settings gain object names so the new $border QSS rules can target them. The + status-panel test asserts the palette hex instead of 'red'. + +Co-Authored-By: Claude Fable 5 + +- Move widget colors to the shared palette + ([`590e500`](https://gitea.psi.ch/mx/AareDAQ/commit/590e500da5f7ed22b4d1ac515356dff13b06992b)) + +Same mechanical swap for the widgets and the tutorial manager: painter QColors go through qcolor(), + inline QSS literals become palette constants (baton dialog, busy overlay, status bar, camera + overlays, splash screen, numeric inputs). + +Co-Authored-By: Claude Fable 5 + +- Narrow Optionals for basedpyright diff gate + ([`ee7a835`](https://gitea.psi.ch/mx/AareDAQ/commit/ee7a8356a6d46de5e97a010886eb6e7cb1a4f051)) + +QLayout.itemAt/QWidget.layout return Optionals; pyright cannot narrow across repeated method calls, + so hold them in locals before use in tighten_column, _apply_collapsed and _set_visible. + +Co-Authored-By: Claude Fable 5 + +- Narrow the log pop-out view for the pyright gate + ([`2adf8ff`](https://gitea.psi.ch/mx/AareDAQ/commit/2adf8ff6d5a57d98527f45b7450dd3b9565d65e4)) + +The Optional _popout_view is assert-narrowed once after opening; the unguarded accesses were the + last three diff-gate violations. + +Co-Authored-By: Claude Fable 5 + +- Narrow the manual-resize press state for the pyright gate + ([`763a258`](https://gitea.psi.ch/mx/AareDAQ/commit/763a25837c4c880bc9c50d707084237c756c0463)) + +The diff-vs-main basedpyright gate flags QRect(self._press_geom) because only _press_global was + narrowed; both are set together in mousePressEvent, so the extra check is a no-op at runtime. + +Co-Authored-By: Claude Fable 5 + +- Relabel theme entries, tuck prototype views into the View menu + ([`c179ea9`](https://gitea.psi.ch/mx/AareDAQ/commit/c179ea992c8d57d45423317b64b7283296ae485d)) + +Legacy/Portrait themes become Sunrise (default)/Sunset. Automation View and Portrait (now Playlist) + Mode leave the menubar for the View menu with in-progress labels; Return to Main View stays + top-level since it only shows inside the automation view. + +Co-Authored-By: Claude Fable 5 + +- Ruff-format the ported round, scope splash Qt enums + ([`2638308`](https://gitea.psi.ch/mx/AareDAQ/commit/263830841208776fc9b65648313ca2c32775bd87)) + +The sandbox port was ruff-check clean but not ruff-format clean (CI formats before linting); + splash_screen's alignment flags move to the scoped enum since the port put that line into the diff + gate's scope. + +Co-Authored-By: Claude Fable 5 + +- Small panel polish + ([`f7194ca`](https://gitea.psi.ch/mx/AareDAQ/commit/f7194ca3a4fa98a0ab3fa76a40a5955955e113fa)) + +Energy unit moves from spinbox suffix to the label (the suffix ate field width next to the new spin + arrows); samcam exposure/gain get a 3:2 stretch so 3-decimal exposure isn't cut; the Exp. Config. + tab bar gets a BANNER_TAB_GAP spacer under its banner. + +Co-Authored-By: Claude Fable 5 + +- Swap the splash banner text to the white variant + ([`cd4b623`](https://gitea.psi.ch/mx/AareDAQ/commit/cd4b62323c509717641d858fc1d5cb8d9d364603)) + +Copied from aare_banner_w.svg; the black glyphs vanished on the dark splash panel, the white fills + read on it. + +Co-Authored-By: Claude Fable 5 + +- Visual and interaction polish + ([`833a6d1`](https://gitea.psi.ch/mx/AareDAQ/commit/833a6d136f1b862cd38932c0b24083fbe0ebd95a)) + +Windowed startup at 50%x70% instead of maximized; overlay legend now defaults off (it covers the + camera image); square slider handles with grip-line PNG assets (the round handle clipped flat); + warmer sunrise gradient bottom; abr/beam-mark layout tweaks; hover cues on the beamline-state + entries; DPI/font-aware pop-out titlebar icons; the out-of-date Tutorial menu entries are hidden + until content is redone. + +Co-Authored-By: Claude Fable 5 + +### Documentation + +- Note the spreadsheet log-spam TODO in daq_worker + ([`27c9b93`](https://gitea.psi.ch/mx/AareDAQ/commit/27c9b93d5ca87093db33fe3a3fb540421024e75a)) + +load_spreadsheet/load_reference_tools log a GET they never send every ~12.5s poll while base_url is + None; fix later by demoting to debug or logging once on the None->set edge. + +Co-Authored-By: Claude Fable 5 + +### Features + +- Add spin-arrow and check-mark glyph assets + ([`900315d`](https://gitea.psi.ch/mx/AareDAQ/commit/900315d412db59d85a54cd3d5d3409b12b91909b)) + +Co-Authored-By: Claude Fable 5 + +- Camera help overlay, camera-error message, and session badge hover feedback + ([`3db8b11`](https://gitea.psi.ch/mx/AareDAQ/commit/3db8b11dd1039439a844bbe74ab784634fac1bcc)) + +The controls cheatsheet gets its own help badge/overlay instead of riding the detection legend; the + camera-unavailable state now draws the actual error reason bottom-center (pushed from MainWindow + to all three camera views); the session badge shows hover feedback and the vacant overlay reads + 'In viewing mode' with a grab-baton hint. + +Co-Authored-By: Claude Fable 5 + +- Camera session badge and collapsible legend + ([`2054f07`](https://gitea.psi.ch/mx/AareDAQ/commit/2054f078b0d9ad3e982cbace0ccf34dc6c02b562)) + +The camera overlay gains a clickable session badge (opens the session menu at the click position) + and a baton gate: watching stays free, operating clicks are blocked when the baton is elsewhere. + The legend collapses to a ? badge until clicked - the full box covered too much image. + +Co-Authored-By: Claude Fable 5 + +- Collapsible half-height panel banners with a universal gap + ([`a9137b3`](https://gitea.psi.ch/mx/AareDAQ/commit/a9137b3221fff7364d0a3c98d9d6a4199eeb95b9)) + +TitleLabel gains an optional collapsible mode: whole-banner click target, bare +/- glyph (no pill + background), per-title collapsed state persisted in QSettings, and an expand() helper. Banners are + halved to 25px with plain text + QSS font (H3 margins would clip vertically). + +- convert Zoom, Light, Omega, Smargon, Sample camera, Monochromator, ABR meas. pos., Beam mark, Beam + center, Beam size, Dataset path and Loop centering to collapsible banners - new collapsible Exp. + Config. section wrapping the scan tabs - move Manual sample from a bottom dock into the left + column between Dataset path and Exp. Config.; Ctrl+M now expands it instead of raising the dock - + Beamline state banner restyled to match (25px, plain font, bare glyph, whole banner clickable) - + universal 11px banner gap via tighten_column() shared by both panel columns and the left column + stack; ABR banner spans all grid columns and file path / manual sample drop side margins so widths + align - abort button sits under the tabs instead of pinned to the bottom - unit tests for the + collapse behavior + +Co-Authored-By: Claude Fable 5 + +- Cross-fade and palette flip on theme switch + ([`ed8b2bd`](https://gitea.psi.ch/mx/AareDAQ/commit/ed8b2bd16539d22ad2c0b4b5b37c5dc1ac20044d)) + +Freeze the old look in a click-through screenshot overlay and fade it out over the restyled window — + QSS has no transitions and animating the palette would re-polish every widget per frame. Sunset + also flips the app-palette text roles so native primitives QSS can't recolor (spin and combo arrow + glyphs) follow the theme. + +Co-Authored-By: Claude Fable 5 + +- Dusk-gradient theme overhaul with transparent-widget scheme + ([`1946430`](https://gitea.psi.ch/mx/AareDAQ/commit/1946430f0d69c46a41191e9c54e189dd0fa49dd1)) + +Both stylesheets move to transparent children over a gradient painted only by top-level windows; + inputs, buttons, headers, and menus get opaque faces back. Sunset drops Catppuccin Macchiato for + the Daemmerung dusk palette. Spin/combo arrows and check indicators become theme-tinted PNGs. + Widgets stop carrying inline input/text stylesheets so the theme QSS can win (empty stylesheet = + theme reset). + +Co-Authored-By: Claude Fable 5 + +- Float alert banners over content as anchored toasts + ([`1f2a538`](https://gitea.psi.ch/mx/AareDAQ/commit/1f2a538959b7f654dfde6d1d8ac9b2a177a8cab0)) + +Banners in the root layout shifted the whole UI on every message; now they float over the content + root (repositioned on resize) and the baton toast anchors as a compact pill under the camera view, + auto-clearing in 4s instead of 10s. + +Co-Authored-By: Claude Fable 5 + +- Group beam mark/center/size under one Beam Config banner + ([`00e5d11`](https://gitea.psi.ch/mx/AareDAQ/commit/00e5d116a61c16e91bbf456c05e90ca8341f18d9)) + +The three small beam panels shared a column with three collapsible banners; BeamConfigPanel puts + them under a single collapsible 'Beam Config.' TitleLabel with section_title() sub-headings. + beam_mark/beam_center/beam_size stay as aliases on BeamlineControls so main_window signal wiring + is untouched. + +Co-Authored-By: Claude Fable 5 + +- Hide operation panels in watch-only mode + ([`d127863`](https://gitea.psi.ch/mx/AareDAQ/commit/d127863b1f8fc6907828aef9b8aca26a64bfe03d)) + +Without the baton the GUI now shows only the camera stream and status bar; every operating surface + (panels, docks, pop-out mirrors) is hidden outright. Regaining the baton restores dock layout via + saveState/ restoreState — per-dock visibility snapshots lose docks tabbed behind others — so + LogDock gains the objectName restoreState requires. + +Co-Authored-By: Claude Fable 5 + +- Horizontal beamline state bar above the status bar + ([`9ef4032`](https://gitea.psi.ch/mx/AareDAQ/commit/9ef4032d06274fb1448907f21b53b53b2ac34400)) + +Replaces the vertical station map that consumed left-column space with a slim always-visible strip + in the bottom toolbar area, directly above the status bar: + +- states in physical beamline order, 18px text, one line when the bar is wide enough and wrapped at + the last space otherwise - availability coloring from the route graph plus the status-bar shortcut + transitions: bold blue = active (red for Maintenance), orange = reachable in one step, grey = not + reachable; no backgrounds or rounded corners - transitions only via right-click 'Go to '; + 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 + +- Let panels opt out of starting collapsed + ([`460f703`](https://gitea.psi.ch/mx/AareDAQ/commit/460f7034c37033f5bca7729471a4eb5aa8106aee)) + +TitleLabel gains default_collapsed; the small motor/light panels start open (their per-title + persisted choice still wins). + +Co-Authored-By: Claude Fable 5 + +- Merge Automation progress and Console log into one Information dock + ([`e457236`](https://gitea.psi.ch/mx/AareDAQ/commit/e457236777b80514bc5f24085abd1ee6a0a23df8)) + +The two tabified bottom docks left their switcher tabs stranded at the window bottom; one + Information dock with proper tabs mirrors the Sample List dock's layout. LogDock becomes the + LogPanel widget with mirror views for the pop-out and a reveal_requested signal so the owner + controls visibility (Ctrl+Shift+L, notifications). + +Co-Authored-By: Claude Fable 5 + +- Merge Sample List, Reference Tools, and the queue into one dock + ([`1f90098`](https://gitea.psi.ch/mx/AareDAQ/commit/1f9009807d555c96b1be214c9a4d0791deef32e8)) + +Reference Tools was a separate staff-only dock tabified behind Sample List and kept vanishing (saved + dock state, raise order); the automation job list was a third dock for what is conceptually the + same table. One tabbed dock now holds Dewar samples + Auxiliary puck (concept from aaregui2's + QueuePanel): the dewar table doubles as the queue view with the queue buttons and an Unmount + button in a row beneath it, SampleQueuePanel lives on hidden as the queue engine, and queue/flag + membership is edited via right-click or row drags onto the Queued and Flagged chips. Column 0 is a + frozen #+status cell (mounted > queued > flagged > measured, tints context-dependent per chip + filter); non-staff see Auxiliary greyed out with a Staff-only popup instead of hidden. + Ctrl+L/Ctrl+R raise the Dewar/Auxiliary tab. The Sample List and log pop-outs are fully + operational second views on shared models. Riders: MainWindow installs WheelValueGuard, wires the + camera session badge, and moves samcam/monochromator/ABR/beam-config into the left column's + Beamline group (BeamlineControls keeps only zoom/light/omega/smargon). + +Co-Authored-By: Claude Fable 5 + +- Pointing-hand cursor on all interactive widgets + ([`257edc2`](https://gitea.psi.ch/mx/AareDAQ/commit/257edc25f87a88d22a34b2410af47bfdb491eeea)) + +QSS cannot set cursors and per-widget setCursor calls get forgotten as widgets are added, so an + app-level filter catches every Polish event on buttons, combos, and sliders — dialogs and pop-outs + included. + +Co-Authored-By: Claude Fable 5 + +- Pop-out windows instead of floating docks + ([`6e1305c`](https://gitea.psi.ch/mx/AareDAQ/commit/6e1305cb927a11cc04ea86b88366961ec6aa27fd)) + +Floating a dock rips it from the row and reshuffles the rest, so PopoutWindow opens an ADDITIONAL + frameless top-level window instead: 12px outer resize halo (border painted OUTER_GRIP inside the + real edge so an outside-looking grab still works), hand-painted borderless titlebar glyphs, close + hides and keeps geometry. DockTitleBar puts the popout button next to the close box. The console + log adopts it: dock floating disabled, the pop-out view is a second QPlainTextEdit fed by the same + emitter (a shared QTextDocument would make two views fight over one layout), clear() clears both. + +Co-Authored-By: Claude Fable 5 + +- Reference-tools position column and state-driven default sample tab + ([`b088170`](https://gitea.psi.ch/mx/AareDAQ/commit/b08817024dd6c03d8b7f67abfb7a9cd982d0a76e)) + +The reference table gets a display-only '#' column (like the Dewar list) with sort indices shifted + around it; the sample dock switches to the Auxiliary puck tab on entering alignment/maintenance + states and back to Dewar elsewhere, only on state transitions so a manual choice sticks. + +Co-Authored-By: Claude Fable 5 + +- Rename themes to sunrise/sunset, add bluebird theme with Catppuccin-Latte light palette + ([`c13ea11`](https://gitea.psi.ch/mx/AareDAQ/commit/c13ea11430cf595395fc8de83988d73de088b930)) + +Sunrise/sunset replace the original/portrait tokens (QSettings values migrate on restore); bluebird + is sunrise with a flat sky. The light palette is repainted with Catppuccin Latte across alerts, + chips, cards, log, splash, inputs, and status flags, plus button/input height caps and hover rules + in the QSS. + +Co-Authored-By: Claude Fable 5 + +- Rest-to-reveal hint for dock separators + ([`f9a6c7b`](https://gitea.psi.ch/mx/AareDAQ/commit/f9a6c7bc319bad40c015ac692c6ba7857274c712)) + +Separators stay invisible until the mouse rests on one for ~1s (or a drag starts); the QSS + ::separator:hover rule does the hit-testing and a dynamic separatorHint property gates it, so + event() never needs to know where separators are. + +Co-Authored-By: Claude Fable 5 + +- Start all collapsible panels collapsed by default + ([`f84bee6`](https://gitea.psi.ch/mx/AareDAQ/commit/f84bee66ee726598dd38b75f5a8978a29bcc7806)) + +A fresh GUI shows only the banners; the Beamline state panel keeps its own expanded default. A + user's saved per-title states still override. + +Co-Authored-By: Claude Fable 5 + +- Swap the splash banner to an SVG + ([`efcdc0c`](https://gitea.psi.ch/mx/AareDAQ/commit/efcdc0c1912c0024719105411f1bb0a7c09225dd)) + +The PNG banner is replaced by an SVG so the splash artwork scales; the old aare_banner.png is + removed and gui.py loads the .svg path (the stale path yielded a null splash pixmap). + +Co-Authored-By: Claude Fable 5 + +- Theme-aware beamline state panel + ([`7801025`](https://gitea.psi.ch/mx/AareDAQ/commit/7801025802d66291d1bc46177dd1a820ffb6dbd2)) + +The panel paints availability/message colors in code per DAQ tick, so QSS can't retint it — + state_colors(theme) hands it a per-theme dict (Catppuccin Mocha inks for Sunset) and _apply_theme + pushes theme flips. + +Co-Authored-By: Claude Fable 5 + +- Wheel only adjusts values while the right button is held + ([`f87b895`](https://gitea.psi.ch/mx/AareDAQ/commit/f87b8952c8cf9c01f863e5f9a20c96b53e99ad9c)) + +WheelValueGuard (app-level event filter, installed by MainWindow) makes a bare wheel over spin + boxes, sliders, dials, and combos scroll the enclosing scroll area instead of nudging the value - + motor protection. NoWheelScrollArea stops swallowing wheel events since values are now guarded at + the widget. + +Co-Authored-By: Claude Fable 5 + +### Refactoring + +- Shared busy-badge renderer for camera and axis video views + ([`e77dfb4`](https://gitea.psi.ch/mx/AareDAQ/commit/e77dfb4716f7adcb6673593c1d5075824ae9aeb1)) + +draw_busy_badge in busy_overlay renders the title+subtext pill once; the sample camera and axis + video overlays both delegate to it instead of keeping diverging copies. The axis panel's dot+label + status pill and its per-theme QSS go away with it. + +Co-Authored-By: Claude Fable 5 + +### Testing + +- Cover the beamline state bar + ([`3175e43`](https://gitea.psi.ch/mx/AareDAQ/commit/3175e437a4ebf4c749d4f6c841d67f35a506fdeb)) + +Availability sets (routes + menu shortcuts, Moving/unknown), signal gating, palette and cursors per + availability, red/blue active states, adaptive label wrapping, left-click hint paths, hover-hint + timer lifecycle, and pending-target clearing. Lifts the PR diff coverage back over the 80 percent + gate (measured 88 percent locally). + +Co-Authored-By: Claude Fable 5 + +- Cover the camera overlays, theme migration, layout heal, and splash + ([`7b4764e`](https://gitea.psi.ch/mx/AareDAQ/commit/7b4764e7caa336e2b26165cc3cbd43f6afed86f7)) + +Diff coverage vs main was 77%, under the 80% CI gate; the new camera help/error/badge code and the + theme+layout main_window paths were the uncovered bulk. Locally: 82%. + +Co-Authored-By: Claude Fable 5 + +- Cover the sample-status logic, wheel guard, pop-outs, and log mirror + ([`69b6813`](https://gitea.psi.ch/mx/AareDAQ/commit/69b68130259827ba2166360474959d45d0ec5310)) + +New tests for what the port added: status tint priority and context-dependent chip filters on the + dewar/queue model, the right-button wheel guard (motor protection), PopoutWindow edge maths, + manual-resize fallback, close-hides behavior and DockTitleBar, the chip drag-drop relabeling, and + the console-log pop-out mirror. The widgets' __main__ self-checks are superseded by these and + removed. Brings PR diff coverage from 70% to 81% (gate: 80%). + +Co-Authored-By: Claude Fable 5 + +- Inline smoke check for the wheel guard + ([`546fb5d`](https://gitea.psi.ch/mx/AareDAQ/commit/546fb5d3f041f71410093604e8c712013a0deea5)) + +Co-Authored-By: Claude Fable 5 + +- Track the sample-table column shift, sort imports + ([`0b80c75`](https://gitea.psi.ch/mx/AareDAQ/commit/0b80c75c63d58d03666c354744c4074e8d1952c6)) + +The frozen #+status column shifted data columns +1, so the User-column model tests move from index 5 + to 6; ruff import-sort fixes for main_window and log_panel ride along. + +Co-Authored-By: Claude Fable 5 + + ## v0.7.3 (2026-08-11) ### Bug Fixes diff --git a/pyproject.toml b/pyproject.toml index d6f89c8e..9f191460 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "aaredaq" -version = "0.7.3" +version = "0.8.0" description = "AareDAQ (with GUI)" readme = "README.md" requires-python = ">=3.11"