68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
|
import { bind, Variable } from 'astal';
|
||
|
import { App, Gtk } from 'astal/gtk3';
|
||
|
|
||
|
import AstalBluetooth from 'gi://AstalBluetooth';
|
||
|
|
||
|
import PopupWindow from '../../misc/popup-window';
|
||
|
|
||
|
|
||
|
export default () => {
|
||
|
const bluetooth = AstalBluetooth.get_default();
|
||
|
|
||
|
const Hovered = Variable(false);
|
||
|
|
||
|
return (
|
||
|
<button
|
||
|
className="bar-item bluetooth"
|
||
|
cursor="pointer"
|
||
|
|
||
|
onHover={() => Hovered.set(true)}
|
||
|
onHoverLost={() => Hovered.set(false)}
|
||
|
|
||
|
onButtonReleaseEvent={(self) => {
|
||
|
const win = App.get_window('win-bluetooth') as PopupWindow;
|
||
|
|
||
|
win.set_x_pos(
|
||
|
self.get_allocation(),
|
||
|
'right',
|
||
|
);
|
||
|
|
||
|
win.visible = !win.visible;
|
||
|
}}
|
||
|
>
|
||
|
{bind(bluetooth, 'isPowered').as((isPowered) => {
|
||
|
if (!isPowered) {
|
||
|
return (<icon icon="bluetooth-disabled-symbolic" />);
|
||
|
}
|
||
|
else {
|
||
|
return (
|
||
|
<box>
|
||
|
{bind(bluetooth, 'isConnected').as((isConnected) => {
|
||
|
const device = bluetooth.get_devices().find((dev) => dev.connected);
|
||
|
|
||
|
if (!isConnected || !device) {
|
||
|
return (<icon icon="bluetooth-active-symbolic" />);
|
||
|
}
|
||
|
else {
|
||
|
return (
|
||
|
<>
|
||
|
<icon icon={bind(device, 'icon')} />
|
||
|
|
||
|
<revealer
|
||
|
revealChild={bind(Hovered)}
|
||
|
transitionType={Gtk.RevealerTransitionType.SLIDE_LEFT}
|
||
|
>
|
||
|
<label label={bind(device, 'name')} />
|
||
|
</revealer>
|
||
|
</>
|
||
|
);
|
||
|
}
|
||
|
})}
|
||
|
</box>
|
||
|
);
|
||
|
}
|
||
|
})}
|
||
|
</button>
|
||
|
);
|
||
|
};
|