diff --git a/devices/wim/config/ags/js/applauncher/main.js b/devices/wim/config/ags/js/applauncher/main.js index 33feb0d7..0a548bff 100644 --- a/devices/wim/config/ags/js/applauncher/main.js +++ b/devices/wim/config/ags/js/applauncher/main.js @@ -9,17 +9,25 @@ import { Box, Entry, Icon, Label, ListBox, Revealer, Scrollable } from 'resource import PopupWindow from '../misc/popup.js'; import AppItem from './app-item.js'; +/** @typedef {import('types/service/applications.js').Application} App */ + const Applauncher = ({ window_name = 'applauncher' } = {}) => { + /** @type Array */ let fzfResults; const list = ListBox(); /** @param {String} text */ const setSort = (text) => { const fzf = new Fzf(Applications.list, { - selector: (app) => app.name, - tiebreakers: [(a, b) => b.frequency - - a.frequency], + selector: /** @param {App} app */ (app) => app.name, + tiebreakers: [ + /** + * @param {App} a + * @param {App} b + */ + (a, b) => b.frequency - a.frequency, + ], }); fzfResults = fzf.find(text); @@ -38,8 +46,11 @@ const Applauncher = ({ window_name = 'applauncher' } = {}) => { }; const makeNewChildren = () => { + /** @type Array */ // @ts-expect-error - Array.from(list.get_children()).forEach((ch) => { + const rows = list.get_children(); + + rows.forEach((ch) => { ch.destroy(); }); @@ -85,14 +96,17 @@ const Applauncher = ({ window_name = 'applauncher' } = {}) => { setSort(text); let visibleApps = 0; + /** @type Array */ // @ts-expect-error - Array.from(list.get_children()).forEach((row) => { + const rows = list.get_children(); + + rows.forEach((row) => { row.changed(); const item = row.get_children()[0]; if (item?.attribute.app) { - const isMatching = Array.from(fzfResults).find((r) => { + const isMatching = fzfResults.find((r) => { return r.item.name === item.attribute.app.name; }); diff --git a/devices/wim/config/ags/js/bar/buttons/workspaces.js b/devices/wim/config/ags/js/bar/buttons/workspaces.js index cba7e115..5d611ba0 100644 --- a/devices/wim/config/ags/js/bar/buttons/workspaces.js +++ b/devices/wim/config/ags/js/bar/buttons/workspaces.js @@ -7,6 +7,8 @@ import CursorBox from '../../misc/cursorbox.js'; const URGENT_DURATION = 1000; +/** @typedef {import('types/widgets/revealer.js').default} Revealer */ + /** @property {number} id */ const Workspace = ({ id }) => { @@ -32,7 +34,7 @@ const Workspace = ({ id }) => { */ const update = (_, addr) => { const workspace = Hyprland.getWorkspace(id); - const occupied = workspace && workspace['windows'] > 0; + const occupied = workspace && workspace.windows > 0; self.toggleClassName('occupied', occupied); @@ -43,7 +45,7 @@ const Workspace = ({ id }) => { // Deal with urgent windows const client = Hyprland.getClient(addr); const isThisUrgent = client && - client['workspace']['id'] === id; + client.workspace.id === id; if (isThisUrgent) { self.toggleClassName('urgent', true); @@ -81,9 +83,12 @@ export default () => { /** @param {import('types/widgets/box').default} self */ const updateHighlight = (self) => { const currentId = Hyprland.active.workspace.id; + + /** @type Array */ // @ts-expect-error const indicators = self?.get_parent()?.child.child.child.children; - const currentIndex = Array.from(indicators) + + const currentIndex = indicators .findIndex((w) => w.attribute.id === currentId); if (currentIndex < 0) { @@ -107,37 +112,46 @@ export default () => { child: Box({ class_name: 'workspaces', - attribute: { workspaces: [] }, + attribute: { + /** @type Array */ + workspaces: [], + }, setup: (self) => { + /** @type function(void):Array */ + const workspaces = () => self.attribute.workspaces; + const refresh = () => { - Array.from(self.children).forEach((rev) => { - // @ts-expect-error + self.children.forEach((rev) => { + // @ts-expect-error they are in fact revealers rev.reveal_child = false; }); - Array.from(self.attribute.workspaces).forEach((ws) => { + + workspaces().forEach((ws) => { ws.reveal_child = true; }); }; const updateWorkspaces = () => { Hyprland.workspaces.forEach((ws) => { - const currentWs = Array.from(self.children) - // @ts-expect-error - .find((ch) => ch.attribute.id === ws['id']); + const currentWs = self.children.find((ch) => { + return ch.attribute.id === ws.id; + }); - if (!currentWs && ws['id'] > 0) { - self.add(Workspace({ id: ws['id'] })); + if (!currentWs && ws.id > 0) { + self.add(Workspace({ id: ws.id })); } }); self.show_all(); // Make sure the order is correct - Array.from(self.attribute.workspaces) - .forEach((workspace, i) => { - workspace.get_parent() - .reorder_child(workspace, i); - }); + workspaces().forEach((workspace, i) => { + // @ts-expect-error + workspace?.get_parent()?.reorder_child( + workspace, + i, + ); + }); }; self.hook(Hyprland, () => { @@ -145,7 +159,7 @@ export default () => { self.children.filter((ch) => { return Hyprland.workspaces.find((ws) => { // @ts-expect-error - return ws['id'] === ch.attribute.id; + return ws.id === ch.attribute.id; }); // @ts-expect-error }).sort((a, b) => a.attribute.id - b.attribute.id); diff --git a/devices/wim/config/ags/js/notifications/base.js b/devices/wim/config/ags/js/notifications/base.js index 3c1a1ceb..beb589e7 100644 --- a/devices/wim/config/ags/js/notifications/base.js +++ b/devices/wim/config/ags/js/notifications/base.js @@ -6,7 +6,7 @@ import Variable from 'resource:///com/github/Aylur/ags/variable.js'; import { Box, Icon, Label, Button } from 'resource:///com/github/Aylur/ags/widget.js'; import { lookUpIcon } from 'resource:///com/github/Aylur/ags/utils.js'; -import GLib from 'gi://GLib'; +const { GLib } = imports.gi; const setTime = (time) => { return GLib.DateTime diff --git a/devices/wim/config/ags/js/quick-settings/button-grid.js b/devices/wim/config/ags/js/quick-settings/button-grid.js index b303973b..57e91374 100644 --- a/devices/wim/config/ags/js/quick-settings/button-grid.js +++ b/devices/wim/config/ags/js/quick-settings/button-grid.js @@ -1,4 +1,5 @@ import App from 'resource:///com/github/Aylur/ags/app.js'; +// @ts-expect-error import Bluetooth from 'resource:///com/github/Aylur/ags/service/bluetooth.js'; import Network from 'resource:///com/github/Aylur/ags/service/network.js'; import Variable from 'resource:///com/github/Aylur/ags/variable.js'; @@ -14,17 +15,29 @@ import { NetworkMenu } from './network.js'; import { BluetoothMenu } from './bluetooth.js'; const SPACING = 28; - - const ButtonStates = []; + +/** @typedef {import('types/widgets/widget').default} Widget */ + + +/** + * @param {{ + * command?: function + * secondary_command?: function + * onOpen?: function(Widget):void + * icon: any + * indicator?: any + * menu?: any + * }} o + */ const GridButton = ({ - command = () => { /**/ }, - secondaryCommand = () => { /**/ }, - onOpen = () => { /**/ }, + command = () => {/**/}, + secondary_command = () => {/**/}, + onOpen = () => {/**/}, icon, indicator, menu, -} = {}) => { +}) => { const Activated = Variable(false); ButtonStates.push(Activated); @@ -32,7 +45,7 @@ const GridButton = ({ // Allow setting icon dynamically or statically if (typeof icon === 'string') { icon = Icon({ - className: 'grid-label', + class_name: 'grid-label', icon, setup: (self) => { self.hook(Activated, () => { @@ -45,7 +58,7 @@ const GridButton = ({ } else { icon = Icon({ - className: 'grid-label', + class_name: 'grid-label', setup: (self) => { self .hook(...icon) @@ -60,7 +73,7 @@ const GridButton = ({ if (indicator) { indicator = Label({ - className: 'sub-label', + class_name: 'sub-label', justification: 'left', truncate: 'end', maxWidthChars: 12, @@ -82,15 +95,15 @@ const GridButton = ({ vertical: true, children: [ Box({ - className: 'grid-button', + class_name: 'grid-button', children: [ CursorBox({ - className: 'left-part', + class_name: 'left-part', on_primary_click_release: () => { if (Activated.value) { - secondaryCommand(); + secondary_command(); } else { command(); @@ -101,7 +114,7 @@ const GridButton = ({ }), CursorBox({ - className: 'right-part', + class_name: 'right-part', on_primary_click_release: () => { ButtonStates.forEach((state) => { @@ -112,10 +125,13 @@ const GridButton = ({ Activated.value = !Activated.value; }, - onHover: (self) => { + on_hover: (self) => { if (menu) { - const rowMenu = self.get_parent().get_parent() - .get_parent().get_parent().children[1]; + const rowMenu = + self.get_parent() + ?.get_parent()?.get_parent() + ?.get_parent()?.get_parent() + ?.children[1]; const isSetup = rowMenu.get_children() .find((ch) => ch === menu); @@ -129,7 +145,7 @@ const GridButton = ({ child: Icon({ icon: `${App.configDir }/icons/down-large.svg`, - className: 'grid-chev', + class_name: 'grid-chev', setup: (self) => { self.hook(Activated, () => { @@ -162,7 +178,7 @@ const Row = ({ buttons } = {}) => { children: [ Box({ - className: 'button-row', + class_name: 'button-row', hpack: 'center', }), @@ -189,7 +205,7 @@ const FirstRow = () => Row({ GridButton({ command: () => Network.toggleWifi(), - secondaryCommand: () => { + secondary_command: () => { // TODO: connection editor }, @@ -211,7 +227,7 @@ const FirstRow = () => Row({ // }, - secondaryCommand: () => { + secondary_command: () => { // }, @@ -221,7 +237,7 @@ const FirstRow = () => Row({ GridButton({ command: () => Bluetooth.toggle(), - secondaryCommand: () => { + secondary_command: () => { // TODO: bluetooth connection editor }, @@ -261,7 +277,7 @@ const SecondRow = () => Row({ '@DEFAULT_SINK@', 'toggle']).catch(print); }, - secondaryCommand: () => { + secondary_command: () => { execAsync(['bash', '-c', 'pavucontrol']) .catch(print); }, @@ -277,7 +293,7 @@ const SecondRow = () => Row({ '@DEFAULT_SOURCE@', 'toggle']).catch(print); }, - secondaryCommand: () => { + secondary_command: () => { execAsync(['bash', '-c', 'pavucontrol']) .catch(print); }, @@ -291,14 +307,14 @@ const SecondRow = () => Row({ command: () => { execAsync(['lock']).catch(print); }, - secondaryCommand: () => App.openWindow('powermenu'), + secondary_command: () => App.openWindow('powermenu'), icon: 'system-lock-screen-symbolic', }), ], }); export default () => Box({ - className: 'button-grid', + class_name: 'button-grid', vertical: true, hpack: 'center', children: [