189 lines
6.0 KiB
QML
189 lines
6.0 KiB
QML
|
// Copyright (C) 2023 The Qt Company Ltd.
|
||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||
|
|
||
|
import QtQuick
|
||
|
import QtQuick.Controls.Basic
|
||
|
import QtQuick.Layouts
|
||
|
import FileSystemModule
|
||
|
|
||
|
ApplicationWindow {
|
||
|
id: root
|
||
|
width: 1100
|
||
|
height: 600
|
||
|
visible: true
|
||
|
flags: Qt.Window | Qt.FramelessWindowHint
|
||
|
title: qsTr("Qt Quick Controls 2 - File System Explorer")
|
||
|
|
||
|
property string currentFilePath: ""
|
||
|
property bool expandPath: false
|
||
|
|
||
|
menuBar: MyMenuBar {
|
||
|
rootWindow: root
|
||
|
|
||
|
infoText: currentFilePath
|
||
|
? (expandPath ? currentFilePath
|
||
|
: currentFilePath.substring(currentFilePath.lastIndexOf("/") + 1, currentFilePath.length))
|
||
|
: "File System Explorer"
|
||
|
|
||
|
MyMenu {
|
||
|
title: qsTr("File")
|
||
|
|
||
|
Action {
|
||
|
text: qsTr("Increase Font")
|
||
|
shortcut: "Ctrl++"
|
||
|
onTriggered: textArea.font.pixelSize += 1
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Decrease Font")
|
||
|
shortcut: "Ctrl+-"
|
||
|
onTriggered: textArea.font.pixelSize -= 1
|
||
|
}
|
||
|
Action {
|
||
|
text: expandPath ? qsTr("Toggle Short Path") : qsTr("Toggle Expand Path")
|
||
|
enabled: currentFilePath
|
||
|
onTriggered: expandPath = !expandPath
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Exit")
|
||
|
onTriggered: Qt.exit(0)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MyMenu {
|
||
|
title: qsTr("Edit")
|
||
|
|
||
|
Action {
|
||
|
text: qsTr("Cut")
|
||
|
shortcut: StandardKey.Cut
|
||
|
enabled: textArea.selectedText.length > 0
|
||
|
onTriggered: textArea.cut()
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Copy")
|
||
|
shortcut: StandardKey.Copy
|
||
|
enabled: textArea.selectedText.length > 0
|
||
|
onTriggered: textArea.copy()
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Paste")
|
||
|
shortcut: StandardKey.Paste
|
||
|
enabled: textArea.canPaste
|
||
|
onTriggered: textArea.paste()
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Select All")
|
||
|
shortcut: StandardKey.SelectAll
|
||
|
enabled: textArea.length > 0
|
||
|
onTriggered: textArea.selectAll()
|
||
|
}
|
||
|
Action {
|
||
|
text: qsTr("Undo")
|
||
|
shortcut: StandardKey.Undo
|
||
|
enabled: textArea.canUndo
|
||
|
onTriggered: textArea.undo()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
anchors.fill: parent
|
||
|
color: Colors.background
|
||
|
|
||
|
RowLayout {
|
||
|
anchors.fill: parent
|
||
|
spacing: 0
|
||
|
|
||
|
// Stores the buttons that navigate the application.
|
||
|
Sidebar {
|
||
|
id: sidebar
|
||
|
rootWindow: root
|
||
|
|
||
|
Layout.preferredWidth: 60
|
||
|
Layout.fillHeight: true
|
||
|
}
|
||
|
|
||
|
// Allows resizing parts of the UI.
|
||
|
SplitView {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
handle: Rectangle {
|
||
|
implicitWidth: 10
|
||
|
color: SplitHandle.pressed ? Colors.color2 : Colors.background
|
||
|
border.color: Colors.color2
|
||
|
opacity: SplitHandle.hovered || SplitHandle.pressed ? 1.0 : 0.0
|
||
|
|
||
|
Behavior on opacity {
|
||
|
OpacityAnimator {
|
||
|
duration: 900
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// We use an inline component to make a reusable TextArea component.
|
||
|
// This is convenient when the component is only used in one file.
|
||
|
component MyTextArea: TextArea {
|
||
|
antialiasing: true
|
||
|
color: Colors.textFile
|
||
|
selectedTextColor: Colors.textFile
|
||
|
selectionColor: Colors.selection
|
||
|
renderType: Text.QtRendering
|
||
|
textFormat: TextEdit.PlainText
|
||
|
|
||
|
background: null
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
color: Colors.surface1
|
||
|
|
||
|
SplitView.preferredWidth: 250
|
||
|
SplitView.fillHeight: true
|
||
|
|
||
|
StackLayout {
|
||
|
currentIndex: sidebar.currentTabIndex
|
||
|
|
||
|
anchors.fill: parent
|
||
|
|
||
|
// Shows the help text.
|
||
|
MyTextArea {
|
||
|
readOnly: true
|
||
|
text: qsTr("This example shows how to use and visualize the file system.\n\n"
|
||
|
+ "Customized Qt Quick Components have been used to achieve this look.\n\n"
|
||
|
+ "You can edit the files but they won't be changed on the file system.\n\n"
|
||
|
+ "Click on the folder icon to the left to get started.")
|
||
|
wrapMode: TextArea.Wrap
|
||
|
}
|
||
|
|
||
|
// Shows the files on the file system.
|
||
|
FileSystemView {
|
||
|
id: fileSystemView
|
||
|
color: Colors.surface1
|
||
|
|
||
|
onFileClicked: (path) => root.currentFilePath = path
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The ScrollView that contains the TextArea which shows the file's content.
|
||
|
ScrollView {
|
||
|
leftPadding: 20
|
||
|
topPadding: 20
|
||
|
bottomPadding: 20
|
||
|
clip: true
|
||
|
|
||
|
SplitView.fillWidth: true
|
||
|
SplitView.fillHeight: true
|
||
|
|
||
|
property alias textArea: textArea
|
||
|
|
||
|
MyTextArea {
|
||
|
id: textArea
|
||
|
text: FileSystemModel.readFile(root.currentFilePath)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
ResizeButton {}
|
||
|
}
|
||
|
}
|