import { bind, Variable } from 'astal'; import { Gtk, Widget } from 'astal/gtk3'; import AstalWp from 'gi://AstalWp'; import Separator from '../misc/separator'; import Streams from './streams'; import Profiles from './profiles'; export default () => { const audio = AstalWp.get_default()?.get_audio(); if (!audio) { throw new Error('Could not find default audio devices.'); } const Shown = Variable<string>('outputs'); const stack = ( <stack shown={bind(Shown)} transitionType={Gtk.StackTransitionType.SLIDE_LEFT_RIGHT} > <scrollable name="outputs" hscroll={Gtk.PolicyType.NEVER} setup={(self) => setTimeout(() => { self.add(( <box vertical> {bind(audio, 'speakers').as(Streams)} </box> )); }, 1000)} /> <scrollable name="inputs" hscroll={Gtk.PolicyType.NEVER} setup={(self) => setTimeout(() => { self.add(( <box vertical> {bind(audio, 'microphones').as(Streams)} </box> )); }, 1000)} /> <scrollable name="profiles" hscroll={Gtk.PolicyType.NEVER} setup={(self) => setTimeout(() => { self.add(( <box vertical> {bind(audio, 'devices').as(Profiles)} </box> )); }, 1000)} /> </stack> ) as Widget.Stack; const StackButton = ({ label = '', iconName = '' }) => ( <button cursor="pointer" className={bind(Shown).as((shown) => `header-btn${shown === label ? ' active' : ''}`)} onButtonReleaseEvent={() => { Shown.set(label); }} > <box halign={Gtk.Align.CENTER}> <icon icon={iconName} /> <Separator size={8} /> {label} </box> </button> ) as Widget.Button; return ( <box className="audio widget" vertical > <box className="header" homogeneous > <StackButton label="outputs" iconName="audio-speakers-symbolic" /> <StackButton label="inputs" iconName="audio-input-microphone-symbolic" /> <StackButton label="profiles" iconName="application-default-symbolic" /> </box> {stack} </box> ); };