diff options
| author | Christian Kolset <christian.kolset@gmail.com> | 2026-06-09 15:40:41 -0600 |
|---|---|---|
| committer | Christian Kolset <christian.kolset@gmail.com> | 2026-06-09 15:40:41 -0600 |
| commit | c16b8546c72673534965da5590a62ba3ee7635d3 (patch) | |
| tree | a429f65f6dbe62c1253c8c31730b8420153678be /plugins/motion_capture/camera_panel.py | |
| parent | 254df94e71586216991486242ab4064706177465 (diff) | |
| parent | a35b9b121218625445bda40729a8222243199c77 (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.py | 78 |
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, + ) |
