emmental/audio/scale.py

60 lines
1.9 KiB
Python
Raw Normal View History

# Copyright 2021 (c) Anna Schumaker.
from gi.repository import GLib
from gi.repository import Gtk
from gi.repository import Gst
class ScalePlus(Gtk.Scale):
def __init__(self, min, max, step, page):
Gtk.Scale.__init__(self)
self.set_range(min, max)
self.set_increments(step, page)
self.set_value(min)
self.set_draw_value(True)
self.set_hexpand(True)
self.set_format_value_func(self.format_value)
def __change_value__(self, n, scroll):
value = self.get_value()
self.set_value(value + n)
new = self.get_value()
if value == new:
return None
self.emit("change-value", scroll, new)
return new
def decrement(self):
adjustment = self.get_adjustment()
return self.__change_value__(-adjustment.get_step_increment(),
Gtk.ScrollType.STEP_BACKWARD)
def increment(self):
adjustment = self.get_adjustment()
return self.__change_value__(adjustment.get_step_increment(),
Gtk.ScrollType.STEP_FORWARD)
def format_value(self, scale, value):
return str(value)
class SeekScale(ScalePlus):
def __init__(self, player):
ScalePlus.__init__(self, 0, 0, 5 * Gst.SECOND, 30 * Gst.SECOND)
self.set_size_request(200, -1)
self.player = player
GLib.timeout_add(200, self.update)
def do_change_value(self, scroll, value):
self.player.seek(value)
def format_value(self, scale, value):
position = int(value / Gst.SECOND)
duration = int(self.get_adjustment().get_upper() / Gst.SECOND)
(p_m, p_s) = divmod(position, 60)
(r_m, r_s) = divmod(duration - position, 60)
return f"{p_m:02}:{p_s:02} / {r_m:02}:{r_s:02}"
def update(self):
self.set_range(0, self.player.duration())
self.set_value(self.player.position())
return GLib.SOURCE_CONTINUE