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):
|
2021-09-03 17:50:24 -04:00
|
|
|
ScalePlus.__init__(self, 0, player.duration,
|
|
|
|
5 * Gst.SECOND, 30 * Gst.SECOND)
|
2021-09-01 09:51:51 -04:00
|
|
|
self.set_size_request(200, -1)
|
|
|
|
self.player = player
|
2021-09-03 17:50:24 -04:00
|
|
|
self.player.connect("duration-changed", self.duration_changed)
|
2021-09-03 18:34:56 -04:00
|
|
|
self.player.connect("position-changed", self.position_changed)
|
2021-09-01 09:51:51 -04:00
|
|
|
|
|
|
|
def do_change_value(self, scroll, value):
|
2021-09-03 18:34:56 -04:00
|
|
|
self.player.position = value
|
2021-09-01 09:51:51 -04:00
|
|
|
|
2021-09-03 17:50:24 -04:00
|
|
|
def duration_changed(self, player):
|
|
|
|
self.set_range(0, player.duration)
|
|
|
|
|
2021-09-03 18:34:56 -04:00
|
|
|
def position_changed(self, player):
|
|
|
|
self.set_value(player.position)
|
|
|
|
|
2021-09-01 09:51:51 -04:00
|
|
|
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}"
|
|
|
|
|
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)
|
2021-11-18 11:38:55 -05:00
|
|
|
self.keep_playing = True
|
2021-09-01 16:29:32 -04:00
|
|
|
self.set_digits(0)
|
|
|
|
|
2021-11-18 11:38:55 -05:00
|
|
|
def about_to_pause(self):
|
|
|
|
return self.get_value() == 0
|
|
|
|
|
2021-09-01 16:29:32 -04:00
|
|
|
def format_value(self, scale, value):
|
2021-12-28 17:24:09 -05:00
|
|
|
match int(value):
|
|
|
|
case -1: return "Keep Playing"
|
|
|
|
case 0: return "This Track"
|
|
|
|
case 1: return "Next Track"
|
|
|
|
case _: return f"{int(value)} Tracks"
|
2021-09-01 16:29:32 -04:00
|
|
|
|
2021-11-18 11:38:55 -05:00
|
|
|
def decrement(self):
|
|
|
|
self.keep_playing = not self.about_to_pause()
|
|
|
|
super().decrement()
|
|
|
|
|
2021-09-01 16:29:32 -04:00
|
|
|
|
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
|
2021-09-05 08:40:41 -04:00
|
|
|
self.set_value(player.volume)
|
2021-09-01 14:50:04 -04:00
|
|
|
|
|
|
|
def do_change_value(self, scroll, value):
|
|
|
|
self.set_value(value)
|
2021-09-05 08:40:41 -04:00
|
|
|
self.player.volume = value
|
2021-09-01 14:50:04 -04:00
|
|
|
|
|
|
|
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))
|