diff --git a/lazy_player/__init__.py b/lazy_player/__init__.py index e6a3895..6412597 100644 --- a/lazy_player/__init__.py +++ b/lazy_player/__init__.py @@ -20,10 +20,29 @@ class MainWindow(Gtk.ApplicationWindow): list_store: Gtk.StringList video_widget: Gtk.Picture pipeline: Gst.Pipeline + overlay_tick_callback_id: int + overlay_label: Gtk.Label + overlay_hide_time: float def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) + # For overlay text timeout + self.overlay_hide_time = 0.0 + self.overlay_label = Gtk.Label() + self.overlay_label.set_name("overlay-text") + self.overlay_label.set_valign(Gtk.Align.CENTER) + self.overlay_label.set_halign(Gtk.Align.CENTER) + self.overlay_label.set_visible(False) + + def update_overlay(widget: Gtk.Widget, frame_clock: Gdk.FrameClock, data: Any) -> bool: + current_time = frame_clock.get_frame_time() / 1_000_000 + if current_time >= self.overlay_hide_time: + self.overlay_label.set_visible(False) + return True + + self.overlay_tick_callback_id = self.add_tick_callback(update_overlay, None) + # Make window fullscreen and borderless self.set_decorated(False) self.fullscreen() @@ -51,6 +70,7 @@ class MainWindow(Gtk.ApplicationWindow): overlay_box.set_vexpand(True) overlay_box.set_hexpand(True) overlay_box.append(self.video_widget) + overlay_box.append(self.overlay_label) # Setup GStreamer pipeline self.pipeline = Gst.Pipeline.new("video-player") @@ -123,6 +143,7 @@ class MainWindow(Gtk.ApplicationWindow): playbin.set_property("uri", f"file://{os.path.abspath(string)}") self.pipeline.set_state(Gst.State.PLAYING) self.stack.set_visible_child_name("overlay") + self.show_overlay_text(string) self.list_view.connect("activate", on_activate) @@ -243,6 +264,19 @@ class MainWindow(Gtk.ApplicationWindow): Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, new_pos ) + def show_overlay_text(self, text: str, timeout_seconds: float = 1.0) -> None: + """Show text in a centered overlay that disappears after timeout""" + self.overlay_label.set_text(text) + self.overlay_label.set_visible(True) + + # Set absolute time when overlay should hide + frame_clock = self.get_frame_clock() + if frame_clock is None: + return + + frame_time = frame_clock.get_frame_time() / 1_000_000 # Convert to seconds + self.overlay_hide_time = frame_time + timeout_seconds + def _populate_file_list(self) -> None: # TODO: Implement proper version sort (strverscmp equivalent) diff --git a/lazy_player/style.css b/lazy_player/style.css index 886e02a..104a52f 100644 --- a/lazy_player/style.css +++ b/lazy_player/style.css @@ -7,3 +7,12 @@ listview > row { #black-overlay { background-color: black; } + +#overlay-text { + color: white; + font-size: 48px; + font-family: monospace; + background-color: rgba(64, 64, 64, 0.25); + padding: 20px; + border-radius: 10px; +}