Dotfiles/desktopenvs/hyprdrive/supersonic-booster/ui/device_card.py

61 lines
2.4 KiB
Python

"""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}"]