49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from fabric.widgets.circularprogressbar import CircularProgressBar
|
|
from fabric.audio.service import Audio
|
|
from fabric.widgets.eventbox import EventBox
|
|
from fabric.widgets.box import Box
|
|
from fabric.widgets.overlay import Overlay
|
|
from fabric.widgets.label import Label
|
|
|
|
|
|
class VolumeWidget(Box):
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self.audio = Audio()
|
|
|
|
self.progress_bar = CircularProgressBar(
|
|
name="volume-progress-bar", pie=True, size=24
|
|
)
|
|
|
|
self.event_box = EventBox(
|
|
events="scroll",
|
|
child=Overlay(
|
|
child=self.progress_bar,
|
|
overlays=Label(
|
|
label="",
|
|
style="margin: 0px 6px 0px 0px; font-size: 12px", # to center the icon glyph
|
|
),
|
|
),
|
|
)
|
|
|
|
self.audio.connect("notify::speaker", self.on_speaker_changed)
|
|
self.event_box.connect("scroll-event", self.on_scroll)
|
|
self.add(self.event_box)
|
|
|
|
def on_scroll(self, _, event):
|
|
match event.direction:
|
|
case 0:
|
|
self.audio.speaker.volume += 8
|
|
case 1:
|
|
self.audio.speaker.volume -= 8
|
|
return
|
|
|
|
def on_speaker_changed(self, *_):
|
|
if not self.audio.speaker:
|
|
return
|
|
self.progress_bar.value = self.audio.speaker.volume / 100
|
|
self.audio.speaker.bind(
|
|
"volume", "value", self.progress_bar, lambda _, v: v / 100
|
|
)
|
|
return
|