Warning, /maui/booth/src/widgets/views/Browser.qml is written in an unsupported language. File is not indexed.

0001 // Copyright 2018-2020 Camilo Higuita <milo.h@aol.com>
0002 // Copyright 2018-2020 Nitrux Latinoamericana S.C.
0003 //
0004 // SPDX-License-Identifier: GPL-3.0-or-later
0005 
0006 
0007 import QtQuick 2.14
0008 import QtQuick.Controls 2.13
0009 import QtQuick.Layouts 1.3
0010 import org.kde.kirigami 2.8 as Kirigami
0011 import org.kde.mauikit 1.0 as Maui
0012 import QtQml.Models 2.3
0013 
0014 SplitView
0015 {
0016     id: control
0017 
0018     readonly property int _index : ObjectModel.index
0019     property alias browser : _browser
0020     property alias currentPath: _browser.currentPath
0021     property alias settings : _browser.settings
0022     property alias title : _browser.title
0023 
0024     //    property bool terminalVisible : Maui.FM.loadSettings("TERMINAL", "EXTENSIONS", false) == "true"
0025     property bool terminalVisible : false
0026     readonly property bool supportsTerminal : terminalLoader.item
0027 
0028     spacing: 0
0029     orientation: Qt.Vertical
0030     SplitView.fillHeight: true
0031     SplitView.fillWidth: true
0032 
0033     SplitView.preferredHeight: _splitView.orientation === Qt.Vertical ? _splitView.height / (_splitView.count) :  _splitView.height
0034     SplitView.minimumHeight: _splitView.orientation === Qt.Vertical ?  200 : 0
0035 
0036     SplitView.preferredWidth: _splitView.orientation === Qt.Horizontal ? _splitView.width / (_splitView.count) : _splitView.width
0037     SplitView.minimumWidth: _splitView.orientation === Qt.Horizontal ? 300 :  0
0038 
0039     opacity: _splitView.currentIndex === _index ? 1 : 0.7
0040 
0041     onCurrentPathChanged:
0042     {
0043         syncTerminal(currentBrowser.currentPath)
0044     }
0045 
0046     handle: Rectangle
0047     {
0048         implicitWidth: 6
0049         implicitHeight: 6
0050         color: SplitHandle.pressed ? Kirigami.Theme.highlightColor
0051                                    : (SplitHandle.hovered ? Qt.lighter(Kirigami.Theme.backgroundColor, 1.1) : Kirigami.Theme.backgroundColor)
0052 
0053         Rectangle
0054         {
0055             anchors.centerIn: parent
0056             width: 48
0057             height: parent.height
0058             color: _splitSeparator.color
0059         }
0060 
0061         Kirigami.Separator
0062         {
0063             id: _splitSeparator
0064             anchors.bottom: parent.bottom
0065             anchors.right: parent.right
0066             anchors.left: parent.left
0067         }
0068 
0069         Kirigami.Separator
0070         {
0071             anchors.top: parent.top
0072             anchors.right: parent.right
0073             anchors.left: parent.left
0074         }
0075     }
0076 
0077     Maui.FileBrowser
0078     {
0079         id: _browser
0080         SplitView.fillWidth: true
0081         SplitView.fillHeight: true
0082 
0083         selectionBar: root.selectionBar
0084         previewer: root.previewer
0085         shareDialog: root.shareDialog
0086         openWithDialog: root.openWithDialog
0087         tagsDialog: root.tagsDialog
0088         thumbnailsSize: root.iconSize * 1.7
0089         selectionMode: root.selectionMode
0090         onSelectionModeChanged:
0091         {
0092             root.selectionMode = selectionMode
0093             selectionMode = Qt.binding(function() { return root.selectionMode })
0094         } // rebind this property in case filebrowser breaks it
0095 
0096         settings.showHiddenFiles: root.showHiddenFiles
0097         settings.showThumbnails: root.showThumbnails
0098 
0099         Rectangle
0100         {
0101             anchors.bottom: parent.bottom
0102             anchors.left: parent.left
0103             anchors.right: parent.right
0104             height: 2
0105             opacity: 1
0106             color: Kirigami.Theme.highlightColor
0107             visible: _splitView.currentIndex === _index && _splitView.count === 2
0108         }
0109 
0110         itemMenu.contentData : [
0111 
0112             MenuSeparator {visible: _browser.itemMenu.isDir},
0113 
0114             MenuItem
0115             {
0116                 visible: _browser.itemMenu.isDir
0117                 text: i18n("Open in new tab")
0118                 icon.name: "tab-new"
0119                 onTriggered: root.openTab(_browser.itemMenu.item.path)
0120             },
0121 
0122             MenuItem
0123             {
0124                 visible: _browser.itemMenu.isDir && root.currentTab.count === 1 && root.supportSplit
0125                 text: i18n("Open in split view")
0126                 icon.name: "view-split-left-right"
0127                 onTriggered: root.currentTab.split(_browser.itemMenu.item.path, Qt.Horizontal)
0128             }
0129         ]
0130 
0131         Connections
0132         {
0133             target: _browser.dropArea
0134             ignoreUnknownSignals: true
0135             function onEntered()
0136             {
0137                 _splitView.currentIndex = control._index
0138             }
0139         }
0140 
0141         MouseArea
0142         {
0143             anchors.fill: parent
0144             propagateComposedEvents: true
0145             //        hoverEnabled: true
0146             //        onEntered: _splitView.currentIndex = control.index
0147             onPressed:
0148             {
0149                 _splitView.currentIndex = control._index
0150                 mouse.accepted = false
0151             }
0152         }
0153 
0154         onKeyPress:
0155         {
0156             if((event.key == Qt.Key_T) && (event.modifiers & Qt.ControlModifier))
0157             {
0158                 openTab(control.currentPath)
0159             }
0160 
0161             // Shortcut for closing tab
0162             if((event.key == Qt.Key_W) && (event.modifiers & Qt.ControlModifier))
0163             {
0164                 if(tabsBar.count > 1)
0165                     closeTab(tabsBar.currentIndex)
0166             }
0167 
0168             if(event.key === Qt.Key_F4)
0169             {
0170                 toogleTerminal()
0171             }
0172 
0173             if(event.key === Qt.Key_F3)
0174             {
0175                 toogleSplitView()
0176             }
0177 
0178             if((event.key === Qt.Key_N) && (event.modifiers & Qt.ControlModifier))
0179             {
0180                 newFolder()
0181             }
0182 
0183             if((event.key === Qt.Key_N) && (event.modifiers & Qt.ControlModifier) && (event.modifiers & Qt.ShiftModifier))
0184             {
0185                 newFile()
0186             }
0187         }
0188 
0189         onItemClicked:
0190         {
0191             if(root.singleClick)
0192                 openItem(index)
0193         }
0194 
0195         onItemDoubleClicked:
0196         {
0197             if(!root.singleClick)
0198             {
0199                 openItem(index)
0200                 return;
0201             }
0202 
0203             if(Kirigami.Settings.isMobile)
0204                 return
0205 
0206             const item = currentFMList.get(index)
0207             if(item.mime === "inode/directory")
0208                 control.openFolder(item.path)
0209             else
0210                 control.openFile(item.path)
0211         }
0212     }
0213 
0214     Loader
0215     {
0216         id: terminalLoader
0217         active: inx.supportsEmbededTerminal()
0218         visible: active && terminalVisible
0219         SplitView.fillWidth: true
0220         SplitView.preferredHeight: 200
0221         SplitView.maximumHeight: parent.height * 0.5
0222         SplitView.minimumHeight : 100
0223         source: "Terminal.qml"
0224 
0225         Behavior on Layout.preferredHeight
0226         {
0227             NumberAnimation
0228             {
0229                 duration: Kirigami.Units.longDuration
0230                 easing.type: Easing.InQuad
0231             }
0232         }
0233 
0234         onVisibleChanged: syncTerminal(control.currentPath)
0235     }
0236 
0237     Component.onCompleted: syncTerminal(control.currentPath)
0238     Component.onDestruction: console.log("Destroyed browsers!!!!!!!!")
0239 
0240     function syncTerminal(path)
0241     {
0242         if(terminalLoader.item && terminalVisible)
0243             terminalLoader.item.session.sendText("cd '" + String(path).replace("file://", "") + "'\n")
0244     }
0245 
0246     function toogleTerminal()
0247     {
0248         terminalVisible = !terminalVisible
0249         //        Maui.FM.saveSettings("TERMINAL", terminalVisible, "EXTENSIONS")
0250     }
0251 }