| Age | Commit message (Collapse) | Author |
|
- Fix duplicated device names ("FT231X USB UART - FT231X USB UART (...)")
— pyserial on Linux often reports the same udev model string twice for
cheap FTDI/CH340-style adapters. Collapse it at the list_ports() source
so every consumer (device auto-name, port picker) benefits.
- Save Control Panel / Namespace dock area, floating geometry, visibility,
size and order to .labui profiles via QMainWindow.saveState()/
restoreState(), round-tripped through the existing Profile.settings
passthrough (self._settings) — no profile schema change needed.
- Channels tab: replace the per-row Signal ⊕ button (and its pinned/
frozen-column overlay) with a single "Create Channel" button below the
Namespace panel. Select one or more Signal/Channel rows (multi-select
now supported) and click it — selected rows become the new Channel's
sources, or an empty Channel is created if nothing's selected. Fixes a
bug in the process: the multi/zero-source path defaulted to
kind="expression" with no expression text, which fails to compile and
silently dropped the channel; use kind="none" instead, which the user
then edits in the Channels pane.
NamespacePanel itself (ui/namespace_panel.py) goes back to a plain
read-only reference widget — the create-channel button and its logic
live entirely in ConfigWindow (config_window.py), so the shared
dockable Namespace panel on the main window is unaffected.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
Device tab stays hardware-only (pins, wiring, may vary per workstation);
the Channels window owns the profile-facing identity. Concretely:
- Fix a real regression: SerialDevice generic-format Apply & Reconnect
nulled out custom channel_names/units every time (no fallback, unlike
every other optional field in reconfigure()), silently reverting to
sig0/sig1/... ids.
- Plot legend now live-tracks the current Signal/Channel name instead of
freezing tr.label at add-time, so a rename shows up without re-adding
the trace.
- Add an inline quick-reconnect (combo + button, pre-selects the actual
current source) directly on each Channel block in the Channels window,
for the common single-source case — rewiring hardware no longer means
touching every Plot/pipeline that referenced it.
- Collapse the Channel ID field behind an "ID ▸" advanced toggle;
channel_id is already auto-derived from the name (_slug_id) and rarely
needs to be seen.
- Devices tab's Signal "Name" column relabeled "Label" with a tooltip —
de-emphasized now that Channel name is the real identity.
- Move "create a Channel from this Signal" from a column on the Devices
tab's signal table to a ⊕ button on each Signal row in the Channels
tab's Namespace panel — the action now lives where the identity is
created, not on the hardware tab. Only that instance opts in
(on_create_channel); the read-only Namespace dock on the main window
is unaffected.
- Floor the Namespace panel's width at its columns' natural size so
dragging the Channels-tab splitter narrower can't push the ⊕ column
behind the horizontal scrollbar.
- Breadcrumb log when a profile-saved Signal override can't be applied
because the signal_id no longer exists.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
Arduino analog Signal ids used to be the pin name itself, so fixing a
wrong pin silently changed the id and orphaned any plot trace, control,
or filter pipeline pointing at it. Analog Signal ids are now positional
(ai0, ai1, ...) and decoupled from the underlying pin, matching how
digital I/O already worked.
More broadly, formalizes a Device -> Signal -> Channel -> Plot naming
model (SignalConfig for physical device channels, Channel for derived/
computed ones) and adds core/reference_registry.py to propagate any
Signal or Channel id rename through plot traces, controls, and filter
pipelines instead of leaving them dangling. Signal ids are now editable
in the Signals tab with the same propagation.
.labui profile schema bumped to v2.0 with a transparent migration for
old files, including remapping old pin-name Signal ids to the new
positional ones. Removed six confirmed-dead files (two legacy device
classes, four superseded top-level ui/ duplicates).
|
|
Channel ID renames
Generalized the Plot pane drag-to-reorder (_PaneDragHandle/_PlotDropContainer
-> _DragHandle/_DragReorderContainer) and reused it for the Channels tab's
derived-channel list; reordering also updates SignalProcessor's evaluation
order (list order matters for chained Channels) via new reorder_derived().
Namespace panel: added an ID column (bare channel_id, matching the actual
channels.get(...) script convention) and fixed the Source column for
Channels to show resolved absolute references (dev_id/ch_id for a Signal,
bare id for a chained Channel) instead of the operation kind, so a chain
is traceable by eye.
Fixed a real bug this surfaced: renaming a Channel's ID never propagated
to other Channels' sources, leaving dangling ("derived", old_id)
references that silently stopped updating. Added
SignalProcessor.rename_derived() to fix up sources plus carry the ring
buffer/latest-value cache to the new key, wired to DerivedBlock's Apply.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
Root cause of "QFont::setPointSize: Point size <= 0 (-1)" on some
dropdowns: the app never sets an explicit widget style, so it defaults to
native windowsvista, whose popup code calls setPointSize() on fonts
resolved from our QSS's pixel-based font-size (pointSize() is -1 by
design for px fonts). Tried app.setStyle("Fusion") first — silences it,
but Fusion doesn't render buttons/dropdowns to match the QSS the way the
native style does. Kept native style, filtered just that one message via
qInstallMessageHandler instead — it's cosmetic Qt console noise (the
rejected setPointSize call is a no-op, doesn't affect rendering), not a
real bug.
Also adds a handful of tooltips (Control Editor's Check Syntax/Cancel/
Create Control, device Configure dialog's Close, main toolbar's View/
Configure/RUN/LOG/Settings, a few Control Panel widgets) from an
in-progress app-wide tooltip pass, paused partway through by request —
remaining buttons are being done manually.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
New right-docked panel (mirrors Control Panel's dock, opposite side)
listing every Signal, Channel, and shared `vars` key currently in the
profile, with live values and a double-click-to-copy reference snippet
(vars.get(...) / channels.get(...)) for use in scripts. Closed by
default — opt-in config tool, no collapse-strip nag like Control Panel
gets since it's not needed mid-run.
Also moves Configuration out of the View menu into its own toolbar
button, and makes table row hover match the selection highlight color.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|