61 lines
2.4 KiB
Python
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}"]
|