"""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, and a "Set Default" button. Profile switching lives on the Cards tab instead (see ui/profile_card.py for why).""" 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, default_name: str) -> DeviceCard: return DeviceCard(self._backend, self._peaks, "sink", item, 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_sinks(sinks: list[dict]) -> None: self._row.sync(sinks, self._default_name) self._backend.list_sinks(got_sinks) self._backend.get_defaults(got_defaults) def activate(self) -> None: self._row.activate() self.refresh() def deactivate(self) -> None: self._row.deactivate()