summaryrefslogtreecommitdiff
path: root/widgets/filedialog/HeaderBar.qml
blob: 077bd2995395d8d822d210cb36e9bd36b2c532be (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
pragma ComponentBehavior: Bound

import ".."
import qs.services
import qs.config
import QtQuick
import QtQuick.Layouts

RowLayout {
    id: root

    required property var dialog

    spacing: Appearance.spacing.small

    Item {
        implicitWidth: implicitHeight
        implicitHeight: upIcon.implicitHeight + Appearance.padding.small * 2

        StateLayer {
            radius: Appearance.rounding.small

            function onClicked(): void {
                root.dialog.cwd.pop();
            }
        }

        MaterialIcon {
            id: upIcon

            anchors.centerIn: parent
            text: "drive_folder_upload"
        }
    }

    StyledRect {
        Layout.fillWidth: true

        radius: Appearance.rounding.small
        color: Colours.palette.m3surfaceContainer

        implicitHeight: pathComponents.implicitHeight + pathComponents.anchors.margins * 2

        RowLayout {
            id: pathComponents

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

            spacing: Appearance.spacing.small

            Repeater {
                model: root.dialog.cwd

                RowLayout {
                    id: folder

                    required property string modelData
                    required property int index

                    spacing: 0

                    Loader {
                        Layout.rightMargin: Appearance.spacing.small
                        active: folder.index > 0
                        asynchronous: true
                        sourceComponent: StyledText {
                            text: "/"
                            color: Colours.palette.m3onSurfaceVariant
                            font.bold: true
                        }
                    }

                    Item {
                        implicitWidth: homeIcon.implicitWidth + (homeIcon.active ? Appearance.padding.small : 0) + folderName.implicitWidth + Appearance.padding.normal * 2
                        implicitHeight: Math.max(homeIcon.implicitHeight, folderName.implicitHeight) + Appearance.padding.small * 2

                        Loader {
                            anchors.fill: parent
                            active: folder.index < root.dialog.cwd.length - 1
                            asynchronous: true
                            sourceComponent: StateLayer {
                                radius: Appearance.rounding.small

                                function onClicked(): void {
                                    root.dialog.cwd = root.dialog.cwd.slice(0, folder.index + 1);
                                }
                            }
                        }

                        Loader {
                            id: homeIcon

                            anchors.left: parent.left
                            anchors.verticalCenter: parent.verticalCenter
                            anchors.leftMargin: Appearance.padding.normal

                            active: folder.index === 0 && folder.modelData === "Home"
                            asynchronous: true
                            sourceComponent: MaterialIcon {
                                text: "home"
                                color: root.dialog.cwd.length === 1 ? Colours.palette.m3onSurface : Colours.palette.m3onSurfaceVariant
                                fill: 1
                            }
                        }

                        StyledText {
                            id: folderName

                            anchors.left: homeIcon.right
                            anchors.verticalCenter: parent.verticalCenter
                            anchors.leftMargin: homeIcon.active ? Appearance.padding.small : 0

                            text: folder.modelData
                            color: folder.index < root.dialog.cwd.length - 1 ? Colours.palette.m3onSurfaceVariant : Colours.palette.m3onSurface
                            font.bold: true
                        }
                    }
                }
            }

            Item {
                Layout.fillWidth: true
            }
        }
    }
}