diff options
| author | Freya Murphy <freya@freyacat.org> | 2026-01-12 12:47:22 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2026-01-22 08:36:42 -0500 |
| commit | e16a918db744c538fc69a3a463609780f9b0ea89 (patch) | |
| tree | af2637c92922cbb9920f79a0e823e6ae3952f425 /modules/bar/components/workspaces | |
| parent | remove default paths (diff) | |
| download | caelestia-shell-e16a918db744c538fc69a3a463609780f9b0ea89.tar.gz caelestia-shell-e16a918db744c538fc69a3a463609780f9b0ea89.tar.bz2 caelestia-shell-e16a918db744c538fc69a3a463609780f9b0ea89.zip | |
refactor workspace functionality (real per monitor workspaces)
Diffstat (limited to '')
| -rw-r--r-- | modules/bar/components/workspaces/ActiveIndicator.qml | 57 | ||||
| -rw-r--r-- | modules/bar/components/workspaces/Workspace.qml | 84 | ||||
| -rw-r--r-- | modules/bar/components/workspaces/Workspaces.qml | 89 |
3 files changed, 38 insertions, 192 deletions
diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index dae54b3..912f771 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -10,28 +10,21 @@ StyledRect { required property int activeWsId required property Repeater workspaces required property Item mask + required property var monitorWorkspaces readonly property int currentWsIdx: { - let i = activeWsId - 1; - while (i < 0) - i += Config.bar.workspaces.shown; - return i % Config.bar.workspaces.shown; - } - - property real leading: workspaces.count > 0 ? workspaces.itemAt(currentWsIdx)?.y ?? 0 : 0 - property real trailing: workspaces.count > 0 ? workspaces.itemAt(currentWsIdx)?.y ?? 0 : 0 - property real currentSize: workspaces.count > 0 ? workspaces.itemAt(currentWsIdx)?.size ?? 0 : 0 - property real offset: Math.min(leading, trailing) - property real size: { - const s = Math.abs(leading - trailing) + currentSize; - if (Config.bar.workspaces.activeTrail && lastWs > currentWsIdx) { - const ws = workspaces.itemAt(lastWs); - // console.log(ws, lastWs); - return ws ? Math.min(ws.y + ws.size - offset, s) : 0; + let wss = monitorWorkspaces; + for (let i = 0; i < wss.length; i++) { + let ws = wss[i]; + if (ws.id == activeWsId) + return i; } - return s; } + property real currentSize: workspaces.itemAt(currentWsIdx)?.size ?? 0 + property real offset: workspaces.itemAt(currentWsIdx)?.y ?? 0 + property real size: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + property int cWs property int lastWs @@ -42,7 +35,7 @@ StyledRect { clip: true y: offset + mask.y - implicitWidth: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + implicitWidth: size implicitHeight: size radius: Appearance.rounding.full color: Colours.palette.m3primary @@ -60,35 +53,7 @@ StyledRect { anchors.horizontalCenter: parent.horizontalCenter } - Behavior on leading { - enabled: Config.bar.workspaces.activeTrail - - EAnim {} - } - - Behavior on trailing { - enabled: Config.bar.workspaces.activeTrail - - EAnim { - duration: Appearance.anim.durations.normal * 2 - } - } - - Behavior on currentSize { - enabled: Config.bar.workspaces.activeTrail - - EAnim {} - } - Behavior on offset { - enabled: !Config.bar.workspaces.activeTrail - - EAnim {} - } - - Behavior on size { - enabled: !Config.bar.workspaces.activeTrail - EAnim {} } diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index 374b347..1c1ca74 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -11,22 +11,20 @@ ColumnLayout { required property int index required property int activeWsId - required property var occupied - required property int groupOffset + required property var ws - readonly property bool isWorkspace: true // Flag for finding workspace children - // Unanimated prop for others to use as reference - readonly property int size: implicitHeight + (hasWindows ? Appearance.padding.small : 0) + readonly property bool isOccupied: ws?.lastIpcObject?.windows > 0 + readonly property bool isActive: ws?.id == activeWsId + readonly property bool isVisible: isActive || isOccupied || true - readonly property int ws: groupOffset + index + 1 - readonly property bool isOccupied: occupied[ws] ?? false - readonly property bool hasWindows: isOccupied && Config.bar.workspaces.showWindows + // Flag for finding workspace children + readonly property bool isWorkspace: true Layout.alignment: Qt.AlignHCenter - Layout.preferredHeight: size + Layout.preferredHeight: isVisible ? implicitHeight : 0 spacing: 0 - visible: Config.bar.workspaces.occupiedBg || root.isOccupied || root.activeWsId == root.ws + visible: isVisible StyledText { id: indicator @@ -36,72 +34,16 @@ ColumnLayout { animate: true text: { - const ws = Hypr.workspaces.values.find(w => w.id === root.ws); - const wsName = !ws || ws.name == root.ws ? root.ws : ws.name[0]; + let ws = root.ws; + let wsName = !ws || ws.name == ws.id ? ws.id : ws.name[0]; let displayName = wsName.toString(); - if (Config.bar.workspaces.capitalisation.toLowerCase() === "upper") { - displayName = displayName.toUpperCase(); - } else if (Config.bar.workspaces.capitalisation.toLowerCase() === "lower") { - displayName = displayName.toLowerCase(); - } - const label = Config.bar.workspaces.label || displayName; - const occupiedLabel = Config.bar.workspaces.occupiedLabel || label; - const activeLabel = Config.bar.workspaces.activeLabel || (root.isOccupied ? occupiedLabel : label); - return root.activeWsId === root.ws ? activeLabel : root.isOccupied ? occupiedLabel : label; + let label = Config.bar.workspaces.label || displayName; + return label } - color: Config.bar.workspaces.occupiedBg || root.isOccupied || root.activeWsId === root.ws ? Colours.palette.m3onSurface : Colours.layer(Colours.palette.m3outlineVariant, 2) + color: root.isActive ? Colours.palette.m3onSurface : Colours.layer(Colours.palette.m3outlineVariant, 2) verticalAlignment: Qt.AlignVCenter } - Loader { - id: windows - - Layout.alignment: Qt.AlignHCenter - Layout.fillHeight: true - Layout.topMargin: -Config.bar.sizes.innerWidth / 10 - - visible: active - active: root.hasWindows - - sourceComponent: Column { - spacing: 0 - - add: Transition { - Anim { - properties: "scale" - from: 0 - to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel - } - } - - move: Transition { - Anim { - properties: "scale" - to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel - } - Anim { - properties: "x,y" - } - } - - Repeater { - model: ScriptModel { - values: Hypr.toplevels.values.filter(c => c.workspace?.id === root.ws) - } - - MaterialIcon { - required property var modelData - - grade: 0 - text: Icons.getAppCategoryIcon(modelData.lastIpcObject.class, "terminal") - color: Colours.palette.m3onSurfaceVariant - } - } - } - } - Behavior on Layout.preferredHeight { Anim {} } diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml index bfa80ab..69b8e48 100644 --- a/modules/bar/components/workspaces/Workspaces.qml +++ b/modules/bar/components/workspaces/Workspaces.qml @@ -13,16 +13,17 @@ StyledClippingRect { required property ShellScreen screen - readonly property bool onSpecial: (Config.bar.workspaces.perMonitorWorkspaces ? Hypr.monitorFor(screen) : Hypr.focusedMonitor)?.lastIpcObject?.specialWorkspace?.name !== "" readonly property int activeWsId: Config.bar.workspaces.perMonitorWorkspaces ? (Hypr.monitorFor(screen).activeWorkspace?.id ?? 1) : Hypr.activeWsId - - readonly property var occupied: Hypr.workspaces.values.reduce((acc, curr) => { - acc[curr.id] = curr.lastIpcObject.windows > 0; - return acc; - }, {}) - readonly property int groupOffset: Math.floor((activeWsId - 1) / Config.bar.workspaces.shown) * Config.bar.workspaces.shown - - property real blur: onSpecial ? 1 : 0 + readonly property var monitorWorkspaces: { + if (Config.bar.workspaces.perMonitorWorkspaces) { + let monitor = Hypr.monitorFor(root.screen); + return Hypr.workspaces.values.filter(ws => { + return ws.monitor.id == monitor.id + }); + } else { + return Hypr.workspaces.values + } + } implicitWidth: Config.bar.sizes.innerWidth implicitHeight: layout.implicitHeight + Appearance.padding.small * 2 @@ -32,28 +33,6 @@ StyledClippingRect { Item { anchors.fill: parent - scale: root.onSpecial ? 0.8 : 1 - opacity: root.onSpecial ? 0.5 : 1 - - layer.enabled: root.blur > 0 - layer.effect: MultiEffect { - blurEnabled: true - blur: root.blur - blurMax: 32 - } - - Loader { - active: Config.bar.workspaces.occupiedBg - - anchors.fill: parent - anchors.margins: Appearance.padding.small - - sourceComponent: OccupiedBg { - workspaces: workspaces - occupied: root.occupied - groupOffset: root.groupOffset - } - } ColumnLayout { id: layout @@ -63,23 +42,21 @@ StyledClippingRect { Repeater { id: workspaces - - model: Config.bar.workspaces.shown - + model: monitorWorkspaces.length Workspace { + ws: monitorWorkspaces[index] activeWsId: root.activeWsId - occupied: root.occupied - groupOffset: root.groupOffset } } } Loader { anchors.horizontalCenter: parent.horizontalCenter - active: Config.bar.workspaces.activeIndicator + asynchronous: true sourceComponent: ActiveIndicator { activeWsId: root.activeWsId + monitorWorkspaces: root.monitorWorkspaces workspaces: workspaces mask: layout } @@ -95,43 +72,5 @@ StyledClippingRect { Hypr.dispatch("togglespecialworkspace special"); } } - - Behavior on scale { - Anim {} - } - - Behavior on opacity { - Anim {} - } - } - - Loader { - id: specialWs - - anchors.fill: parent - anchors.margins: Appearance.padding.small - - active: opacity > 0 - - scale: root.onSpecial ? 1 : 0.5 - opacity: root.onSpecial ? 1 : 0 - - sourceComponent: SpecialWorkspaces { - screen: root.screen - } - - Behavior on scale { - Anim {} - } - - Behavior on opacity { - Anim {} - } - } - - Behavior on blur { - Anim { - duration: Appearance.anim.durations.small - } } } |