"""Input Devices tab: same shape as Output Devices (see output_tab.py) but for recording devices (pactl sources) — mic gain meter/L-R pair, mute, live peak bar, profile dropdown, "Set Default".""" 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 InputTab(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 input 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, "source", item, cards_by_id, default_name, self._backend.set_default_source) def refresh(self) -> None: def got_defaults(_sink_name: str, source_name: str) -> None: self._default_name = source_name def got_cards(cards: list[dict]) -> None: cards_by_id = {c["id"]: c for c in cards} def got_sources(sources: list[dict]) -> None: self._row.sync(sources, cards_by_id, self._default_name) self._backend.list_sources(got_sources) 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()