"""DeviceCard — one card in the Output Devices / Input Devices tabs: MeterCard's usual icon+name/peak/meter/mute, plus a "Set Default" button. Shared between both tabs via the `kind` parameter ("sink" for outputs, "source" for inputs) — the only difference between an output and an input device, as far as pactl's verbs go, is which noun you say. Profile switching used to live here too, but that's a *card*-level setting (one physical card can back a device in both this tab and the other one at once), not a per-device one — see ui/profile_card.py and the Cards tab. """ from __future__ import annotations import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk # noqa: E402 from ui.card_base import MeterCard _MONITOR_SUFFIX = ".monitor" class DeviceCard(MeterCard): def __init__(self, backend, peaks, kind: str, item: dict, default_name: str, set_default) -> None: self._default_name = default_name self._set_default = set_default super().__init__(backend, peaks, kind, item) def _build_extra(self, item: dict): self._default_btn = Gtk.ToggleButton(label="Set Default") self._default_btn.add_css_class("sb-default-btn") self._default_btn.connect("toggled", self._on_default_toggled) self._sync_default(item, self._default_name) return self._default_btn def _update_extra(self, item: dict, default_name: str) -> None: self._default_name = default_name self._sync_default(item, default_name) def _sync_default(self, item: dict, default_name: str) -> None: is_default = item.get("name") == default_name self._default_btn.handler_block_by_func(self._on_default_toggled) self._default_btn.set_active(is_default) self._default_btn.handler_unblock_by_func(self._on_default_toggled) self._default_btn.set_label("Default" if is_default else "Set Default") self._default_btn.set_sensitive(not is_default) def _on_default_toggled(self, btn: Gtk.ToggleButton) -> None: if btn.get_active(): self._set_default(self._item.get("name")) def _peak_target(self, item: dict) -> list[str] | None: name = item.get("name") if not name: return None if self._kind == "sink": return [f"--device={name}{_MONITOR_SUFFIX}"] return [f"--device={name}"]