pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Caelestia.Config import qs.components import qs.components.filedialog import qs.services StyledRect { id: root required property var dialog implicitWidth: Sizes.sidebarWidth implicitHeight: inner.implicitHeight + Tokens.padding.medium * 2 color: Colours.tPalette.m3surfaceContainer ColumnLayout { id: inner anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top anchors.margins: Tokens.padding.medium spacing: Tokens.spacing.extraSmall StyledText { Layout.alignment: Qt.AlignHCenter Layout.topMargin: Tokens.padding.extraSmall / 2 Layout.bottomMargin: Tokens.spacing.medium text: qsTr("Files") color: Colours.palette.m3onSurface font: Tokens.font.body.builders.large.weight(Font.Bold).build() } Repeater { model: ["Home", "Downloads", "Desktop", "Documents", "Music", "Pictures", "Videos"] StyledRect { id: place required property string modelData readonly property bool selected: modelData === root.dialog.cwd[root.dialog.cwd.length - 1] Layout.fillWidth: true implicitHeight: placeInner.implicitHeight + Tokens.padding.medium * 2 radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3secondaryContainer, selected ? 1 : 0) StateLayer { color: place.selected ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface onClicked: { if (place.modelData === "Home") root.dialog.cwd = ["Home"]; else root.dialog.cwd = ["Home", place.modelData]; } } RowLayout { id: placeInner anchors.fill: parent anchors.margins: Tokens.padding.medium anchors.leftMargin: Tokens.padding.large anchors.rightMargin: Tokens.padding.large spacing: Tokens.spacing.medium MaterialIcon { text: { const p = place.modelData; if (p === "Home") return "home"; if (p === "Downloads") return "file_download"; if (p === "Desktop") return "desktop_windows"; if (p === "Documents") return "description"; if (p === "Music") return "music_note"; if (p === "Pictures") return "image"; if (p === "Videos") return "video_library"; return "folder"; } color: place.selected ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface font: Tokens.font.icon.large fill: place.selected ? 1 : 0 Behavior on fill { Anim {} } } StyledText { Layout.fillWidth: true text: place.modelData color: place.selected ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface font: Tokens.font.body.medium elide: Text.ElideRight } } } } } }