Add seeking
This commit is contained in:
parent
4af3ee2164
commit
bdc480ea1e
1 changed files with 52 additions and 2 deletions
|
@ -166,9 +166,8 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
string_obj = cast(Gtk.StringObject, selected_item)
|
string_obj = cast(Gtk.StringObject, selected_item)
|
||||||
self.file_info_label.set_text(string_obj.get_string())
|
self.file_info_label.set_text(string_obj.get_string())
|
||||||
|
|
||||||
def _on_key_pressed(
|
def _on_video_key_pressed(
|
||||||
self,
|
self,
|
||||||
controller: Gtk.EventControllerKey,
|
|
||||||
keyval: int,
|
keyval: int,
|
||||||
keycode: int,
|
keycode: int,
|
||||||
state: Gdk.ModifierType,
|
state: Gdk.ModifierType,
|
||||||
|
@ -179,8 +178,59 @@ class MainWindow(Gtk.ApplicationWindow):
|
||||||
self.list_view.grab_focus()
|
self.list_view.grab_focus()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
elif keyval == Gdk.keyval_from_name("Left"):
|
||||||
|
self._seek_relative(-10)
|
||||||
|
return True
|
||||||
|
|
||||||
|
elif keyval == Gdk.keyval_from_name("Right"):
|
||||||
|
self._seek_relative(10)
|
||||||
|
return True
|
||||||
|
|
||||||
|
elif keyval == Gdk.keyval_from_name("Up"):
|
||||||
|
self._seek_relative(60)
|
||||||
|
return True
|
||||||
|
|
||||||
|
elif keyval == Gdk.keyval_from_name("Down"):
|
||||||
|
self._seek_relative(-60)
|
||||||
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _on_key_pressed(
|
||||||
|
self,
|
||||||
|
controller: Gtk.EventControllerKey,
|
||||||
|
keyval: int,
|
||||||
|
keycode: int,
|
||||||
|
state: Gdk.ModifierType,
|
||||||
|
) -> bool:
|
||||||
|
# If we're showing video, handle keys differently
|
||||||
|
if self.stack.get_visible_child_name() == "overlay":
|
||||||
|
return self._on_video_key_pressed(keyval, keycode, state)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _seek_relative(self, offset: int) -> None:
|
||||||
|
"""Seek relative to current position by offset seconds"""
|
||||||
|
playbin = self.pipeline.get_by_name("playbin")
|
||||||
|
if not playbin:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Query current position
|
||||||
|
success, current = self.pipeline.query_position(Gst.Format.TIME)
|
||||||
|
if not success:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Convert offset to nanoseconds and add to current
|
||||||
|
new_pos = current + (offset * Gst.SECOND)
|
||||||
|
|
||||||
|
# Ensure we don't seek before start
|
||||||
|
if new_pos < 0:
|
||||||
|
new_pos = 0
|
||||||
|
|
||||||
|
# Perform seek
|
||||||
|
self.pipeline.seek_simple(
|
||||||
|
Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, new_pos
|
||||||
|
)
|
||||||
|
|
||||||
def _populate_file_list(self) -> None:
|
def _populate_file_list(self) -> None:
|
||||||
# TODO: Implement proper version sort (strverscmp equivalent)
|
# TODO: Implement proper version sort (strverscmp equivalent)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue