import PanelButton from '../PanelButton'; import icons from 'lib/icons'; import asusctl from 'service/asusctl'; const notifications = await Service.import('notifications'); const bluetooth = await Service.import('bluetooth'); const audio = await Service.import('audio'); const network = await Service.import('network'); const powerprof = await Service.import('powerprofiles'); const ProfileIndicator = () => { const visible = asusctl.available ? asusctl.bind('profile').as(p => p !== 'Balanced') : powerprof.bind('active_profile').as(p => p !== 'balanced'); const icon = asusctl.available ? asusctl.bind('profile').as(p => icons.asusctl.profile[p]) : powerprof.bind('active_profile').as(p => icons.powerprofile[p]); return Widget.Icon({ visible, icon }); }; const ModeIndicator = () => { if (!asusctl.available) { return Widget.Icon({ setup(self) { Utils.idle(() => (self.visible = false)); }, }); } return Widget.Icon({ visible: asusctl.bind('mode').as(m => m !== 'Hybrid'), icon: asusctl.bind('mode').as(m => icons.asusctl.mode[m]), }); }; const MicrophoneIndicator = () => Widget.Icon() .hook(audio, self => (self.visible = audio.recorders.length > 0 || audio.microphone.is_muted || false)) .hook(audio.microphone, self => { const vol = audio.microphone.is_muted ? 0 : audio.microphone.volume; const { muted, low, medium, high } = icons.audio.mic; const cons = [ [67, high], [34, medium], [1, low], [0, muted], ] as const; self.icon = cons.find(([n]) => n <= vol * 100)?.[1] || ''; }); const DNDIndicator = () => Widget.Icon({ visible: notifications.bind('dnd'), icon: icons.notifications.silent, }); const BluetoothIndicator = () => Widget.Overlay({ class_name: 'bluetooth', passThrough: true, child: Widget.Icon({ icon: icons.bluetooth.enabled, visible: bluetooth.bind('enabled'), }), overlay: Widget.Label({ hpack: 'end', vpack: 'start', label: bluetooth.bind('connected_devices').as(c => `${c.length}`), visible: bluetooth.bind('connected_devices').as(c => c.length > 0), }), }); const NetworkIndicator = () => Widget.Icon().hook(network, self => { const icon = network[network.primary || 'wifi']?.icon_name; self.icon = icon || ''; self.visible = !!icon; }); const AudioIndicator = () => Widget.Icon().hook(audio.speaker, self => { const vol = audio.speaker.is_muted ? 0 : audio.speaker.volume; const { muted, low, medium, high, overamplified } = icons.audio.volume; const cons = [ [101, overamplified], [67, high], [34, medium], [1, low], [0, muted], ] as const; self.icon = cons.find(([n]) => n <= vol * 100)?.[1] || ''; }); export default () => PanelButton({ window: 'quicksettings', on_clicked: () => App.toggleWindow('quicksettings'), on_scroll_up: () => (audio.speaker.volume += 0.02), on_scroll_down: () => (audio.speaker.volume -= 0.02), child: Widget.Box([ //ProfileIndicator(), ModeIndicator(), DNDIndicator(), BluetoothIndicator(), MicrophoneIndicator(), AudioIndicator(), NetworkIndicator(), ]), });