summaryrefslogtreecommitdiff
path: root/modules/bar/components/workspaces/Workspaces.qml
blob: 68e9ac1bad306e4b39b44d316f6a34cae21226af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
pragma ComponentBehavior: Bound

import qs.services
import qs.config
import qs.components
import Quickshell
import QtQuick
import QtQuick.Layouts

StyledRect {
    id: root

    required property ShellScreen screen

    readonly property int activeWsId: Config.bar.workspaces.perMonitorWorkspaces ? (Hyprland.monitorFor(screen).activeWorkspace?.id ?? 1) : Hyprland.activeWsId
    readonly property list<Workspace> 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((activeWsId - 1) / Config.bar.workspaces.shown) * Config.bar.workspaces.shown

    implicitWidth: layout.implicitWidth + Appearance.padding.small * 2
    implicitHeight: layout.implicitHeight + Appearance.padding.small * 2
    color: Colours.tPalette.m3surfaceContainer
    radius: Appearance.rounding.full

    Item {
        id: inner

        anchors.fill: parent
        anchors.margins: Appearance.padding.small

        ColumnLayout {
            id: layout

            spacing: 0

            Repeater {
                model: Config.bar.workspaces.shown

                Workspace {
                    activeWsId: root.activeWsId
                    occupied: root.occupied
                    groupOffset: root.groupOffset
                }
            }
        }

        Loader {
            active: Config.bar.workspaces.occupiedBg
            asynchronous: true

            z: -1
            anchors.fill: parent

            sourceComponent: OccupiedBg {
                workspaces: root.workspaces
                occupied: root.occupied
                groupOffset: root.groupOffset
            }
        }

        Loader {
            active: Config.bar.workspaces.activeIndicator
            asynchronous: true

            sourceComponent: ActiveIndicator {
                activeWsId: root.activeWsId
                workspaces: root.workspaces
                mask: layout
                maskWidth: inner.width
                maskHeight: inner.height
                groupOffset: root.groupOffset
            }
        }

        MouseArea {
            anchors.fill: parent

            onPressed: event => {
                const ws = layout.childAt(event.x, event.y).index + root.groupOffset + 1;
                if (Hyprland.activeWsId !== ws)
                    Hyprland.dispatch(`workspace ${ws}`);
            }
        }
    }
}