# 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()