diff --git a/controllers/main_controller.py b/controllers/main_controller.py index 79fedc8..59c304a 100644 --- a/controllers/main_controller.py +++ b/controllers/main_controller.py @@ -8,7 +8,7 @@ from core.media import MediaRepository from core.camera.camera_manager import CameraManager from ui.widgets.color_list_widget import ColorListWidget from ui.widgets.thumbnail_list_widget import ThumbnailListWidget -from ui.widgets.split_view_widget import SplitView, CameraPlaceholder +from ui.widgets.split_view_widget import SplitView, CameraPlaceholder, ViewWithOverlay class MainController: @@ -23,6 +23,7 @@ class MainController: self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget self.split_view: SplitView = view.preview_widget self.welcome_view: CameraPlaceholder = self.split_view.widget_start + self.live_view: ViewWithOverlay = self.split_view.widget_live self.photo_button: QPushButton = view.photo_button self.record_button: QPushButton = view.record_button @@ -48,10 +49,9 @@ class MainController: # UI control signals self.photo_button.clicked.connect(self.take_photo) - # self.record_button.clicked.connect(self.toggle_record) # Placeholder self.welcome_view.camera_start_btn.clicked.connect(self.camera_detect) - # You will need a way to select a camera, e.g., a combobox. - # self.view.camera_combobox.currentIndexChanged.connect(self.on_camera_selected_in_ui) + self.live_view.rotateCW.connect(self.camera_manager.rotate_right) + self.live_view.rotateCCW.connect(self.camera_manager.rotate_left) def load_colors(self) -> None: """Loads colors from the database and populates the list.""" diff --git a/core/camera/camera_controller.py b/core/camera/camera_controller.py index f6530e9..d85a93f 100644 --- a/core/camera/camera_controller.py +++ b/core/camera/camera_controller.py @@ -18,6 +18,7 @@ class CameraWorker(QObject): self.fps = 15 self.is_streaming = False self.is_connected = False + self._rotation_index = 0 self._camera_mutex = QMutex() @Slot() @@ -93,13 +94,30 @@ class CameraWorker(QObject): self.error_occurred.emit(error_msg) return - if frame is not None: - # Process the frame and emit it. - rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - h, w, ch = rgb_image.shape - qimg = QImage(rgb_image.data, w, h, ch * w, QImage.Format.Format_RGB888) - pixmap = QPixmap.fromImage(qimg) - self.frame_ready.emit(pixmap) + if frame is None: + return + + if self._rotation_index == 1: + frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) + elif self._rotation_index == 2: + frame = cv2.rotate(frame, cv2.ROTATE_180) + elif self._rotation_index == 3: + frame = cv2.rotate(frame, cv2.ROTATE_90_COUNTERCLOCKWISE) + + # Process the frame and emit it. + rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + h, w, ch = rgb_image.shape + qimg = QImage(rgb_image.data, w, h, ch * w, QImage.Format.Format_RGB888) + pixmap = QPixmap.fromImage(qimg) + self.frame_ready.emit(pixmap) + + @Slot() + def rotate_left(self): + self._rotation_index = (self._rotation_index - 1) % 4 + + @Slot() + def rotate_right(self): + self._rotation_index = (self._rotation_index + 1) % 4 @@ -115,6 +133,8 @@ class CameraController(QObject): _stop_camera_requested = Signal() _start_stream_requested = Signal() _stop_stream_requested = Signal() + _rotate_left_requested = Signal() + _rotate_right_requested = Signal() def __init__(self, parent: QObject | None = None) -> None: super().__init__(parent) @@ -135,6 +155,8 @@ class CameraController(QObject): self._stop_camera_requested.connect(self._worker.stop_camera) self._start_stream_requested.connect(self._worker.start_stream) self._stop_stream_requested.connect(self._worker.stop_stream) + self._rotate_left_requested.connect(self._worker.rotate_left) + self._rotate_right_requested.connect(self._worker.rotate_right) # Initialize worker when thread starts self._thread.started.connect(self._worker.initialize_worker) @@ -162,4 +184,11 @@ class CameraController(QObject): def stop_stream(self) -> None: self._stop_stream_requested.emit() + + def rotate_left(self): + self._rotate_left_requested.emit() + + def rotate_right(self): + self._rotate_right_requested.emit() + \ No newline at end of file diff --git a/core/camera/camera_manager.py b/core/camera/camera_manager.py index dc1ed86..6ae0aad 100644 --- a/core/camera/camera_manager.py +++ b/core/camera/camera_manager.py @@ -115,6 +115,12 @@ class CameraManager(QObject): def get_active_camera_info(self) -> dict | None: return self._active_camera_info + def rotate_left(self): + self._camera_controller.rotate_left() + + def rotate_right(self): + self._camera_controller.rotate_right() + def shutdown(self) -> None: """Zamyka kontroler kamery i jego wÄ…tek.""" self.stop_camera()