summaryrefslogtreecommitdiff
path: root/devices/serial_device.py
diff options
context:
space:
mode:
authorChristian Kolset <christian.kolset@gmail.com>2026-06-09 20:14:54 -0600
committerChristian Kolset <christian.kolset@gmail.com>2026-06-09 20:14:54 -0600
commit0fa0568c06fd770ad104b464197b3bb03123f38e (patch)
tree7706a8a8145ea6f595b641cdfabaaa3f851d30ae /devices/serial_device.py
parentb776e70b4cd94c5d1f53dde39b2e46f6447cac3e (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/serial_device.py')
-rw-r--r--devices/serial_device.py41
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()