nixos-configs/modules/ags/config/widgets/audio/main.tsx

107 lines
2.8 KiB
TypeScript
Raw Permalink Normal View History

import { bind, Variable } from 'astal';
2024-12-07 14:17:37 -05:00
import { Gtk, Widget } from 'astal/gtk3';
import AstalWp from 'gi://AstalWp';
2024-12-07 22:11:03 -05:00
import Separator from '../misc/separator';
import Streams from './streams';
2024-12-07 22:08:56 -05:00
import Profiles from './profiles';
2024-12-07 14:17:37 -05:00
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}
>
2024-12-07 22:08:56 -05:00
2024-12-14 22:14:56 -05:00
<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)}
/>
2024-12-07 22:08:56 -05:00
</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} />
2024-12-07 22:11:03 -05:00
<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" />
2024-12-07 22:08:56 -05:00
<StackButton label="profiles" iconName="application-default-symbolic" />
</box>
{stack}
2024-12-07 14:17:37 -05:00
</box>
);
};