Warning, /maui/pix/src/view_models/PixGrid.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick 2.14
0002
0003 import QtQuick.Controls 2.14
0004 import QtQuick.Layouts 1.3
0005
0006 import org.mauikit.controls 1.3 as Maui
0007
0008 import org.maui.pix 1.0
0009
0010 import "../widgets/views/Viewer/Viewer.js" as VIEWER
0011 import "../widgets"
0012
0013 Maui.Page
0014 {
0015 id: control
0016
0017 Maui.Theme.inherit: false
0018 Maui.Theme.colorGroup: Maui.Theme.View
0019
0020 property int itemSize : browserSettings.previewSize
0021
0022 readonly property alias listModel : pixModel
0023 readonly property alias menu : _picMenu
0024 readonly property alias holder : _gridView.holder
0025 readonly property alias model: _gridView.model
0026 readonly property alias gridView: _gridView
0027 readonly property alias count: _gridView.count
0028
0029 property alias currentIndex: _gridView.currentIndex
0030 property string typingQuery
0031
0032 property GalleryList list : GalleryList
0033 {
0034 autoReload: browserSettings.autoReload
0035 }
0036
0037 flickable: _gridView.flickable
0038 showTitle: false
0039
0040 property Component searchFieldComponent : Maui.SearchField
0041 {
0042 enabled: control.list.count > 0
0043 text: pixModel.filters.join(",")
0044 placeholderText: i18np("Search image", "Search %1 images", control.list.count)
0045 onAccepted:
0046 {
0047 if(_ocrOption.checked)
0048 {
0049 control.list.scanImagesText()
0050 }
0051
0052 if(text.includes(","))
0053 {
0054 model.filters = text.split(",")
0055 }else
0056 {
0057 model.filter = text
0058 }
0059 }
0060
0061 onCleared: model.clearFilters()
0062
0063 rightContent: Maui.ToolButtonMenu
0064 {
0065 icon.name: "view-filter"
0066 visible: Maui.Handy.isLinux
0067
0068 MenuItem
0069 {
0070 id: _ocrOption
0071 text: i18n("Image Text (OCR)")
0072 checkable: true
0073 }
0074 }
0075 }
0076
0077 Maui.GridBrowser
0078 {
0079 id: _gridView
0080 anchors.fill: parent
0081 enableLassoSelection: true
0082 holder.visible: _gridView.count === 0
0083
0084 itemSize : control.itemSize
0085 itemHeight: browserSettings.showLabels ? _gridView.itemSize * 1.5 : _gridView.itemSize
0086 cacheBuffer: control.height * 5
0087
0088 Loader
0089 {
0090 width: parent.width
0091 anchors.bottom: parent.bottom
0092 active: control.list.status === GalleryList.Loading
0093 visible: active
0094 sourceComponent: Maui.ProgressIndicator {}
0095 }
0096
0097 model: Maui.BaseModel
0098 {
0099 id: pixModel
0100 list: control.list
0101
0102 sort: browserSettings.sortBy
0103 sortOrder: browserSettings.sortOrder
0104 recursiveFilteringEnabled: true
0105 sortCaseSensitivity: Qt.CaseInsensitive
0106 filterCaseSensitivity: Qt.CaseInsensitive
0107 }
0108
0109 Maui.Chip
0110 {
0111 z: parent.z + 99999
0112 Maui.Theme.colorSet:Maui.Theme.Complementary
0113 visible: _typingTimer.running
0114 label.text: typingQuery
0115 anchors.left: parent.left
0116 anchors.bottom: parent.bottom
0117 showCloseButton: false
0118 anchors.margins: Maui.Style.space.medium
0119 }
0120
0121 Timer
0122 {
0123 id: _typingTimer
0124 interval: 250
0125 onTriggered:
0126 {
0127 const index = control.list.indexOfName(typingQuery)
0128 if(index > -1)
0129 {
0130 control.currentIndex = pixModel.mappedFromSource(index)
0131 }
0132
0133 typingQuery = ""
0134 }
0135 }
0136
0137 PixMenu
0138 {
0139 id: _picMenu
0140 index: control.currentIndex
0141 model: pixModel
0142 }
0143
0144 onItemsSelected: (indexes) =>
0145 {
0146 for(var i in indexes)
0147 selectItem(pixModel.get(indexes[i]))
0148 }
0149
0150 onKeyPress: (event) =>
0151 {
0152 const index = control.currentIndex
0153 const item = control.model.get(index)
0154
0155 var pat = /^([a-zA-Z0-9 _-]+)$/
0156 if(event.count === 1 && pat.test(event.text))
0157 {
0158 typingQuery += event.text
0159 _typingTimer.restart()
0160 event.accepted = true
0161 }
0162
0163 if((event.key == Qt.Key_Left || event.key == Qt.Key_Right || event.key == Qt.Key_Down || event.key == Qt.Key_Up) && (event.modifiers & Qt.ControlModifier) && (event.modifiers & Qt.ShiftModifier))
0164 {
0165 _gridView.itemsSelected([index])
0166 }
0167
0168 if(event.key === Qt.Key_Space)
0169 {
0170 getFileInfo(item.url)
0171 event.accepted = true
0172 }
0173
0174 if(event.key === Qt.Key_Return)
0175 {
0176 openPic(index)
0177 event.accepted = true
0178 }
0179
0180 if(event.key === Qt.Key_A && (event.modifiers & Qt.ControlModifier))
0181 {
0182 selectAll()
0183 event.accepted = true
0184 }
0185 }
0186
0187 delegate: Item
0188 {
0189 height: GridView.view.cellHeight
0190 width: GridView.view.cellWidth
0191
0192 PixPic
0193 {
0194 id: _gridDelegate
0195
0196 template.imageWidth: _gridView.itemSize
0197 template.imageHeight: _gridView.itemSize
0198 anchors.fill: parent
0199 anchors.margins: Maui.Handy.isMobile ? 0 : Maui.Style.space.medium
0200
0201 fit: browserSettings.fitPreviews
0202 labelsVisible: browserSettings.showLabels
0203 checkable: root.selectionMode
0204 radius: Maui.Handy.isMobile ? 0 : Maui.Style.radiusV
0205
0206 isCurrentItem: parent.GridView.isCurrentItem || checked
0207 checked: selectionBox.contains(model.url)
0208
0209 Drag.keys: ["text/uri-list"]
0210 Drag.mimeData: Drag.active ? { "text/uri-list": control.filterSelectedItems(model.url) } : {}
0211
0212 onClicked:
0213 {
0214 control.currentIndex = index
0215 if(root.selectionMode || (mouse.button == Qt.LeftButton && (mouse.modifiers & Qt.ControlModifier)))
0216 {
0217 _gridView.itemsSelected([index])
0218 }else if(Maui.Handy.singleClick)
0219 {
0220 openPic(index)
0221 }
0222 }
0223
0224 onDoubleClicked:
0225 {
0226 control.currentIndex = index
0227 if(!Maui.Handy.singleClick && !root.selectionMode)
0228 {
0229 openPic(index)
0230 }
0231 }
0232
0233 onPressAndHold:
0234 {
0235 control.currentIndex = index
0236 _picMenu.show()
0237 }
0238
0239 onRightClicked:
0240 {
0241 control.currentIndex = index
0242 _picMenu.show()
0243 }
0244
0245 onToggled:
0246 {
0247 control.currentIndex = index
0248 selectItem(pixModel.get(index))
0249 }
0250 }
0251
0252 Connections
0253 {
0254 target: selectionBox
0255 ignoreUnknownSignals: true
0256
0257 function onUriRemoved(uri)
0258 {
0259 if(uri === model.url)
0260 {
0261 _gridDelegate.checked = false
0262 }
0263 }
0264
0265 function onUriAdded(uri)
0266 {
0267 if(uri === model.url)
0268 {
0269 _gridDelegate.checked = true
0270 }
0271 }
0272
0273 function onCleared()
0274 {
0275 _gridDelegate.checked = false
0276 }
0277 }
0278 }
0279 }
0280
0281
0282 function filterSelectedItems(path)
0283 {
0284 if(selectionBox && selectionBox.count > 0 && selectionBox.contains(path))
0285 {
0286 const uris = selectionBox.uris
0287 return uris.join("\n")
0288 }
0289
0290 return path
0291 }
0292
0293 function selectAll()
0294 {
0295 for(var item of pixModel.getAll())
0296 {
0297 selectionBox.append(item.url, item)
0298 }
0299 }
0300
0301 function openPic(index)
0302 {
0303 VIEWER.open(pixModel, index)
0304 }
0305 }