"""Fullscreen display window for showing timers on a separate monitor.""" from PyQt6.QtWidgets import QWidget, QVBoxLayout, QScrollArea, QApplication, QLabel from PyQt6.QtCore import Qt, pyqtSignal from PyQt6.QtGui import QFont class FullscreenDisplay(QWidget): closed = pyqtSignal() def __init__(self, monitor_index=0): super().__init__() self.monitor_index = monitor_index self.timer_widget_mirrors = {} # Maps original widget to mirror widget self.init_ui() def init_ui(self): # Set window flags for fullscreen self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint) self.setStyleSheet("background-color: #1a1a1a;") # Main layout - timers will split the screen evenly self.timers_layout = QVBoxLayout(self) self.timers_layout.setContentsMargins(0, 0, 0, 0) self.timers_layout.setSpacing(0) # Position on selected monitor self.position_on_monitor() # Show fullscreen self.showFullScreen() def position_on_monitor(self): screens = QApplication.screens() if self.monitor_index < len(screens): screen = screens[self.monitor_index] self.setGeometry(screen.geometry()) else: # Fallback to primary screen screen = QApplication.primaryScreen() self.setGeometry(screen.geometry()) def add_timer_widget(self, timer_widget): """Add a mirror of the timer widget to the fullscreen display.""" if timer_widget in self.timer_widget_mirrors: return # Already added # Create a mirror widget that displays the same timer from ui.fullscreen_timer_widget import FullscreenTimerWidget mirror_widget = FullscreenTimerWidget(timer_widget.timer_model) mirror_widget.sync_with(timer_widget) self.timer_widget_mirrors[timer_widget] = mirror_widget self.timers_layout.addWidget(mirror_widget, stretch=1) # Equal stretch for all timers # Connect to sync updates timer_widget.time_updated.connect(mirror_widget.update_display) timer_widget.state_changed.connect(mirror_widget.update_state) # Update all timer sizes self.update_timer_sizes() def remove_timer_widget(self, timer_widget): """Remove the mirror widget when the original is removed.""" if timer_widget in self.timer_widget_mirrors: mirror_widget = self.timer_widget_mirrors[timer_widget] self.timers_layout.removeWidget(mirror_widget) mirror_widget.deleteLater() del self.timer_widget_mirrors[timer_widget] # Update remaining timer sizes self.update_timer_sizes() def update_timer_sizes(self): """Update font sizes based on number of timers.""" num_timers = len(self.timer_widget_mirrors) if num_timers == 0: return # Calculate appropriate font size based on number of timers # More timers = smaller font to fit better if num_timers == 1: time_font_size = 120 title_font_size = 40 elif num_timers == 2: time_font_size = 80 title_font_size = 30 elif num_timers == 3: time_font_size = 60 title_font_size = 24 elif num_timers == 4: time_font_size = 50 title_font_size = 20 else: time_font_size = 40 title_font_size = 16 # Update all mirror widgets for mirror_widget in self.timer_widget_mirrors.values(): mirror_widget.update_font_sizes(time_font_size, title_font_size) def keyPressEvent(self, event): # Allow ESC key to close the fullscreen display if event.key() == Qt.Key.Key_Escape: self.close() super().keyPressEvent(event) def closeEvent(self, event): # Clean up mirror widgets for mirror_widget in list(self.timer_widget_mirrors.values()): mirror_widget.deleteLater() self.timer_widget_mirrors.clear() self.closed.emit() super().closeEvent(event)