summaryrefslogtreecommitdiff
path: root/plugins/motion_capture/camera_panel.py
diff options
context:
space:
mode:
authorChristian Kolset <christian.kolset@gmail.com>2026-06-09 15:40:41 -0600
committerChristian Kolset <christian.kolset@gmail.com>2026-06-09 15:40:41 -0600
commitc16b8546c72673534965da5590a62ba3ee7635d3 (patch)
treea429f65f6dbe62c1253c8c31730b8420153678be /plugins/motion_capture/camera_panel.py
parent254df94e71586216991486242ab4064706177465 (diff)
parenta35b9b121218625445bda40729a8222243199c77 (diff)
Merge fix/add-devices-steamline: streamlined Add Device dialog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'plugins/motion_capture/camera_panel.py')
-rw-r--r--plugins/motion_capture/camera_panel.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/plugins/motion_capture/camera_panel.py b/plugins/motion_capture/camera_panel.py
new file mode 100644
index 0000000..3fdd286
--- /dev/null
+++ b/plugins/motion_capture/camera_panel.py
@@ -0,0 +1,78 @@
+"""
+motion_capture/camera_panel.py
+
+CameraPanel for AddDeviceDialog — shows selected camera info and builds
+a CameraDevice when the user clicks "Add Device".
+Camera discovery and simulation toggle are handled by AddDeviceDialog.
+"""
+
+from __future__ import annotations
+
+from PyQt6.QtCore import QThread, pyqtSignal
+from PyQt6.QtWidgets import QLabel, QVBoxLayout, QWidget
+
+
+class CameraScanThread(QThread):
+ cameras_found = pyqtSignal(list) # list of (index: int, label: str)
+
+ def run(self):
+ results = []
+ try:
+ import cv2
+ for i in range(6):
+ cap = cv2.VideoCapture(i)
+ if cap.isOpened():
+ ret, _ = cap.read()
+ if ret:
+ w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
+ h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
+ results.append((i, f"Camera {i} ({w}×{h})"))
+ cap.release()
+ except ImportError:
+ pass
+ self.cameras_found.emit(results)
+
+
+class CameraPanel(QWidget):
+ """Config panel for Camera device in AddDeviceDialog."""
+
+ def __init__(self):
+ super().__init__()
+ self._selected_index: int = 0
+ self._simulate: bool = False
+
+ lay = QVBoxLayout(self)
+ lay.setContentsMargins(0, 4, 0, 4)
+ lay.setSpacing(8)
+
+ self._selected_lbl = QLabel("No camera selected — scan above and click a camera")
+ self._selected_lbl.setObjectName("traceSource")
+ self._selected_lbl.setWordWrap(True)
+ lay.addWidget(self._selected_lbl)
+
+ note = QLabel(
+ "Requires OpenCV: pip install opencv-python\n"
+ "Use Simulation mode if no camera is available."
+ )
+ note.setObjectName("traceSource")
+ note.setWordWrap(True)
+ lay.addWidget(note)
+ lay.addStretch()
+
+ def is_valid(self) -> bool:
+ return True
+
+ def set_simulate(self, simulate: bool):
+ self._simulate = simulate
+
+ def set_camera_index(self, index: int):
+ self._selected_index = index
+ self._selected_lbl.setText(f"Selected: Camera {index}")
+
+ def build_device(self, device_id: str):
+ from device import CameraDevice
+ return CameraDevice(
+ device_id=device_id,
+ camera_index=self._selected_index,
+ simulate=self._simulate,
+ )