2021-07-09 13:45:31 -04:00
|
|
|
# Copyright 2021 (c) Anna Schumaker.
|
|
|
|
from gi.repository import Gtk, Gst
|
2021-09-02 10:25:08 -04:00
|
|
|
from . import menu
|
|
|
|
from . import scale
|
2021-09-01 13:37:04 -04:00
|
|
|
|
|
|
|
class ControlButton(Gtk.Button):
|
|
|
|
def __init__(self, player, icon):
|
|
|
|
Gtk.Button.__init__(self)
|
|
|
|
self.add_css_class("large-icons")
|
|
|
|
self.set_icon_name(icon)
|
|
|
|
self.player = player
|
|
|
|
|
|
|
|
|
|
|
|
class PreviousButton(ControlButton):
|
|
|
|
def __init__(self, player):
|
|
|
|
ControlButton.__init__(self, player, "media-skip-backward")
|
|
|
|
|
|
|
|
def do_clicked(self):
|
|
|
|
self.player.previous()
|
|
|
|
|
|
|
|
|
|
|
|
class NextButton(ControlButton):
|
|
|
|
def __init__(self, player):
|
|
|
|
ControlButton.__init__(self, player, "media-skip-forward")
|
|
|
|
|
|
|
|
def do_clicked(self):
|
|
|
|
self.player.next()
|
|
|
|
|
|
|
|
|
2021-09-01 14:00:18 -04:00
|
|
|
class PlayPauseButton(ControlButton):
|
|
|
|
def __init__(self, player):
|
|
|
|
ControlButton.__init__(self, player, "media-playback-start")
|
|
|
|
self.player.connect("state-changed", self.on_state_changed)
|
|
|
|
|
|
|
|
def do_clicked(self):
|
|
|
|
self.player.playpause()
|
|
|
|
|
|
|
|
def on_state_changed(self, player, old, new, pending):
|
|
|
|
icon = "pause" if new == Gst.State.PLAYING else "start"
|
|
|
|
self.set_icon_name(f"media-playback-{icon}")
|
|
|
|
|
|
|
|
|
2021-09-02 10:25:08 -04:00
|
|
|
class ControlScaleBox(scale.ScaleButtonBox):
|
|
|
|
def __init__(self, scalectrl):
|
|
|
|
icon = Gtk.Image()
|
|
|
|
icon.add_css_class("large-icons")
|
|
|
|
scalectrl.connect("value-changed", self.on_value_changed, icon)
|
|
|
|
scale.ScaleButtonBox.__init__(self, scalectrl)
|
|
|
|
self.on_value_changed(scalectrl, icon)
|
|
|
|
self.prepend(icon)
|
|
|
|
|
|
|
|
def on_value_changed(self, scale, icon):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2021-09-02 11:35:13 -04:00
|
|
|
class AutoPauseControlBox(ControlScaleBox):
|
|
|
|
def __init__(self, apscale):
|
|
|
|
ControlScaleBox.__init__(self, apscale)
|
|
|
|
|
|
|
|
def on_value_changed(self, scale, icon):
|
|
|
|
name = "start" if scale.get_value() == -1 else "pause"
|
|
|
|
icon.set_from_icon_name(f"media-playback-{name}")
|
|
|
|
|
|
|
|
|
2021-09-02 10:25:08 -04:00
|
|
|
class VolumeControlBox(ControlScaleBox):
|
|
|
|
def __init__(self, player):
|
|
|
|
ControlScaleBox.__init__(self, scale.VolumeScale(player))
|
|
|
|
|
|
|
|
def on_value_changed(self, scale, icon):
|
|
|
|
value = scale.get_value()
|
|
|
|
if value == 0: name = "muted"
|
|
|
|
elif value <= 1/3: name = "low"
|
|
|
|
elif value <= 2/3: name = "medium"
|
|
|
|
else: name = "high"
|
|
|
|
icon.set_from_icon_name(f"audio-volume-{name}-symbolic")
|
|
|
|
|
|
|
|
|
2021-07-09 13:45:31 -04:00
|
|
|
class Controls(Gtk.Box):
|
|
|
|
def __init__(self):
|
|
|
|
Gtk.Box.__init__(self)
|
|
|
|
self.add_css_class("large-icons")
|
|
|
|
self.add_css_class("linked")
|
|
|
|
|
|
|
|
self.previous = Gtk.Button.new_from_icon_name("media-skip-backward")
|
|
|
|
self.append(self.previous)
|
|
|
|
|
|
|
|
self.play = Gtk.Button.new_from_icon_name("media-playback-start")
|
|
|
|
self.append(self.play)
|
|
|
|
|
|
|
|
self.pause = Gtk.Button.new_from_icon_name("media-playback-pause")
|
|
|
|
self.pause.hide()
|
|
|
|
self.append(self.pause)
|
|
|
|
|
|
|
|
self.next = Gtk.Button.new_from_icon_name("media-skip-forward")
|
|
|
|
self.append(self.next)
|
|
|
|
|
|
|
|
self.menu = menu.Button()
|
|
|
|
self.append(self.menu)
|
|
|
|
|
|
|
|
self.sizegroup = Gtk.SizeGroup()
|
|
|
|
self.sizegroup.add_widget(self)
|
|
|
|
|
|
|
|
def connect(self, name, func):
|
|
|
|
if name == "volume-changed":
|
|
|
|
self.menu.volume.connect("value-changed", func)
|
|
|
|
else:
|
|
|
|
button = self.__dict__.get(name)
|
|
|
|
button.connect("clicked", func)
|
|
|
|
|
|
|
|
def set_state(self, state):
|
|
|
|
self.play.set_visible(state != Gst.State.PLAYING)
|
|
|
|
self.pause.set_visible(state == Gst.State.PLAYING)
|