fullscreen_display.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. """Fullscreen display window for showing timers on a separate monitor."""
  2. from PyQt6.QtWidgets import QWidget, QVBoxLayout, QScrollArea, QApplication, QLabel
  3. from PyQt6.QtCore import Qt, pyqtSignal
  4. from PyQt6.QtGui import QFont
  5. class FullscreenDisplay(QWidget):
  6. closed = pyqtSignal()
  7. def __init__(self, monitor_index=0):
  8. super().__init__()
  9. self.monitor_index = monitor_index
  10. self.timer_widget_mirrors = {} # Maps original widget to mirror widget
  11. self.init_ui()
  12. def init_ui(self):
  13. # Set window flags for fullscreen
  14. self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
  15. self.setStyleSheet("background-color: #1a1a1a;")
  16. # Main layout - timers will split the screen evenly
  17. self.timers_layout = QVBoxLayout(self)
  18. self.timers_layout.setContentsMargins(0, 0, 0, 0)
  19. self.timers_layout.setSpacing(0)
  20. # Position on selected monitor
  21. self.position_on_monitor()
  22. # Show fullscreen
  23. self.showFullScreen()
  24. def position_on_monitor(self):
  25. screens = QApplication.screens()
  26. if self.monitor_index < len(screens):
  27. screen = screens[self.monitor_index]
  28. self.setGeometry(screen.geometry())
  29. else:
  30. # Fallback to primary screen
  31. screen = QApplication.primaryScreen()
  32. self.setGeometry(screen.geometry())
  33. def add_timer_widget(self, timer_widget):
  34. """Add a mirror of the timer widget to the fullscreen display."""
  35. if timer_widget in self.timer_widget_mirrors:
  36. return # Already added
  37. # Create a mirror widget that displays the same timer
  38. from ui.fullscreen_timer_widget import FullscreenTimerWidget
  39. mirror_widget = FullscreenTimerWidget(timer_widget.timer_model)
  40. mirror_widget.sync_with(timer_widget)
  41. self.timer_widget_mirrors[timer_widget] = mirror_widget
  42. self.timers_layout.addWidget(mirror_widget, stretch=1) # Equal stretch for all timers
  43. # Connect to sync updates
  44. timer_widget.time_updated.connect(mirror_widget.update_display)
  45. timer_widget.state_changed.connect(mirror_widget.update_state)
  46. # Update all timer sizes
  47. self.update_timer_sizes()
  48. def remove_timer_widget(self, timer_widget):
  49. """Remove the mirror widget when the original is removed."""
  50. if timer_widget in self.timer_widget_mirrors:
  51. mirror_widget = self.timer_widget_mirrors[timer_widget]
  52. self.timers_layout.removeWidget(mirror_widget)
  53. mirror_widget.deleteLater()
  54. del self.timer_widget_mirrors[timer_widget]
  55. # Update remaining timer sizes
  56. self.update_timer_sizes()
  57. def update_timer_sizes(self):
  58. """Update font sizes based on number of timers."""
  59. num_timers = len(self.timer_widget_mirrors)
  60. if num_timers == 0:
  61. return
  62. # Calculate appropriate font size based on number of timers
  63. # More timers = smaller font to fit better
  64. if num_timers == 1:
  65. time_font_size = 120
  66. title_font_size = 40
  67. elif num_timers == 2:
  68. time_font_size = 80
  69. title_font_size = 30
  70. elif num_timers == 3:
  71. time_font_size = 60
  72. title_font_size = 24
  73. elif num_timers == 4:
  74. time_font_size = 50
  75. title_font_size = 20
  76. else:
  77. time_font_size = 40
  78. title_font_size = 16
  79. # Update all mirror widgets
  80. for mirror_widget in self.timer_widget_mirrors.values():
  81. mirror_widget.update_font_sizes(time_font_size, title_font_size)
  82. def keyPressEvent(self, event):
  83. # Allow ESC key to close the fullscreen display
  84. if event.key() == Qt.Key.Key_Escape:
  85. self.close()
  86. super().keyPressEvent(event)
  87. def closeEvent(self, event):
  88. # Clean up mirror widgets
  89. for mirror_widget in list(self.timer_widget_mirrors.values()):
  90. mirror_widget.deleteLater()
  91. self.timer_widget_mirrors.clear()
  92. self.closed.emit()
  93. super().closeEvent(event)