Dotfiles/desktopenvs/hyprlua/audio-panel/ui/output_tab.py

50 lines
1.7 KiB
Python

"""Output Devices tab: horizontally-scrolling row of every playback device
(pactl sinks), each with its own volume meter/L-R pair, mute, live peak bar,
profile dropdown (pro-audio vs stereo duplex etc.) and a "Set Default" button.
"""
from __future__ import annotations
import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk # noqa: E402
from ui.device_card import DeviceCard
from ui.scroll_row import ScrollRow
class OutputTab(Gtk.Box):
def __init__(self, backend, peaks) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL)
self.add_css_class("sb-tab-page")
self._backend = backend
self._peaks = peaks
self._default_name = ""
self._row = ScrollRow(self._make_card, empty_text="No output devices found")
self.append(self._row)
def _make_card(self, item: dict, cards_by_id: dict, default_name: str) -> DeviceCard:
return DeviceCard(self._backend, self._peaks, "sink", item, cards_by_id,
default_name, self._backend.set_default_sink)
def refresh(self) -> None:
def got_defaults(sink_name: str, _source_name: str) -> None:
self._default_name = sink_name
def got_cards(cards: list[dict]) -> None:
cards_by_id = {c["id"]: c for c in cards}
def got_sinks(sinks: list[dict]) -> None:
self._row.sync(sinks, cards_by_id, self._default_name)
self._backend.list_sinks(got_sinks)
self._backend.list_cards(got_cards)
self._backend.get_defaults(got_defaults)
def activate(self) -> None:
self._row.activate()
self.refresh()
def deactivate(self) -> None:
self._row.deactivate()