refactor: enhance camera rotation functionality and integrate with live view
This commit is contained in:
@@ -8,7 +8,7 @@ from core.media import MediaRepository
|
|||||||
from core.camera.camera_manager import CameraManager
|
from core.camera.camera_manager import CameraManager
|
||||||
from ui.widgets.color_list_widget import ColorListWidget
|
from ui.widgets.color_list_widget import ColorListWidget
|
||||||
from ui.widgets.thumbnail_list_widget import ThumbnailListWidget
|
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:
|
class MainController:
|
||||||
@@ -23,6 +23,7 @@ class MainController:
|
|||||||
self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget
|
self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget
|
||||||
self.split_view: SplitView = view.preview_widget
|
self.split_view: SplitView = view.preview_widget
|
||||||
self.welcome_view: CameraPlaceholder = self.split_view.widget_start
|
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.photo_button: QPushButton = view.photo_button
|
||||||
self.record_button: QPushButton = view.record_button
|
self.record_button: QPushButton = view.record_button
|
||||||
|
|
||||||
@@ -48,10 +49,9 @@ class MainController:
|
|||||||
|
|
||||||
# UI control signals
|
# UI control signals
|
||||||
self.photo_button.clicked.connect(self.take_photo)
|
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)
|
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.live_view.rotateCW.connect(self.camera_manager.rotate_right)
|
||||||
# self.view.camera_combobox.currentIndexChanged.connect(self.on_camera_selected_in_ui)
|
self.live_view.rotateCCW.connect(self.camera_manager.rotate_left)
|
||||||
|
|
||||||
def load_colors(self) -> None:
|
def load_colors(self) -> None:
|
||||||
"""Loads colors from the database and populates the list."""
|
"""Loads colors from the database and populates the list."""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class CameraWorker(QObject):
|
|||||||
self.fps = 15
|
self.fps = 15
|
||||||
self.is_streaming = False
|
self.is_streaming = False
|
||||||
self.is_connected = False
|
self.is_connected = False
|
||||||
|
self._rotation_index = 0
|
||||||
self._camera_mutex = QMutex()
|
self._camera_mutex = QMutex()
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
@@ -93,13 +94,30 @@ class CameraWorker(QObject):
|
|||||||
self.error_occurred.emit(error_msg)
|
self.error_occurred.emit(error_msg)
|
||||||
return
|
return
|
||||||
|
|
||||||
if frame is not None:
|
if frame is None:
|
||||||
# Process the frame and emit it.
|
return
|
||||||
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
|
||||||
h, w, ch = rgb_image.shape
|
if self._rotation_index == 1:
|
||||||
qimg = QImage(rgb_image.data, w, h, ch * w, QImage.Format.Format_RGB888)
|
frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
|
||||||
pixmap = QPixmap.fromImage(qimg)
|
elif self._rotation_index == 2:
|
||||||
self.frame_ready.emit(pixmap)
|
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()
|
_stop_camera_requested = Signal()
|
||||||
_start_stream_requested = Signal()
|
_start_stream_requested = Signal()
|
||||||
_stop_stream_requested = Signal()
|
_stop_stream_requested = Signal()
|
||||||
|
_rotate_left_requested = Signal()
|
||||||
|
_rotate_right_requested = Signal()
|
||||||
|
|
||||||
def __init__(self, parent: QObject | None = None) -> None:
|
def __init__(self, parent: QObject | None = None) -> None:
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
@@ -135,6 +155,8 @@ class CameraController(QObject):
|
|||||||
self._stop_camera_requested.connect(self._worker.stop_camera)
|
self._stop_camera_requested.connect(self._worker.stop_camera)
|
||||||
self._start_stream_requested.connect(self._worker.start_stream)
|
self._start_stream_requested.connect(self._worker.start_stream)
|
||||||
self._stop_stream_requested.connect(self._worker.stop_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
|
# Initialize worker when thread starts
|
||||||
self._thread.started.connect(self._worker.initialize_worker)
|
self._thread.started.connect(self._worker.initialize_worker)
|
||||||
@@ -162,4 +184,11 @@ class CameraController(QObject):
|
|||||||
|
|
||||||
def stop_stream(self) -> None:
|
def stop_stream(self) -> None:
|
||||||
self._stop_stream_requested.emit()
|
self._stop_stream_requested.emit()
|
||||||
|
|
||||||
|
def rotate_left(self):
|
||||||
|
self._rotate_left_requested.emit()
|
||||||
|
|
||||||
|
def rotate_right(self):
|
||||||
|
self._rotate_right_requested.emit()
|
||||||
|
|
||||||
|
|
||||||
@@ -115,6 +115,12 @@ class CameraManager(QObject):
|
|||||||
def get_active_camera_info(self) -> dict | None:
|
def get_active_camera_info(self) -> dict | None:
|
||||||
return self._active_camera_info
|
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:
|
def shutdown(self) -> None:
|
||||||
"""Zamyka kontroler kamery i jego wątek."""
|
"""Zamyka kontroler kamery i jego wątek."""
|
||||||
self.stop_camera()
|
self.stop_camera()
|
||||||
|
|||||||
Reference in New Issue
Block a user