5import org.mauikit.controls as Maui
6import org.mauikit.filebrowsing as FB
19 headBar.visible: false
21 title: currentFMList.pathName
23 enableLassoSelection: true
25 gridView.itemSize : control.gridItemSize
26 gridView.itemHeight: gridView.cellWidth
32 property Component delegateInjector : null
38 readonly property alias dialog :_dialogLoader.item
47 property int gridIconSize: Maui.Style.mapToIconSizes(control.gridItemSize)
48 property int listIconSize: Maui.Style.mapToIconSizes(control.listItemSize)
51 Binding on currentIndex
53 when: control.currentView
54 value: control.currentView.currentIndex
57 viewType: settings.viewType === FB.FMList.ICON_VIEW ? Maui.AltBrowser.ViewType.Grid : Maui.AltBrowser.ViewType.List
61 control.currentIndex = 0
62 control.currentView.forceActiveFocus()
72 onSortByChanged: if(settings.group) groupBy()
73 onlyDirs: settings.onlyDirs
74 filterType: settings.filterType
75 filters: settings.filters
76 sortBy: settings.sortBy
77 hidden: settings.showHiddenFiles
78 foldersFirst: settings.foldersFirst
81 recursiveFilteringEnabled: true
82 sortCaseSensitivity: Qt.CaseInsensitive
83 filterCaseSensitivity: Qt.CaseInsensitive
91 property alias path : _commonFMList.path
98 property int gridItemSize : 140
104 property int listItemSize : Maui.Style.rowHeight
111 readonly property alias settings : _settings
117 readonly property bool loading : currentFMList.status.code === FB.PathStatus.LOADING
123 property alias readOnly: _commonFMList.readOnly
132 readonly property alias currentFMList : _commonFMList
138 readonly property alias currentFMModel : _browserModel
144 property alias filter : _browserModel.filter
150 property alias filters: _browserModel.filters
157 signal itemClicked(int index)
163 signal itemDoubleClicked(int index)
169 signal itemRightClicked(int index)
176 signal itemToggled(int index, bool state)
182 signal itemsSelected(var indexes)
188 signal keyPress(var event)
194 signal areaClicked(var mouse)
200 signal areaRightClicked(var mouse)
204 target: control.currentView
205 ignoreUnknownSignals: true
207 function onKeyPress(event)
209 control.keyPress(event)
212 function onItemsSelected(indexes)
214 control.itemsSelected(indexes)
217 function onAreaClicked(mouse)
219 console.log("Area clicked")
220 control.currentView.forceActiveFocus()
221 control.areaClicked(mouse)
224 function onAreRightClicked(mouse)
226 console.log(
"Area right clicked")
228 control.currentView.forceActiveFocus()
229 control.areaRightClicked(mouse)
244 currentView.section.property =
""
252 browser: _commonFMList
255 Maui.ProgressIndicator
257 id: _scanningProgress
259 anchors.bottom: parent.bottom
260 visible: control.loading
263 holder.visible: _holder.visible
264 holder.emoji: _holder.emoji
265 holder.title: _holder.title
266 holder.body: _holder.body
278 id: _mergeDialogComponent
285 readonly
property bool dirExists : FB.FM.fileExists(control.path+
"/"+textEntry.text)
289 console.log(
"DIR EXISTS?", dirExists)
293 _mergeDialog.alert(
i18nd(
"mauikitfilebrowsing",
"Directory already exists."), 2)
296 _mergeDialog.alert(
i18nd(
"mauikitfilebrowsing",
"Looks good."), 0)
300 title:
i18nd(
"mauikitfilebrowsing",
"Merge %1 files", urls.length)
301 message:i18nd("mauikitfilebrowsing", "Give a name to the new directory where all files will be merge.")
303 textEntry.placeholderText: i18nd("mauikitfilebrowsing", "Directory name")
307 FB.FM.group(_mergeDialog.urls, control.path, text)
312 enabled: !FB.FM.isDir(_dropMenu.target) && !control.readOnly
313 text:
i18nd(
"mauikitfilebrowsing",
"Merge Here")
314 icon.name: "edit-group"
317 var urls = _dropMenu.urls.
split(
",")
318 urls.push(_dropMenu.target)
319 _dialogLoader.sourceComponent = _mergeDialogComponent
327 enabled: FB.FM.isDir(_dropMenu.target) && !control.readOnly
328 text:
i18nd(
"mauikitfilebrowsing",
"Copy Here")
329 icon.name: "edit-copy"
332 const urls = _dropMenu.urls.split(
",")
333 FB.FM.copy(urls, _dropMenu.target)
339 enabled: FB.FM.isDir(_dropMenu.target) && !control.readOnly
340 text:
i18nd(
"mauikitfilebrowsing",
"Move Here")
341 icon.name: "edit-move"
344 const urls = _dropMenu.urls.split(
",")
345 FB.FM.cut(urls, _dropMenu.target)
351 enabled: FB.FM.isDir(_dropMenu.target) && !control.readOnly
352 text:
i18nd(
"mauikitfilebrowsing",
"Link Here")
353 icon.name: "edit-link"
356 const urls = _dropMenu.urls.split(
",")
358 FB.FM.createSymlink(url[i], _dropMenu.target)
366 text:
i18nd(
"mauikitfilebrowsing",
"Cancel")
367 icon.name: "dialog-cancel"
368 onTriggered: _dropMenu.close()
375 width: ListView.view.width
376 height:
Maui.Style.toolBarHeightAlt
377 text: control.listView.section.property ==
"date" || control.listView.section.property ===
"modified" ?
Qt.formatDateTime(
new Date(section),
"d MMM yyyy") : section
381 listDelegate:
Maui.ListBrowserDelegate
384 readonly
property string path : model.path
386 width: ListView.view.width
388 iconSource: model.icon
390 label1.text: model.label ? model.label :
""
391 label2.text: control.objectName ===
"searchView" ? model.path :
""
392 label3.text : model.mime ? (model.mime ===
"inode/directory" ? (model.count ? model.count +
i18nd(
"mauikitfilebrowsing",
" items") :
"") :
Maui.
Handy.formatSize(model.size)) :
""
393 label4.text: model.modified ?
Maui.
Handy.formatDate(model.modified,
"MM/dd/yyyy") :
""
395 template.isMask: iconSizeHint <= 22
396 iconSizeHint: _private.listIconSize
398 tooltipText: model.
path
400 checkable: control.selectionMode || checked
401 imageSource: settings.showThumbnails && height > 32 ? model.thumbnail :
""
402 checked: selectionBar ? selectionBar.contains(model.
path) : false
403 template.iconContainer.opacity: model.hidden ==
"true" ? 0.5 : 1
406 Drag.keys: [
"text/uri-list"]
408 "text/uri-list": filterSelection(control.path, model.path)
413 Layout.fillHeight:
true
414 Layout.preferredWidth: height
415 visible: (model.issymlink ==
true) || (model.issymlink ==
"true")
420 height:
Maui.Style.iconSizes.small
421 width:
Maui.Style.iconSizes.small
422 anchors.centerIn: parent
432 property var itemData : model
433 sourceComponent: control.delegateInjector
434 Layout.fillHeight:
true
435 Layout.preferredWidth: visible ? height : 0
436 active: control.delegateInjector
440 onClicked: (mouse) =>
442 control.currentIndex = index
444 if ((mouse.button ==
Qt.LeftButton) && (mouse.modifiers &
Qt.ControlModifier))
446 control.itemsSelected([index])
447 }
else if((mouse.button ==
Qt.LeftButton) && (mouse.modifiers &
Qt.ShiftModifier))
449 var lastSelectedIndex = findLastSelectedIndex(control.listView.flickable, index)
451 if(lastSelectedIndex < 0)
455 control.itemsSelected(control.range(lastSelectedIndex, index))
459 control.itemClicked(index)
465 control.currentIndex = index
466 control.itemDoubleClicked(index)
471 if(!
Maui.Handy.isTouch)
474 control.currentIndex = index
475 control.itemRightClicked(index)
480 control.currentIndex = index
481 control.itemRightClicked(index)
484 onToggled: (state) =>
486 control.currentIndex = index
487 control.itemToggled(index, state)
490 onContentDropped: (
drop) =>
492 _dropMenu.urls =
drop.urls.join(
",")
493 _dropMenu.target = model.path
501 selectionBar.removeAtUri(delegate.path)
509 function onUriRemoved(uri)
511 if(uri === model.path)
512 delegate.checked =
false
515 function onUriAdded(uri)
517 if(uri === model.path)
518 delegate.checked =
true
523 delegate.checked =
false
532 readonly
property alias checked : delegate.checked
538 selectionBar.removeAtUri(delegate.path)
542 Maui.GridBrowserDelegate
545 readonly
property string path : model.path
547 template.imageWidth: control.gridView.itemSize
548 template.imageHeight: control.gridView.itemSize
551 anchors.margins:
Maui.Handy.isMobile ?
Maui.Style.space.tiny :
Maui.Style.space.medium
553 template.labelSizeHint: 42
554 iconSizeHint: _private.gridIconSize
555 imageSource: settings.showThumbnails ? model.thumbnail :
""
556 template.fillMode:
Image.PreserveAspectFit
557 template.maskRadius: 0
558 iconSource: model.icon
559 label1.text: model.label
560 label2.visible: delegate.height > 160 && model.mime
561 label2.font.pointSize:
Maui.Style.fontSizes.tiny
562 label2.text: model.mime ? (model.mime ===
"inode/directory" ? (model.count ? model.count +
i18nd(
"mauikitfilebrowsing",
" items") :
"") :
Maui.
Handy.formatSize(model.size)) :
""
564 isCurrentItem: parent.
GridView.isCurrentItem || checked
565 tooltipText: model.
label
566 checkable: control.selectionMode || checked
567 checked: (selectionBar ? selectionBar.contains(model.
path) : false)
569 template.iconContainer.opacity: model.hidden ==
"true" ? 0.5 : 1
571 Drag.keys: [
"text/uri-list"]
573 "text/uri-list": filterSelection(control.path, model.path)
578 anchors.right: parent.right
579 anchors.top: parent.top
580 anchors.margins:
Maui.Style.space.medium
582 visible: (model.issymlink ==
true) || (model.issymlink ==
"true")
585 color:
Maui.Theme.textColor
587 height:
Maui.Style.iconSizes.small
594 property var itemData : model
595 sourceComponent: control.delegateInjector
597 active: control.delegateInjector
600 onClicked: (mouse) =>
602 if ((mouse.button ==
Qt.LeftButton) && (mouse.modifiers &
Qt.ControlModifier))
604 control.itemsSelected([index])
605 }
else if((mouse.button ==
Qt.LeftButton) && (mouse.modifiers &
Qt.ShiftModifier))
607 var lastSelectedIndex = findLastSelectedIndex(control.gridView.flickable, index)
609 if(lastSelectedIndex < 0)
613 control.itemsSelected(control.range(lastSelectedIndex, index))
617 control.itemClicked(index)
619 control.currentIndex = index
624 control.currentIndex = index
625 control.itemDoubleClicked(index)
630 if(!
Maui.Handy.isTouch)
633 control.currentIndex = index
634 control.itemRightClicked(index)
639 control.currentIndex = index
640 control.itemRightClicked(index)
643 onToggled: (state) =>
645 control.currentIndex = index
647 control.itemToggled(index, state)
650 onContentDropped: (
drop) =>
652 _dropMenu.urls =
drop.urls.join(
",")
653 _dropMenu.target = model.path
661 function onUriRemoved(uri)
663 if(uri === model.path)
664 delegate.checked =
false
667 function onUriAdded(uri)
669 if(uri === model.path)
670 delegate.checked =
true
673 function onCleared(uri)
675 delegate.checked =
false
688 var criteria = ViewSection.FullString
690 switch(control.currentFMList.sortBy)
692 case FB.FMList.LABEL:
694 criteria = ViewSection.FirstCharacter
705 case FB.FMList.MODIFIED:
712 control.currentView.section.property =
""
716 control.settings.viewType = FB.FMList.LIST_VIEW
717 control.currentView.section.property = prop
718 control.currentView.section.criteria = criteria
724 function findLastSelectedIndex(view, limit)
727 for(var i = 0; i < limit; i++)
729 if(view.itemAtIndex(i).checked)
741 function range(
start, end)
745 const arr =
new Array(targetLength);
746 const b = Array.apply(null, arr);
747 const result = b.map((discard, n) => {
748 return (isReverse) ? n + end : n +
start;
751 return (isReverse) ? result.reverse() : result;
757 function forceActiveFocus()
759 control.currentView.forceActiveFocus()
A group of properties to tweak the browser in the FileBrowser component.
Q_SCRIPTABLE Q_NOREPLY void start()
QString i18nd(const char *domain, const char *text, const TYPE &arg...)
KIOWIDGETS_EXPORT DropJob * drop(const QDropEvent *dropEvent, const QUrl &destUrl, DropJobFlags dropjobFlags, JobFlags flags=DefaultFlags)
QString path(const QString &relativePath)
QString label(StandardShortcut id)
const QList< QKeySequence > & end()
QString & fill(QChar ch, qsizetype size)
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const