summaryrefslogtreecommitdiff
path: root/modules/bar/Workspaces.qml
blob: a0b147026678750891d1a71f5a01a8882cb0df88 (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
pragma ComponentBehavior: Bound

import "root:/widgets"
import "root:/services"
import "root:/config"
import QtQuick
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects

Item {
    id: root

    property alias vertical: layout.vertical
    readonly property color colour: Appearance.colours.mauve

    implicitWidth: layout.implicitWidth
    implicitHeight: layout.implicitHeight

    BoxLayout {
        id: layout

        padding: [Appearance.padding.smaller / 2, 0]
        anchors.centerIn: parent
        homogenous: true
        spacing: 0

        Repeater {
            model: BarConfig.workspaces.shown

            Label {
                required property int index

                text: index + 1
                color: root.colour
                horizontalAlignment: Label.AlignCenter

                Layout.alignment: Layout.Center
                Layout.preferredWidth: layout.homogenous ? layout.height : -1
            }
        }
    }

    Rectangle {
        id: active

        // property int lastIdx: 0
        property int currentIdx: (Hyprland.activeWorkspace?.id ?? 1) - 1
        readonly property real size: layout.children[currentIdx][root.vertical ? "height" : "width"]
        readonly property real offset: {
            const vertical = root.vertical;
            const child = layout.children[currentIdx];
            const size = child[vertical ? "height" : "width"];
            const implicitSize = child[vertical ? "implicitHeight" : "implicitWidth"];
            return child.x - (size - implicitSize) / 2;
        }

        clip: true
        x: root.vertical ? 0 : offset
        y: root.vertical ? offset : 0
        width: root.vertical ? layout.width : size
        height: root.vertical ? size : layout.height
        color: Appearance.colours.mauve
        radius: Appearance.rounding.full

        Rectangle {
            id: base

            visible: false
            anchors.fill: parent
            color: Appearance.colours.base
        }

        OpacityMask {
            source: base
            maskSource: layout

            x: root.vertical ? 0 : -parent.offset
            y: root.vertical ? -parent.offset : 0
            width: root.width
            height: root.height

            Behavior on x {
                Anim {}
            }

            Behavior on y {
                Anim {}
            }
        }

        Behavior on x {
            Anim {}
        }

        Behavior on y {
            Anim {}
        }
    }

    component Anim: NumberAnimation {
        duration: Appearance.anim.durations.normal
        easing.type: Easing.BezierSpline
        easing.bezierCurve: Appearance.anim.curves.standard
    }
}