emmental/emmental/header/volume.py

53 lines
2.0 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""A custom Gtk.Box with controls for adjusting the volume."""
from gi.repository import GObject
from gi.repository import Gtk
STEP_SIZE = 0.05
def format_value_func(scale, value: float) -> str:
"""Format the volume value to a percentage."""
return f"{round(value*100)} %"
class Controls(Gtk.Box):
"""A Gtk.Box containing widgets for adjusting the volume."""
volume = GObject.Property(type=float, default=1.0)
def __init__(self):
"""Initialize our volume controls."""
super().__init__()
self._decrement = Gtk.Button(icon_name="list-remove-symbolic",
valign=Gtk.Align.END, has_frame=False,
margin_bottom=6)
self._adjustment = Gtk.Adjustment.new(1.0, 0.0, 1.0, STEP_SIZE, 0, 0)
self._scale = Gtk.Scale(adjustment=self._adjustment, draw_value=True,
valign=Gtk.Align.END, hexpand=True)
self._increment = Gtk.Button(icon_name="list-add-symbolic",
valign=Gtk.Align.END, has_frame=False,
margin_bottom=6)
self._scale.set_format_value_func(format_value_func)
self.append(self._decrement)
self.append(self._scale)
self.append(self._increment)
self._decrement.connect("clicked", self.__decrement)
self._scale.connect("value-changed", self.__value_changed)
self._increment.connect("clicked", self.__increment)
self.bind_property("volume", self._adjustment, "value",
GObject.BindingFlags.BIDIRECTIONAL)
def __decrement(self, button: Gtk.Button) -> None:
self._scale.set_value(self._scale.get_value() - STEP_SIZE)
def __increment(self, button: Gtk.Button) -> None:
self._scale.set_value(self._scale.get_value() + STEP_SIZE)
def __value_changed(self, range: Gtk.Range) -> None:
self.volume = range.get_value()