2021-08-31 17:03:20 -04:00
|
|
|
# Copyright 2021 (c) Anna Schumaker.
|
2021-09-01 09:51:51 -04:00
|
|
|
from gi.repository import GLib
|
2021-08-31 17:03:20 -04:00
|
|
|
from gi.repository import Gtk
|
2021-09-01 09:51:51 -04:00
|
|
|
from gi.repository import Gst
|
2021-08-31 17:03:20 -04:00
|
|
|
|
|
|
|
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)
|
2021-09-01 09:51:51 -04:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2021-09-01 09:52:20 -04:00
|
|
|
|
|
|
|
|
2021-09-01 16:29:32 -04:00
|
|
|
class AutoPauseScale(ScalePlus):
|
|
|
|
def __init__(self):
|
|
|
|
ScalePlus.__init__(self, -1, 99, 1, 5)
|
|
|
|
self.set_digits(0)
|
|
|
|
|
|
|
|
def format_value(self, scale, value):
|
|
|
|
value = int(value)
|
|
|
|
if value == -1: return "Keep Playing"
|
|
|
|
elif value == 0: return "This Track"
|
|
|
|
elif value == 1: return "Next Track"
|
|
|
|
return f"{value} Tracks"
|
|
|
|
|
|
|
|
|
2021-09-01 14:50:04 -04:00
|
|
|
class VolumeScale(ScalePlus):
|
|
|
|
def __init__(self, player):
|
|
|
|
ScalePlus.__init__(self, 0.0, 1.0, 0.05, 0.25)
|
|
|
|
self.player = player
|
|
|
|
self.set_value(player.get_volume())
|
|
|
|
|
|
|
|
def do_change_value(self, scroll, value):
|
|
|
|
self.set_value(value)
|
|
|
|
self.player.set_volume(value)
|
|
|
|
|
|
|
|
def format_value(self, scale, value):
|
|
|
|
return f"{int(value * 100)}%"
|
|
|
|
|
|
|
|
|
2021-09-01 09:52:20 -04:00
|
|
|
class ScaleButton(Gtk.Button):
|
|
|
|
def __init__(self, scale, icon):
|
|
|
|
Gtk.Button.__init__(self)
|
|
|
|
self.add_css_class("normal-icons")
|
|
|
|
self.add_css_class("flat")
|
|
|
|
self.set_valign(Gtk.Align.END)
|
|
|
|
self.set_icon_name(icon)
|
|
|
|
self.scale = scale
|
|
|
|
|
|
|
|
|
|
|
|
class DecrementButton(ScaleButton):
|
|
|
|
def __init__(self, scale):
|
|
|
|
ScaleButton.__init__(self, scale, "list-remove-symbolic")
|
|
|
|
|
|
|
|
def do_clicked(self):
|
|
|
|
self.scale.decrement()
|
|
|
|
|
|
|
|
|
|
|
|
class IncrementButton(ScaleButton):
|
|
|
|
def __init__(self, scale):
|
|
|
|
ScaleButton.__init__(self, scale, "list-add-symbolic")
|
|
|
|
|
|
|
|
def do_clicked(self):
|
|
|
|
self.scale.increment()
|
2021-09-01 09:58:37 -04:00
|
|
|
|
|
|
|
|
|
|
|
class ScaleButtonBox(Gtk.Box):
|
|
|
|
def __init__(self, scale):
|
|
|
|
Gtk.Box.__init__(self)
|
|
|
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
|
|
|
self.append(DecrementButton(scale))
|
|
|
|
self.append(scale)
|
|
|
|
self.append(IncrementButton(scale))
|