diff options
| author | Christian Kolset <christian.kolset@gmail.com> | 2026-06-09 20:14:54 -0600 |
|---|---|---|
| committer | Christian Kolset <christian.kolset@gmail.com> | 2026-06-09 20:14:54 -0600 |
| commit | 0fa0568c06fd770ad104b464197b3bb03123f38e (patch) | |
| tree | 7706a8a8145ea6f595b641cdfabaaa3f851d30ae /devices | |
| parent | b776e70b4cd94c5d1f53dde39b2e46f6447cac3e (diff) | |
UI: streamline Add Device dialog and serial config widget
Add Device dialog:
- Replace Available Devices QGroupBox with plain devWindowTitle label
to match Configuration section style — no box/border
- Auto-scan on open via QTimer.singleShot(0)
- Rename Scan All → Refresh
Serial config widget:
- Fix gap between protocol panel and Available Serial Ports: introduce
_AdaptiveStack (QStackedWidget subclass) that reports only the current
panel's sizeHint; set Fixed vertical size policy so the stack never
expands beyond its content regardless of window size
- Stretch added between Available Serial Ports and Apply & Reconnect so
the button stays pinned to the bottom
- Rename Channels → Signals in _GenericPanel and _SCPIPanel (Signal Queries)
Config dialog (device info tab):
- Rename Channels → Signals
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'devices')
| -rw-r--r-- | devices/serial_device.py | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/devices/serial_device.py b/devices/serial_device.py index 78f74a2..c3ce65f 100644 --- a/devices/serial_device.py +++ b/devices/serial_device.py @@ -27,7 +27,7 @@ from PyQt6.QtCore import Qt, QThread, pyqtSignal from PyQt6.QtWidgets import ( QCheckBox, QComboBox, QDoubleSpinBox, QFormLayout, QGroupBox, QHBoxLayout, QHeaderView, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QPushButton, QScrollArea, QSpinBox, + QListWidgetItem, QPushButton, QScrollArea, QSizePolicy, QSpinBox, QStackedWidget, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget, ) @@ -359,6 +359,30 @@ class SerialDevice(BaseDevice): # ── Config widget ───────────────────────────────────────────────────────────── +class _AdaptiveStack(QStackedWidget): + """QStackedWidget sized to its current panel only — no gap from hidden panels.""" + + def _current_height(self) -> int: + w = self.currentWidget() + if not w: + return 0 + lyt = w.layout() + if lyt: + m = lyt.contentsMargins() + return lyt.sizeHint().height() + m.top() + m.bottom() + return w.sizeHint().height() + + def sizeHint(self): + from PyQt6.QtCore import QSize + h = self._current_height() + w = self.currentWidget() + sw = w.sizeHint().width() if w else super().sizeHint().width() + return QSize(sw, h) if h > 0 else super().sizeHint() + + def minimumSizeHint(self): + return self.sizeHint() + + class SerialConfigWidget(QWidget): def __init__(self, device: SerialDevice): super().__init__() @@ -400,7 +424,7 @@ class SerialConfigWidget(QWidget): root.addWidget(conn_grp) # ── Protocol-specific settings (stacked) ────────────────────────── - self._proto_stack = QStackedWidget() + self._proto_stack = _AdaptiveStack() self._generic_panel = _GenericPanel(device=self.device) self._scpi_panel = _SCPIPanel(device=self.device) self._modbus_panel = _ModbusPanel(device=self.device) @@ -410,6 +434,10 @@ class SerialConfigWidget(QWidget): self._modbus_panel, self._mark10_panel, self._cml_panel): self._proto_stack.addWidget(panel) self._proto_stack.setCurrentIndex(_STACK_IDX.get(self.device._fmt, 0)) + sp = self._proto_stack.sizePolicy() + sp.setVerticalPolicy(QSizePolicy.Policy.Fixed) + self._proto_stack.setSizePolicy(sp) + self._proto_stack.currentChanged.connect(self._fix_stack_height) root.addWidget(self._proto_stack) # ── Port scanner ─────────────────────────────────────────────────── @@ -436,13 +464,16 @@ class SerialConfigWidget(QWidget): scan_lay.addWidget(self._port_list) scan_lay.addWidget(hint) root.addWidget(scan_grp) + root.addStretch() # ── Apply ────────────────────────────────────────────────────────── apply_btn = QPushButton("Apply & Reconnect") apply_btn.setObjectName("applyButton") apply_btn.clicked.connect(self._apply) root.addWidget(apply_btn) - root.addStretch() + + def _fix_stack_height(self, _: int): + self._proto_stack.updateGeometry() def _on_fmt_changed(self, _): fmt = _FORMAT_LABELS.get(self._fmt_cb.currentText(), "key:val") @@ -513,7 +544,7 @@ class _GenericPanel(QWidget): self._ch_spin = QSpinBox() self._ch_spin.setRange(1, 32) self._ch_spin.setValue(len(device.info.channels) if device._fmt in _GENERIC_FORMATS else 4) - lay.addRow("Channels:", self._ch_spin) + lay.addRow("Signals:", self._ch_spin) def collect(self) -> dict: return {"num_channels": self._ch_spin.value()} @@ -529,7 +560,7 @@ class _SCPIPanel(QWidget): lay.setContentsMargins(0, 4, 0, 4) lay.setSpacing(6) - grp = QGroupBox("Channel Queries") + grp = QGroupBox("Signal Queries") grp_lay = QVBoxLayout(grp) self._table = QTableWidget() |
