Revision control
++ // 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
++
++ pragma ComponentBehavior: Bound
++
++ ApplicationWindow {
++ id: root
++
++ property bool expandPath: false
++ property bool showLineNumbers: true
++ property string currentFilePath: ""
++
++ width: 1100
++ height: 600
++ minimumWidth: 200
++ minimumHeight: 100
++ visible: true
++ color: Colors.background
++ flags: Qt.Window | Qt.FramelessWindowHint
++ title: qsTr("File System Explorer")
++
++ function getInfoText() : string {
++ let out = root.currentFilePath
++ if (!out)
++ return qsTr("File System Explorer")
++ return root.expandPath ? out : out.substring(out.lastIndexOf("/") + 1, out.length)
++ }
++
++ menuBar: MyMenuBar {
++ dragWindow: root
++ infoText: root.getInfoText()
++ MyMenu {
++ title: qsTr("File")
++
++ Action {
++ text: qsTr("Increase Font")
++ shortcut: StandardKey.ZoomIn
++ onTriggered: editor.text.font.pixelSize += 1
++ }
++ Action {
++ text: qsTr("Decrease Font")
++ shortcut: StandardKey.ZoomOut
++ onTriggered: editor.text.font.pixelSize -= 1
++ }
++ Action {
++ text: root.showLineNumbers ? qsTr("Toggle Line Numbers OFF")
++ : qsTr("Toggle Line Numbers ON")
++ shortcut: "Ctrl+L"
++ onTriggered: root.showLineNumbers = !root.showLineNumbers
++ }
++ Action {
++ text: root.expandPath ? qsTr("Toggle Short Path")
++ : qsTr("Toggle Expand Path")
++ enabled: root.currentFilePath
++ onTriggered: root.expandPath = !root.expandPath
++ }
++ Action {
++ text: qsTr("Reset Filesystem")
++ enabled: sidebar.currentTabIndex === 1
++ onTriggered: fileSystemView.rootIndex = undefined
++ }
++ Action {
++ text: qsTr("Exit")
++ onTriggered: Qt.exit(0)
++ shortcut: StandardKey.Quit
++ }
++ }
++
++ MyMenu {
++ title: qsTr("Edit")
++
++ Action {
++ text: qsTr("Cut")
++ shortcut: StandardKey.Cut
++ enabled: editor.text.selectedText.length > 0
++ onTriggered: editor.text.cut()
++ }
++ Action {
++ text: qsTr("Copy")
++ shortcut: StandardKey.Copy
++ enabled: editor.text.selectedText.length > 0
++ onTriggered: editor.text.copy()
++ }
++ Action {
++ text: qsTr("Paste")
++ shortcut: StandardKey.Paste
++ enabled: editor.text.canPaste
++ onTriggered: editor.text.paste()
++ }
++ Action {
++ text: qsTr("Select All")
++ shortcut: StandardKey.SelectAll
++ enabled: editor.text.length > 0
++ onTriggered: editor.text.selectAll()
++ }
++ Action {
++ text: qsTr("Undo")
++ shortcut: StandardKey.Undo
++ enabled: editor.text.canUndo
++ onTriggered: editor.text.undo()
++ }
++ }
++ }
++ // Set up the layout of the main components in a row:
++ // [ Sidebar, Navigation, Editor ]
++ RowLayout {
++ anchors.fill: parent
++ spacing: 0
++
++ // Stores the buttons that navigate the application.
++ Sidebar {
++ id: sidebar
++ dragWindow: root
++ Layout.preferredWidth: 50
++ Layout.fillHeight: true
++ }
++
++ // Allows resizing parts of the UI.
++ SplitView {
++ Layout.fillWidth: true
++ Layout.fillHeight: true
++ // Customized handle to drag between the Navigation and the Editor.
++ handle: Rectangle {
++ implicitWidth: 10
++ color: SplitHandle.pressed ? Colors.color2 : Colors.background
++ border.color: SplitHandle.hovered ? Colors.color2 : Colors.background
++ opacity: SplitHandle.hovered || navigationView.width < 15 ? 1.0 : 0.0
++
++ Behavior on opacity {
++ OpacityAnimator {
++ duration: 1400
++ }
++ }
++ }
++
++ Rectangle {
++ id: navigationView
++ color: Colors.surface1
++ SplitView.preferredWidth: 250
++ SplitView.fillHeight: true
++ // The stack-layout provides different views, based on the
++ // selected buttons inside the sidebar.
++ StackLayout {
++ anchors.fill: parent
++ currentIndex: sidebar.currentTabIndex
++
++ // Shows the help text.
++ Text {
++ 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
++ color: Colors.text
++ }
++
++ // Shows the files on the file system.
++ FileSystemView {
++ id: fileSystemView
++ color: Colors.surface1
++ onFileClicked: path => root.currentFilePath = path
++ }
++ }
++ }
++
++ // The main view that contains the editor.
++ Editor {
++ id: editor
++ showLineNumbers: root.showLineNumbers
++ currentFilePath: root.currentFilePath
++ SplitView.fillWidth: true
++ SplitView.fillHeight: true
++ }
++ }
++ }
++
++ ResizeButton {
++ resizeWindow: root
++ }
++ }