| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- """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)
|