diff --git a/lazy_player/main_window.py b/lazy_player/main_window.py index fb5ecf7..febe553 100644 --- a/lazy_player/main_window.py +++ b/lazy_player/main_window.py @@ -5,7 +5,7 @@ from datetime import datetime from pathlib import Path from typing import Any, cast -from gi.repository import Gdk, GLib, Gtk, Pango +from gi.repository import Gdk, GLib, GObject, Gtk, Pango from .file_model import FileItem, FileListModel, FileType from .thumbnailer import Thumbnailer @@ -22,6 +22,10 @@ class MainWindow(Gtk.ApplicationWindow): overlay_label: Gtk.Label overlay_hide_time: float last_position_save: float + grid_segments: list[list[Gtk.Box]] + grid_overlay: Gtk.Grid + grid_clock: Gtk.Label + main_clock: Gtk.Label directory_history: list[Path] selection_history: dict[str, int] @@ -82,15 +86,50 @@ class MainWindow(Gtk.ApplicationWindow): video_box.set_vexpand(True) video_box.set_hexpand(True) + # Create grid overlay with 3x3 boxes + self.grid_overlay = Gtk.Grid() + self.grid_overlay.set_hexpand(True) + self.grid_overlay.set_vexpand(True) + self.grid_overlay.set_name("grid-overlay") + self.grid_overlay.set_column_homogeneous(True) + self.grid_overlay.set_row_homogeneous(True) + + # Store grid segments in a 3x3 array + self.grid_segments = [[Gtk.Box() for _ in range(3)] for _ in range(3)] + + # Setup 3x3 grid of boxes + for row in range(3): + for col in range(3): + box = self.grid_segments[row][col] + box.set_name("grid-box") + box.set_hexpand(True) + box.set_vexpand(True) + self.grid_overlay.attach(box, col, row, 1, 1) + + # Add clock to top-left grid box + self.grid_clock = Gtk.Label() + self.grid_clock.set_name("grid-clock") + self.grid_clock.set_halign(Gtk.Align.CENTER) + self.grid_clock.set_valign(Gtk.Align.START) + self.grid_clock.set_hexpand(True) + self.grid_clock.set_vexpand(True) + self.grid_clock.set_text(datetime.now().strftime("%H:%M")) + + # Attach to top-left grid box + self.grid_segments[0][0].append(self.grid_clock) + # Create an overlay container overlay = Gtk.Overlay() overlay.set_child(self.video_widget) + overlay.add_overlay(self.grid_overlay) overlay.add_overlay(self.overlay_label) video_box.append(overlay) # Setup video player self.video_player = VideoPlayer(self.video_widget) + self.video_player.connect("notify::is-playing", self._on_player_state_changed) + self.video_player.connect("notify::is-paused", self._on_player_state_changed) # Add both main menu and overlay to stack self.stack.add_named(main_box, "menu") @@ -107,13 +146,12 @@ class MainWindow(Gtk.ApplicationWindow): left_box.set_valign(Gtk.Align.START) left_box.set_halign(Gtk.Align.FILL) - # Create digital clock - self.clock_label = Gtk.Label() - self.clock_label.set_name("digital-clock") - self.clock_label.set_halign(Gtk.Align.CENTER) - self.clock_label.set_valign(Gtk.Align.CENTER) - self.clock_label.set_text(datetime.now().strftime("%H:%M")) - left_box.append(self.clock_label) + # Create main menu clock + self.main_clock = Gtk.Label() + self.main_clock.set_name("digital-clock") + self.main_clock.set_halign(Gtk.Align.CENTER) + self.main_clock.set_valign(Gtk.Align.CENTER) + left_box.append(self.main_clock) # Create image widget for thumbnail self.thumbnail_image = Gtk.Picture() @@ -455,10 +493,21 @@ class MainWindow(Gtk.ApplicationWindow): # Set absolute time when overlay should hide self.overlay_hide_time = self.now + timeout_seconds + def _on_player_state_changed(self, player: VideoPlayer, param: GObject.ParamSpec) -> None: + """Update grid visibility based on player state""" + is_playing = player.get_property("is-playing") + is_paused = player.get_property("is-paused") + + # Show grid only when paused and playing + if self.grid_overlay: + self.grid_overlay.set_visible(is_playing and is_paused) + def _on_tick(self, widget: Gtk.Widget, frame_clock: Gdk.FrameClock, data: Any) -> bool: current_time = frame_clock.get_frame_time() / 1_000_000 - self.clock_label.set_text(datetime.now().strftime("%H:%M")) + current_time_str = datetime.now().strftime("%H:%M") + self.main_clock.set_text(current_time_str) + self.grid_clock.set_text(current_time_str) if current_time >= self.overlay_hide_time: self.overlay_label.set_visible(False) diff --git a/lazy_player/style.css b/lazy_player/style.css index 4bcc609..9d7b088 100644 --- a/lazy_player/style.css +++ b/lazy_player/style.css @@ -38,9 +38,15 @@ listview > row { margin: 8px; } -#digital-clock { +#digital-clock, +#grid-clock { color: white; font-size: 48px; font-family: monospace; - margin: 12px; + padding: 12px; +} + +#grid-clock { + background-color: rgba(32, 32, 32, 0.5); + border-radius: 8px; }