const { Revealer, CenterBox, Box, EventBox, Label } = ags.Widget; const { Hyprland } = ags.Service; const { Gtk } = imports.gi; import { WorkspaceDrop } from './dragndrop.js'; import * as VARS from './variables.js'; export function getWorkspaces(box) { let children = []; box.children.forEach(type => { type.children.forEach(row => { row.child.centerWidget.child.children.forEach(ch => { children.push(ch); }); }); }); box._workspaces = children.sort((a, b) => a._id - b._id); }; export const WorkspaceRow = (className, i) => Revealer({ transition: 'slide_down', connections: [[Hyprland, rev => { rev.revealChild = Hyprland.workspaces.some(ws => ws.id > i * VARS.WORKSPACE_PER_ROW && (ws.windows > 0 || ws.id === Hyprland.active.workspace.id)); }]], child: CenterBox({ children: [null, EventBox({ properties: [['box']], setup: eventbox => eventbox._box = eventbox.child.children[0], connections: [[Hyprland, eventbox => { eventbox._box.revealChild = className === 'special' || !Hyprland.workspaces.some(ws => ws.id > i * VARS.WORKSPACE_PER_ROW + VARS.WORKSPACE_PER_ROW && (ws.windows > 0 || ws.id === Hyprland.active.workspace.id)); }]], child: Box({ className: className, children: [ Revealer({ transition: 'slide_right', properties: [ ['id', className === 'special' ? -1 : 1000], ['name', className === 'special' ? 'special' : ''], ], child: WorkspaceDrop({ child: Box({ className: 'workspace', style: `min-width: ${VARS.SCREEN.X * VARS.SCALE}px; min-height: ${VARS.SCREEN.Y * VARS.SCALE}px;`, children: [ ags.Widget({ type: Gtk.Fixed, }), Label({ label: ' +', style: 'font-size: 40px;', }), ], }), }), }), ], }), }), null], }), }); const Workspace = (id, name) => Revealer({ transition: 'slide_right', properties: [ ['id', id], ['name', name], ], connections: [[Hyprland, box => { let active = Hyprland.active.workspace.id === box._id; box.child.child.toggleClassName('active', active); box.revealChild = Hyprland.getWorkspace(box._id)?.windows > 0 || active; }]], child: WorkspaceDrop({ child: Box({ className: 'workspace', style: `min-width: ${VARS.SCREEN.X * VARS.SCALE}px; min-height: ${VARS.SCREEN.Y * VARS.SCALE}px;`, child: ags.Widget({ type: Gtk.Fixed, }), }), }), }); export function updateWorkspaces(box) { Hyprland.workspaces.forEach(ws => { let currentWs = box._workspaces.find(ch => ch._id == ws.id); if (!currentWs) { var type = 0; var rowNo = 0; if (ws.id < 0) { // This means it's a special workspace type = 1; } else { rowNo = Math.floor((ws.id - 1) / VARS.WORKSPACE_PER_ROW); if (rowNo >= box.children[type].children.length) { for (let i = box.children[type].children.length; i <= rowNo; ++i) { box.children[type].add(WorkspaceRow(type ? 'special' : 'normal', i)); } } } var row = box.children[type].children[rowNo].child.centerWidget.child; row.add(Workspace(ws.id, type ? ws.name : '')); } }); box.show_all(); // Make sure the order is correct box._workspaces.forEach((workspace, i) => { workspace.get_parent().reorder_child(workspace, i) }); }