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 }