Warning, /maui/index-fm/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.15
0008 import QtQuick.Controls 2.15
0009 
0010 import org.mauikit.controls 1.3 as Maui
0011 import org.mauikit.filebrowsing 1.3 as FB
0012 
0013 import org.maui.index 1.0 as Index
0014 
0015 import "../previewer"
0016 import ".."
0017 
0018 Maui.SplitViewItem
0019 {
0020     id: control
0021 
0022     readonly property alias browser : _browser
0023     readonly property alias settings : _browser.settings
0024     readonly property alias title : _browser.title
0025     readonly property bool supportsTerminal : terminalLoader.item
0026 
0027     property alias currentPath: _browser.currentPath
0028     property alias terminalVisible : _dirConf.terminalVisible
0029 
0030     onCurrentPathChanged:
0031     {
0032         if(currentBrowser)
0033         {
0034             syncTerminal(currentBrowser.currentPath)
0035         }
0036     }
0037 
0038     FileMenu
0039     {
0040         id: itemMenu
0041     }
0042 
0043     Maui.ContextualMenu
0044     {
0045         id: _tagMenu
0046         property string tag
0047 
0048         MenuItem
0049         {
0050             text: i18n("Edit")
0051             icon.name: "document-edit"
0052             onTriggered:
0053             {}
0054         }
0055 
0056         MenuItem
0057         {
0058             text: i18n("Remove")
0059             icon.name: "edit-delete"
0060             onTriggered:
0061             {
0062                 dialogLoader.sourceComponent = _removeTagDialogComponent
0063                 dialog.tag = _tagMenu.tag
0064                 dialog.open()
0065             }
0066         }
0067     }
0068 
0069     Component
0070     {
0071         id: _removeTagDialogComponent
0072         Maui.InfoDialog
0073         {
0074             property string tag
0075 
0076             title: i18n("Remove '%1'", tag)
0077             standardButtons: Dialog.Yes | Dialog.Cancel
0078 
0079             message: i18n("Are you sure you want to remove this tag? This operation can not be undone.")
0080             onAccepted:
0081             {
0082                 FB.Tagging.removeTag(tag, false)
0083                 close()
0084             }
0085 
0086             onRejected: close()
0087         }
0088     }
0089 
0090     Maui.SplitView
0091     {
0092         anchors.fill: parent
0093         anchors.bottomMargin: !selectionBar.hidden && (terminalVisible) ? selectionBar.height : 0
0094         spacing: 0
0095         orientation: Qt.Vertical
0096 
0097         FB.FileBrowser
0098         {
0099             id: _browser
0100 
0101             property alias viewType : _dirConf.viewType
0102             property alias sortBy : _dirConf.sortKey
0103 
0104             SplitView.fillWidth: true
0105             SplitView.fillHeight: true
0106 
0107             altHeader: _browserView.altHeader
0108             selectionBar: root.selectionBar
0109             gridItemSize: switch(appSettings.gridSize)
0110                           {
0111                           case 0: return 78;
0112                           case 1: return 96;
0113                           case 2: return 126;
0114                           case 3: return 166;
0115                           case 4: return 216;
0116                           default: return 126;
0117                           }
0118 
0119             listItemSize:   switch(appSettings.listSize)
0120                             {
0121                             case 0: return 32;
0122                             case 1: return 48;
0123                             case 2: return 64;
0124                             case 3: return 96;
0125                             case 4: return 120;
0126                             default: return 96;
0127                             }
0128 
0129             selectionMode: root.selectionMode
0130             onSelectionModeChanged:
0131             {
0132                 root.selectionMode = selectionMode
0133                 selectionMode = Qt.binding(function() { return root.selectionMode })
0134             } // rebind this property in case filebrowser breaks it
0135 
0136             settings.showHiddenFiles: appSettings.showHiddenFiles
0137             settings.showThumbnails: appSettings.showThumbnails
0138             settings.foldersFirst: sortSettings.foldersFirst
0139             settings.group: sortSettings.group
0140 
0141             settings.sortBy:  _dirConf.sortKey
0142             settings.viewType: _dirConf.viewType
0143 
0144             Index.FolderConfig
0145             {
0146                 id:  _dirConf
0147                 path: control.currentPath
0148                 enabled: appSettings.dirConf
0149                 fallbackSortKey: sortSettings.sortBy
0150                 fallbackViewType: appSettings.viewType
0151             }
0152 
0153             browser.holder.actions: [
0154                 Action
0155                 {
0156                     text: i18n("Create new")
0157                     enabled:  _browser.currentFMList.status.exists
0158                     onTriggered: _browser.newItem()
0159                 }
0160             ]
0161 
0162             Connections
0163             {
0164                 target: _browser.dropArea
0165                 ignoreUnknownSignals: true
0166                 function onEntered()
0167                 {
0168                     control.focusSplitItem()
0169                 }
0170             }
0171 
0172             onKeyPress: (event) =>
0173             {
0174                 if (event.key == Qt.Key_Forward)
0175                 {
0176                     _browser.goForward()
0177                     event.accepted = true
0178                 }
0179 
0180                 if((event.key == Qt.Key_T) && (event.modifiers & Qt.ControlModifier))
0181                 {
0182                     openTab(control.currentPath)
0183                     event.accepted = true
0184                 }
0185 
0186                 // Shortcut for closing tab
0187                 if((event.key == Qt.Key_W) && (event.modifiers & Qt.ControlModifier))
0188                 {
0189                     if(_browserView.browserList.count > 1)
0190                         root.closeTab(tabsBar.currentIndex)
0191                     event.accepted = true
0192                 }
0193 
0194                 if((event.key == Qt.Key_K) && (event.modifiers & Qt.ControlModifier))
0195                 {
0196                     pathBar.pathBar.showEntryBar()
0197                     event.accepted = true
0198                 }
0199 
0200                 if(event.key === Qt.Key_F4)
0201                 {
0202                     toogleTerminal()
0203                     event.accepted = true
0204                 }
0205 
0206                 if(event.key === Qt.Key_F3)
0207                 {
0208                     toogleSplitView()
0209                     event.accepted = true
0210                 }
0211 
0212                 if((event.key === Qt.Key_N) && (event.modifiers & Qt.ControlModifier))
0213                 {
0214                     newItem()
0215                     event.accepted = true
0216                 }
0217 
0218                 if(event.key === Qt.Key_Space)
0219                 {
0220                     if(_browser.currentIndex > -1 && _browser.currentView.count > 0)
0221                     {
0222                         openPreview(_browser.currentFMModel, _browser.currentIndex)
0223                     }
0224                     event.accepted = true
0225                 }
0226             }
0227 
0228             onItemClicked: (index) =>
0229             {
0230                 const item = currentFMModel.get(index)
0231 
0232                 //                handleSelectionState(item)
0233 
0234                 if(Maui.Handy.singleClick)
0235                 {
0236                     if(appSettings.previewFiles && item.isdir != "true" && !root.selectionMode)
0237                     {
0238                         openPreview(_browser.currentFMModel, _browser.currentIndex)
0239                         return
0240                     }
0241 
0242                     openItem(index)
0243                 }
0244             }
0245 
0246             onItemDoubleClicked: (index) =>
0247             {
0248                 const item = currentFMModel.get(index)
0249                 //                handleSelectionState(item)
0250 
0251                 if(!Maui.Handy.singleClick)
0252                 {
0253                     if(appSettings.previewFiles && item.isdir != "true" && !root.selectionMode)
0254                     {
0255                         openPreview(_browser.currentFMModel, _browser.currentIndex)
0256                         return
0257                     }
0258 
0259                     openItem(index)
0260                 }
0261             }
0262 
0263             onItemRightClicked: (index) =>
0264             {
0265                 const itemIndex = _browser.currentFMModel.mappedToSource(index)
0266                 const item = _browser.currentFMModel.get(index)
0267                 //                handleSelectionState(item)
0268 
0269                 if(item.path.startsWith("tags://"))
0270                 {
0271                     _tagMenu.tag = item.label
0272                     _tagMenu.show()
0273                 }
0274 
0275                 if(_browser.currentFMList.pathType !== FB.FMList.TRASH_PATH && _browser.currentFMList.pathType !== FB.FMList.REMOTE_PATH)
0276                 {
0277                     itemMenu.showFor(itemIndex)
0278                 }
0279             }
0280 
0281             onRightClicked:
0282             {
0283                 _actionBarLoader.item.popupMainMenu()
0284             }
0285         }
0286 
0287         Loader
0288         {
0289             id: terminalLoader
0290             SplitView.fillWidth: true
0291             SplitView.preferredHeight: 200
0292             SplitView.maximumHeight: parent.height * 0.5
0293             SplitView.minimumHeight : 100
0294             visible: control.terminalVisible
0295             asynchronous: true
0296             active: Maui.Handy.isLinux
0297         }
0298     }
0299 
0300     Component.onCompleted:
0301     {
0302         //set these values in here to avoid global binding them, so each view can have different sorting settings
0303         settings.foldersFirst = sortSettings.foldersFirst
0304         settings.group = sortSettings.group
0305 
0306         terminalLoader.setSource("Terminal.qml", ({'session.initialWorkingDirectory': control.currentPath.replace("file://", "")}))
0307     }
0308 
0309     function syncTerminal(path)
0310     {
0311         if(terminalLoader.item && appSettings.syncTerminal)
0312             terminalLoader.item.session.changeDir(path.replace("file://", ""))
0313     }
0314 
0315     function handleSelectionState(item)
0316     {
0317         if((selectionBar.count > 0) && (!Maui.Handy.isMobile) && (!item || !selectionBar.contains(item.url)))
0318         {
0319             selectionBar.clear()
0320         }
0321     }
0322 
0323     function toogleTerminal()
0324     {
0325         terminalVisible = !terminalVisible
0326 
0327         if(terminalVisible)
0328         {
0329             terminalLoader.item.forceActiveFocus()
0330         }else
0331         {
0332             control.forceActiveFocus()
0333         }
0334     }
0335 
0336     function forceActiveFocus()
0337     {
0338         browser.forceActiveFocus()
0339     }
0340 }