86 lines
3.9 KiB
Python
86 lines
3.9 KiB
Python
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
|