from __future__ import annotations from app.qt_compat import QLabel, QVBoxLayout, QWidget from app.ui.preview_fullscreen import FullscreenPreviewWindow from app.ui.preview_modes import PREVIEW_MODE_TILE, normalize_preview_mode from app.ui.preview_widget import PreviewWidget class ScenePreviewArea(QWidget): def __init__(self, controller, preview_mode: str = PREVIEW_MODE_TILE, parent: QWidget | None = None) -> None: super().__init__(parent) self.controller = controller self.preview_mode = normalize_preview_mode(preview_mode) self.fullscreen_preview = FullscreenPreviewWindow(self.controller, preview_mode=self.preview_mode, scene_role="live") layout = QVBoxLayout(self) layout.setContentsMargins(0, 12, 0, 0) layout.setSpacing(14) self.preview_title = QLabel("Preview") self.preview_title.setStyleSheet("font-size: 12px; font-weight: 600; color: #CCCCCC; padding: 0 0 6px 2px;") layout.addWidget(self.preview_title) self.single_preview_container = QWidget() single_layout = QVBoxLayout(self.single_preview_container) single_layout.setContentsMargins(0, 0, 0, 0) single_layout.setSpacing(0) self.preview_widget = PreviewWidget(self.controller, preview_mode=self.preview_mode, scene_role="live") self.preview_widget.tileClicked.connect(self.controller.set_selected_tile) single_layout.addWidget(self.preview_widget, 1) layout.addWidget(self.single_preview_container, 1) self.foh_preview_container = QWidget() foh_layout = QVBoxLayout(self.foh_preview_container) foh_layout.setContentsMargins(0, 0, 0, 0) foh_layout.setSpacing(12) self.live_preview_widget = PreviewWidget(self.controller, preview_mode=self.preview_mode, scene_role="live") self.live_preview_widget.tileClicked.connect(self.controller.set_selected_tile) live_panel, self.live_preview_label = self._build_scene_preview_panel("Live", self.live_preview_widget) foh_layout.addWidget(live_panel, 1) self.next_preview_widget = PreviewWidget(self.controller, preview_mode=self.preview_mode, scene_role="next") self.next_preview_widget.tileClicked.connect(self.controller.set_selected_tile) next_panel, self.next_preview_label = self._build_scene_preview_panel("Next", self.next_preview_widget) foh_layout.addWidget(next_panel, 1) layout.addWidget(self.foh_preview_container, 1) def set_preview_mode(self, mode: str) -> None: self.preview_mode = normalize_preview_mode(mode) self.preview_widget.set_preview_mode(self.preview_mode) self.live_preview_widget.set_preview_mode(self.preview_mode) self.next_preview_widget.set_preview_mode(self.preview_mode) self.fullscreen_preview.set_preview_mode(self.preview_mode) def set_foh_mode(self, enabled: bool) -> None: self.single_preview_container.setVisible(not enabled) self.foh_preview_container.setVisible(enabled) def set_scene_labels(self, live_label: str, next_label: str) -> None: self.live_preview_label.setText(live_label) self.next_preview_label.setText(next_label) def toggle_fullscreen(self) -> None: if self.fullscreen_preview.isVisible(): self.fullscreen_preview.hide() else: self.fullscreen_preview.showFullScreen() def _build_scene_preview_panel(self, title: str, preview_widget: PreviewWidget) -> tuple[QWidget, QLabel]: panel = QWidget() layout = QVBoxLayout(panel) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(6) title_label = QLabel(title) title_label.setStyleSheet("font-size: 13px; font-weight: 600; color: #E6E6E6; padding-left: 2px;") layout.addWidget(title_label) preview_widget.setMinimumHeight(220) layout.addWidget(preview_widget, 1) return panel, title_label