from __future__ import annotations import sys from PySide6.QtCore import QTimer from PySide6.QtMultimedia import QVideoSink from PySide6.QtWidgets import QApplication from duck_preview.camera.service import CameraService from duck_preview.dispatcher.frame_dispatcher import FrameDispatcher from duck_preview.main_window import MainWindow from duck_preview.rendering.overlay import OverlayWidget from duck_preview.rendering.video_widget import VideoWidget from duck_preview.telemetry.collector import TelemetryCollector def main() -> None: app = QApplication(sys.argv) app.setApplicationName("Duck Preview") camera = CameraService() video_sink = QVideoSink() dispatcher = FrameDispatcher() telemetry = TelemetryCollector() video_widget = VideoWidget() overlay = OverlayWidget() camera.set_video_widget(video_widget) camera.set_video_sink(video_sink) video_sink.videoFrameChanged.connect(dispatcher.on_frame) dispatcher.subscribe(telemetry.on_frame) window = MainWindow(camera, video_widget, overlay) camera.error_occurred.connect(lambda msg: overlay.set_metrics({"error": msg})) metrics_timer = QTimer() metrics_timer.timeout.connect(lambda: overlay.set_metrics(telemetry.metrics())) metrics_timer.start(200) window.show() sys.exit(app.exec()) if __name__ == "__main__": main()