diff options
Diffstat (limited to 'plugins/motion_capture/window.py')
| -rw-r--r-- | plugins/motion_capture/window.py | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/plugins/motion_capture/window.py b/plugins/motion_capture/window.py index 082a8f6..40b436f 100644 --- a/plugins/motion_capture/window.py +++ b/plugins/motion_capture/window.py @@ -15,8 +15,8 @@ from __future__ import annotations from PyQt6.QtCore import Qt, QTimer, pyqtSignal from PyQt6.QtGui import QCloseEvent, QImage, QMouseEvent, QPixmap from PyQt6.QtWidgets import ( - QDoubleSpinBox, QFrame, QHBoxLayout, QLabel, QPushButton, - QSizePolicy, QSpinBox, QVBoxLayout, QWidget, + QComboBox, QDoubleSpinBox, QFrame, QHBoxLayout, QLabel, QPushButton, + QSizePolicy, QVBoxLayout, QWidget, ) import numpy as np @@ -92,11 +92,19 @@ class MotionCaptureWindow(QWidget): ctrl.setContentsMargins(10, 6, 10, 6); ctrl.setSpacing(6) ctrl.addWidget(QLabel("Camera:")) - self._cam_spin = QSpinBox() - self._cam_spin.setRange(0, 9); self._cam_spin.setValue(0) - self._cam_spin.setObjectName("traceWidthSpin") - self._cam_spin.setFixedWidth(52) - ctrl.addWidget(self._cam_spin) + self._cam_combo = QComboBox() + self._cam_combo.setObjectName("channelPickerCb") + self._cam_combo.setMinimumWidth(200) + ctrl.addWidget(self._cam_combo) + + self._refresh_btn = QPushButton("⟳") + self._refresh_btn.setObjectName("configButton") + self._refresh_btn.setFixedWidth(28) + self._refresh_btn.setToolTip("Rescan cameras") + self._refresh_btn.clicked.connect(self._scan_cameras) + ctrl.addWidget(self._refresh_btn) + + self._scan_cameras() # populate on open self._conn_btn = QPushButton("Connect") self._conn_btn.setObjectName("applyButton") @@ -136,6 +144,21 @@ class MotionCaptureWindow(QWidget): # ── Actions ─────────────────────────────────────────────────────────── + def _scan_cameras(self): + from tracker import list_cameras + current_idx = self.get_camera_index() + self._cam_combo.blockSignals(True) + self._cam_combo.clear() + self._cameras = list_cameras() # [(index, label), ...] + for _, label in self._cameras: + self._cam_combo.addItem(label) + # Restore selection by index if still present + for i, (idx, _) in enumerate(self._cameras): + if idx == current_idx: + self._cam_combo.setCurrentIndex(i) + break + self._cam_combo.blockSignals(False) + def _toggle_connect(self): if self._connected: self._tracker.stop() @@ -150,7 +173,7 @@ class MotionCaptureWindow(QWidget): self._sim_badge.setVisible(False) self._status.setText("Disconnected") else: - ok = self._tracker.start(self._cam_spin.value()) + ok = self._tracker.start(self.get_camera_index()) if ok: self._connected = True self._conn_btn.setText("Disconnect") @@ -243,10 +266,18 @@ class MotionCaptureWindow(QWidget): # ── State accessors (used by plugin for save/restore) ───────────────── def get_camera_index(self) -> int: - return self._cam_spin.value() + i = self._cam_combo.currentIndex() + cameras = getattr(self, "_cameras", []) + if 0 <= i < len(cameras): + return cameras[i][0] + return 0 def set_camera_index(self, v: int): - self._cam_spin.setValue(v) + cameras = getattr(self, "_cameras", []) + for i, (idx, _) in enumerate(cameras): + if idx == v: + self._cam_combo.setCurrentIndex(i) + return def get_px_per_mm(self) -> float: return self._pxmm_spin.value() |
