summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Modals/FileBrowser/FileBrowserNavigation.qml
blob: 61ce7b69cd8442851acaf8964cc99e498580d726 (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
129
130
import QtQuick
import qs.Common
import qs.Widgets

Row {
    id: navigation

    property string currentPath: ""
    property string homeDir: ""
    property bool backButtonFocused: false
    property bool keyboardNavigationActive: false
    property bool showSidebar: true
    property bool pathEditMode: false
    property bool pathInputHasFocus: false

    signal navigateUp()
    signal navigateTo(string path)
    signal pathInputFocusChanged(bool hasFocus)

    height: 40
    leftPadding: Theme.spacingM
    rightPadding: Theme.spacingM
    spacing: Theme.spacingS

    StyledRect {
        width: 32
        height: 32
        radius: Theme.cornerRadius
        color: (backButtonMouseArea.containsMouse || (backButtonFocused && keyboardNavigationActive)) && currentPath !== homeDir ? Theme.surfaceVariant : "transparent"
        opacity: currentPath !== homeDir ? 1 : 0
        anchors.verticalCenter: parent.verticalCenter

        DankIcon {
            anchors.centerIn: parent
            name: "arrow_back"
            size: Theme.iconSizeSmall
            color: Theme.surfaceText
        }

        MouseArea {
            id: backButtonMouseArea

            anchors.fill: parent
            hoverEnabled: currentPath !== homeDir
            cursorShape: currentPath !== homeDir ? Qt.PointingHandCursor : Qt.ArrowCursor
            enabled: currentPath !== homeDir
            onClicked: navigation.navigateUp()
        }
    }

    Item {
        width: Math.max(0, (parent?.width ?? 0) - 40 - Theme.spacingS - (showSidebar ? 0 : 80))
        height: 32
        anchors.verticalCenter: parent.verticalCenter

        StyledRect {
            anchors.fill: parent
            radius: Theme.cornerRadius
            color: pathEditMode ? Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) : "transparent"
            border.color: pathEditMode ? Theme.primary : "transparent"
            border.width: pathEditMode ? 1 : 0
            visible: !pathEditMode

            StyledText {
                id: pathDisplay
                text: currentPath.replace("file://", "")
                font.pixelSize: Theme.fontSizeMedium
                color: Theme.surfaceText
                font.weight: Font.Medium
                anchors.fill: parent
                anchors.leftMargin: Theme.spacingS
                anchors.rightMargin: Theme.spacingS
                elide: Text.ElideMiddle
                verticalAlignment: Text.AlignVCenter
                maximumLineCount: 1
                wrapMode: Text.NoWrap
            }

            MouseArea {
                anchors.fill: parent
                cursorShape: Qt.IBeamCursor
                onClicked: {
                    pathEditMode = true
                    pathInput.text = currentPath.replace("file://", "")
                    Qt.callLater(() => pathInput.forceActiveFocus())
                }
            }
        }

        DankTextField {
            id: pathInput
            anchors.fill: parent
            visible: pathEditMode
            topPadding: Theme.spacingXS
            bottomPadding: Theme.spacingXS
            onAccepted: {
                const newPath = text.trim()
                if (newPath !== "") {
                    navigation.navigateTo(newPath)
                }
                pathEditMode = false
            }
            Keys.onEscapePressed: {
                pathEditMode = false
            }
            Keys.onDownPressed: {
                pathEditMode = false
            }
            onActiveFocusChanged: {
                navigation.pathInputFocusChanged(activeFocus)
                if (!activeFocus && pathEditMode) {
                    pathEditMode = false
                }
            }
        }
    }

    Row {
        spacing: Theme.spacingXS
        visible: !showSidebar
        anchors.verticalCenter: parent.verticalCenter

        DankActionButton {
            circular: false
            iconName: "sort"
            iconSize: Theme.iconSize - 6
            iconColor: Theme.surfaceText
        }
    }
}