pragma ComponentBehavior: Bound import "root:/widgets" import "root:/services" import "root:/config" import QtQuick import QtQuick.Layouts Item { id: root readonly property list workspaces: layout.children.filter(c => c.isWorkspace).sort((w1, w2) => w1.ws - w2.ws) readonly property var occupied: Hyprland.workspaces.values.reduce((acc, curr) => { acc[curr.id] = curr.lastIpcObject.windows > 0; return acc; }, {}) readonly property int groupOffset: Math.floor((Hyprland.activeWsId - 1) / BarConfig.workspaces.shown) * BarConfig.workspaces.shown implicitWidth: layout.implicitWidth implicitHeight: layout.implicitHeight ColumnLayout { id: layout spacing: 0 layer.enabled: true layer.smooth: true Repeater { model: BarConfig.workspaces.shown Workspace { occupied: root.occupied groupOffset: root.groupOffset } } } Loader { active: BarConfig.workspaces.occupiedBg asynchronous: true z: -1 anchors.fill: parent sourceComponent: OccupiedBg { workspaces: root.workspaces occupied: root.occupied groupOffset: root.groupOffset } } Loader { active: BarConfig.workspaces.activeIndicator asynchronous: true sourceComponent: ActiveIndicator { workspaces: root.workspaces mask: layout maskWidth: root.width maskHeight: root.height groupOffset: root.groupOffset } } MouseArea { anchors.fill: parent anchors.leftMargin: -(Appearance.padding.small + BorderConfig.thickness) anchors.rightMargin: -(Appearance.padding.small + BorderConfig.thickness) onPressed: event => { const ws = layout.childAt(event.x, event.y).index + root.groupOffset + 1; if (Hyprland.activeWsId !== ws) Hyprland.dispatch(`workspace ${ws}`); } onWheel: event => { const activeWs = Hyprland.activeClient?.workspace?.name; if (activeWs?.startsWith("special:")) Hyprland.dispatch(`togglespecialworkspace ${activeWs.slice(8)}`); else if (event.angleDelta.y < 0 || Hyprland.activeWsId > 1) Hyprland.dispatch(`workspace r${event.angleDelta.y > 0 ? "-" : "+"}1`); } } }