summaryrefslogtreecommitdiff
path: root/ui/control_editor.py
diff options
context:
space:
mode:
Diffstat (limited to 'ui/control_editor.py')
-rw-r--r--ui/control_editor.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/ui/control_editor.py b/ui/control_editor.py
index 901d6f8..c582e6b 100644
--- a/ui/control_editor.py
+++ b/ui/control_editor.py
@@ -17,10 +17,20 @@ from PyQt6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QFormLayout,
QLabel, QLineEdit, QComboBox, QDoubleSpinBox,
QSpinBox, QPushButton, QGroupBox, QWidget,
- QStackedWidget, QFrame, QCheckBox,
+ QStackedWidget, QFrame, QCheckBox, QSizePolicy,
)
from PyQt6.QtCore import Qt
+
+class _DynStack(QStackedWidget):
+ """QStackedWidget that sizes to current page only."""
+ def sizeHint(self):
+ w = self.currentWidget()
+ return w.sizeHint() if w else super().sizeHint()
+ def minimumSizeHint(self):
+ w = self.currentWidget()
+ return w.minimumSizeHint() if w else super().minimumSizeHint()
+
from devices.device_registry import DeviceRegistry
@@ -219,10 +229,14 @@ class ControlEditorDialog(QDialog):
# ── Type-specific params ────────────────────────────────────────
self._params_grp = QGroupBox("Parameters")
+ self._params_grp.setSizePolicy(
+ QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum)
params_lay = QVBoxLayout(self._params_grp)
params_lay.setContentsMargins(10, 16, 10, 10)
- self._stack = QStackedWidget()
+ self._stack = _DynStack()
+ self._stack.setSizePolicy(
+ QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum)
self._param_panels: Dict[str, QWidget] = {}
for name, cls in _PARAM_PANELS.items():
panel = cls()
@@ -230,6 +244,7 @@ class ControlEditorDialog(QDialog):
self._stack.addWidget(panel)
params_lay.addWidget(self._stack)
root.addWidget(self._params_grp)
+ root.addStretch()
# ── Buttons ────────────────────────────────────────────────────
div = QFrame(); div.setFrameShape(QFrame.Shape.HLine)
@@ -258,7 +273,14 @@ class ControlEditorDialog(QDialog):
# Channel (populated after device selection)
self._on_dev_changed()
- self._ch_cb.setCurrentText(self.spec.channel_id)
+ found = False
+ for i in range(self._ch_cb.count()):
+ if self._ch_cb.itemData(i) == self.spec.channel_id:
+ self._ch_cb.setCurrentIndex(i)
+ found = True
+ break
+ if not found:
+ self._ch_cb.setCurrentText(self.spec.channel_id)
self._active_low_chk.setChecked(bool(self.spec.active_low))
# Params
@@ -268,6 +290,8 @@ class ControlEditorDialog(QDialog):
def _on_type_changed(self, type_name: str):
idx = list(_PARAM_PANELS.keys()).index(type_name)
self._stack.setCurrentIndex(idx)
+ self._stack.updateGeometry()
+ self._params_grp.updateGeometry()
self._active_low_chk.setEnabled(type_name == "On/Off Switch")
# Auto-set title if still default
if not self._title_edit.text() or \