Anna Schumaker
e38ce61cf7
The Gtk.MenuButton doesn't have the same issue with staying "pressed in" after changing replaygain settings that our custom version does. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
153 lines
4.7 KiB
Python
153 lines
4.7 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
from gi.repository import Gtk
|
|
from . import scale
|
|
|
|
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()
|
|
|
|
|
|
class PlayPauseButton(ControlButton):
|
|
def __init__(self, player):
|
|
ControlButton.__init__(self, player, "media-playback-start")
|
|
self.player.connect("playback-start", self.playback_start)
|
|
self.player.connect("playback-paused", self.playback_paused)
|
|
|
|
def do_clicked(self):
|
|
self.player.playpause()
|
|
|
|
def playback_start(self, player):
|
|
self.set_icon_name("media-playback-pause")
|
|
|
|
def playback_paused(self, player):
|
|
self.set_icon_name("media-playback-start")
|
|
|
|
|
|
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
|
|
|
|
|
|
class AutoPauseControlBox(ControlScaleBox):
|
|
def __init__(self, apscale):
|
|
apscale.unparent()
|
|
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}")
|
|
|
|
|
|
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")
|
|
|
|
|
|
class ReplayGainComboBox(Gtk.ComboBoxText):
|
|
def __init__(self, player):
|
|
Gtk.ComboBoxText.__init__(self)
|
|
self.modes = [ "disabled", "track", "album" ]
|
|
self.player = player
|
|
|
|
self.append_text("ReplayGain Disabled")
|
|
self.append_text("ReplayGain Track Mode")
|
|
self.append_text("ReplayGain Album Mode")
|
|
self.set_active(self.modes.index(player.replaygain))
|
|
self.set_can_focus(False)
|
|
|
|
def do_changed(self):
|
|
self.player.set_property("replaygain", self.modes[self.get_active()])
|
|
|
|
|
|
class ReplayGainControl(Gtk.Box):
|
|
def __init__(self, player):
|
|
Gtk.Box.__init__(self)
|
|
self.icon = Gtk.Image.new_from_icon_name("audio-headphones")
|
|
self.icon.add_css_class("large-icons")
|
|
self.rgcombo = ReplayGainComboBox(player)
|
|
|
|
self.append(self.icon)
|
|
self.append(self.rgcombo)
|
|
|
|
|
|
class ControlsPopover(Gtk.Popover):
|
|
def __init__(self, player, apscale):
|
|
Gtk.Popover.__init__(self)
|
|
self.box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
|
|
self.box.append(AutoPauseControlBox(apscale))
|
|
self.box.append(VolumeControlBox(player))
|
|
self.box.append(ReplayGainControl(player))
|
|
self.set_child(self.box)
|
|
|
|
|
|
class MenuIcon(Gtk.Overlay):
|
|
def __init__(self, apscale):
|
|
Gtk.Overlay.__init__(self)
|
|
self.icon = Gtk.Image.new_from_icon_name("pan-down-symbolic")
|
|
self.icon.set_margin_top(5)
|
|
|
|
self.label = Gtk.Label()
|
|
self.label.set_markup("<small> </small>")
|
|
self.label.set_yalign(0)
|
|
|
|
apscale.connect("value-changed", self.on_value_changed)
|
|
self.add_overlay(self.icon)
|
|
self.add_overlay(self.label)
|
|
|
|
def on_value_changed(self, scale):
|
|
value = int(scale.get_value())
|
|
text = str(value) if value > -1 else " "
|
|
self.label.set_markup(f"<small>{text}</small>")
|
|
|
|
|
|
class MenuButton(Gtk.MenuButton):
|
|
def __init__(self, player, apscale):
|
|
Gtk.MenuButton.__init__(self)
|
|
self.set_popover(ControlsPopover(player, apscale))
|
|
self.get_first_child().set_child(MenuIcon(apscale))
|
|
|
|
|
|
class AudioControls(Gtk.Box):
|
|
def __init__(self, player, apscale):
|
|
Gtk.Box.__init__(self)
|
|
self.add_css_class("linked")
|
|
self.append(PreviousButton(player))
|
|
self.append(PlayPauseButton(player))
|
|
self.append(NextButton(player))
|
|
self.append(MenuButton(player, apscale))
|