summaryrefslogtreecommitdiff
path: root/components/controls/StyledScrollBar.qml
blob: fc641b5147089cc3644f59c9c19a450e3e2ac45e (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
106
107
108
import ".."
import qs.services
import qs.config
import QtQuick
import QtQuick.Templates

ScrollBar {
    id: root

    required property Flickable flickable
    property bool shouldBeActive
    property real nonAnimPosition
    property bool animating

    onHoveredChanged: {
        if (hovered)
            shouldBeActive = true;
        else
            shouldBeActive = flickable.moving;
    }

    onPositionChanged: {
        if (position === nonAnimPosition)
            animating = false;
        else if (!animating)
            nonAnimPosition = position;
    }

    position: nonAnimPosition
    implicitWidth: Appearance.padding.small

    contentItem: StyledRect {
        anchors.left: parent.left
        anchors.right: parent.right
        opacity: {
            if (root.size === 1)
                return 0;
            if (fullMouse.pressed)
                return 1;
            if (mouse.containsMouse)
                return 0.8;
            if (root.policy === ScrollBar.AlwaysOn || root.shouldBeActive)
                return 0.6;
            return 0;
        }
        radius: Appearance.rounding.full
        color: Colours.palette.m3secondary

        MouseArea {
            id: mouse

            anchors.fill: parent
            cursorShape: Qt.PointingHandCursor
            hoverEnabled: true
            acceptedButtons: Qt.NoButton
        }

        Behavior on opacity {
            Anim {}
        }
    }

    Connections {
        target: root.flickable

        function onMovingChanged(): void {
            if (root.flickable.moving)
                root.shouldBeActive = true;
            else
                hideDelay.restart();
        }
    }

    Timer {
        id: hideDelay

        interval: 600
        onTriggered: root.shouldBeActive = root.flickable.moving || root.hovered
    }

    CustomMouseArea {
        id: fullMouse

        anchors.fill: parent
        preventStealing: true

        onPressed: event => {
            root.animating = true;
            root.nonAnimPosition = Math.max(0, Math.min(1 - root.size, event.y / root.height - root.size / 2));
        }

        onPositionChanged: event => root.nonAnimPosition = Math.max(0, Math.min(1 - root.size, event.y / root.height - root.size / 2))

        function onWheel(event: WheelEvent): void {
            root.animating = true;
            if (event.angleDelta.y > 0)
                root.nonAnimPosition = Math.max(0, root.nonAnimPosition - 0.1);
            else if (event.angleDelta.y < 0)
                root.nonAnimPosition = Math.min(1 - root.size, root.nonAnimPosition + 0.1);
        }
    }

    Behavior on position {
        enabled: !fullMouse.pressed

        Anim {}
    }
}