Warning, /maui/mauikit-filebrowsing/src/controls.6/TagsDialog.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick 0002 import QtQuick.Controls 0003 import QtQuick.Layouts 0004 0005 import org.mauikit.controls 1.3 as Maui 0006 import org.mauikit.filebrowsing 1.3 as FB 0007 0008 /** 0009 * @inherit org::mauikit::controls::PopupPage 0010 * @brief A popup dialog for selecting between all the available tags to associate to a given set of file URLs. 0011 * 0012 * This popup page also allows to create new tags, edit existing ones and removing. 0013 * 0014 * To associate the set of file URLs, use the exposed property `composerList.urls`, which is an alias to TagsList::urls. 0015 * @see composerList 0016 * @see TagsList::urls 0017 * The `composerList` property exposes most of the available properties for tweaking the behaviour, and also contains the methods to perform any modifications to the tags. 0018 * 0019 * @image html tagsdialog.png "Example using the TagsDialog control" 0020 * 0021 * @code 0022 * Maui.Page 0023 * { 0024 * Maui.Controls.showCSD: true 0025 * anchors.fill: parent 0026 * 0027 * title: "Add tags to a file" 0028 * 0029 * FB.FileBrowser 0030 * { 0031 * id: _fileBrowser 0032 * anchors.fill: parent 0033 * currentPath: StandardPaths.writableLocation(StandardPaths.DownloadLocation) 0034 * settings.viewType: FB.FMList.LIST_VIEW 0035 * onItemClicked: (index) => 0036 * { 0037 * _tagsDialog.composerList.urls = [_fileBrowser.currentFMModel.get(index).url] 0038 * _tagsDialog.open() 0039 * } 0040 * } 0041 * 0042 * FB.TagsDialog 0043 * { 0044 * id: _tagsDialog 0045 * composerList.strict: false //Show all the associated tags to the file 0046 * onTagsReady: (tags) => console.log(tags) 0047 * } 0048 * } 0049 * @endcode 0050 */ 0051 Maui.PopupPage 0052 { 0053 id: control 0054 0055 /** 0056 * @brief An alias to the TagsList list/model controlling and listing all of the available tags. 0057 * @see TagsListmodel 0058 * @property TagsList TagsDialog::tagList 0059 */ 0060 readonly property alias taglist : _tagsList 0061 0062 /** 0063 * @brief An alias to the Mauikit ListBrowser element listing the tag elements. 0064 * @property MauiKit::ListBrowser TagsDialog::listView 0065 */ 0066 readonly property alias listView: _listView 0067 0068 /** 0069 * @brief An alias to the TagsList controller and model. 0070 * This property is exposed to set the file URLs to which perform any new assignment or removal of tags. 0071 * Refer to its documentation for more details on the available actions. 0072 * @property TagsList TagsDialog::composerList 0073 */ 0074 readonly property alias composerList: tagListComposer.list 0075 0076 /** 0077 * @brief Emitted once the assignment of the new set of tags has been done. This can include removal or additions. 0078 * This won't actually write any changes to the file URLs, to write the changes refer to the `composerList.updateToUrls` function. 0079 * @see TagsList::updateToUrls 0080 * @param tags the list of the new tag names associated to the file URLs 0081 */ 0082 signal tagsReady(var tags) 0083 0084 hint: 1 0085 0086 maxHeight: 500 0087 maxWidth: 400 0088 0089 actions: [ 0090 0091 Action 0092 { 0093 text: i18nd("mauikitfilebrowsing", "Save") 0094 onTriggered: control.setTags() 0095 }, 0096 0097 Action 0098 { 0099 text: i18nd("mauikitfilebrowsing", "Cancel") 0100 onTriggered: control.close() 0101 } 0102 ] 0103 0104 headBar.visible: true 0105 headBar.forceCenterMiddleContent: false 0106 headBar.middleContent: TextField 0107 { 0108 id: tagText 0109 Layout.fillWidth: true 0110 Layout.maximumWidth: 500 0111 placeholderText: i18nd("mauikitfilebrowsing", "Filter or add a new tag") 0112 // validator: RegExpValidator { regExp: /[0-9A-F]+/ } 0113 onAccepted: 0114 { 0115 const tags = tagText.text.split(",") 0116 for(var i in tags) 0117 { 0118 const myTag = tags[i].trim() 0119 _tagsList.insert(myTag) 0120 tagListComposer.list.append(myTag) 0121 } 0122 clear() 0123 _tagsModel.filter = "" 0124 } 0125 0126 onTextChanged: 0127 { 0128 _tagsModel.filter = text 0129 } 0130 } 0131 0132 Maui.InfoDialog 0133 { 0134 id: _deleteDialog 0135 0136 property string tag 0137 title: i18nd("mauikitfilebrowsing", "Delete %1", tag) 0138 message: i18nd("mauikitfilebrowsing", "Are you sure you want to delete this tag? This action can not be undone.") 0139 template.iconSource: "tag" 0140 onAccepted: 0141 { 0142 FB.Tagging.removeTag(tag) 0143 _deleteDialog.close() 0144 } 0145 0146 onRejected: _deleteDialog.close() 0147 } 0148 0149 Maui.ContextualMenu 0150 { 0151 id: _menu 0152 0153 MenuItem 0154 { 0155 text: i18nd("mauikitfilebrowsing", "Edit") 0156 icon.name: "document-edit" 0157 } 0158 0159 MenuItem 0160 { 0161 text: i18nd("mauikitfilebrowsing", "Delete") 0162 icon.name: "delete" 0163 onTriggered: 0164 { 0165 _deleteDialog.tag = _tagsModel.get(_listView.currentIndex).tag 0166 _deleteDialog.open() 0167 } 0168 } 0169 } 0170 0171 stack: [ 0172 0173 Maui.ListBrowser 0174 { 0175 id: _listView 0176 0177 Layout.fillHeight: true 0178 Layout.fillWidth: true 0179 clip: true 0180 currentIndex: -1 0181 0182 holder.emoji: "qrc:/assets/tag.svg" 0183 holder.visible: _listView.count === 0 0184 holder.title : i18nd("mauikitfilebrowsing", "No Tags!") 0185 holder.body: i18nd("mauikitfilebrowsing", "Create new tags to organize your files.") 0186 0187 model: Maui.BaseModel 0188 { 0189 id: _tagsModel 0190 sort: "tag" 0191 sortOrder: Qt.AscendingOrder 0192 recursiveFilteringEnabled: true 0193 sortCaseSensitivity: Qt.CaseInsensitive 0194 filterCaseSensitivity: Qt.CaseInsensitive 0195 list: FB.TagsListModel 0196 { 0197 id: _tagsList 0198 strict: false 0199 } 0200 } 0201 0202 delegate: Maui.ListBrowserDelegate 0203 { 0204 width: ListView.view.width 0205 label1.text: model.tag 0206 iconSource: model.icon 0207 iconSizeHint: Maui.Style.iconSizes.small 0208 0209 template.content: Rectangle 0210 { 0211 color: model.color ? model.color : "transparent" 0212 height: Maui.Style.iconSizes.small 0213 radius: height/2 0214 width: height 0215 } 0216 0217 onClicked: 0218 { 0219 _listView.currentIndex = index 0220 if(Qt.styleHints.singleClickActivation) 0221 { 0222 tagListComposer.list.appendItem(_tagsModel.get(_listView.currentIndex)) 0223 } 0224 } 0225 0226 onDoubleClicked: 0227 { 0228 _listView.currentIndex = index 0229 if(!Qt.styleHints.singleClickActivation) 0230 { 0231 tagListComposer.list.appendItem(_tagsModel.get(_listView.currentIndex)) 0232 } 0233 } 0234 0235 onPressAndHold: 0236 { 0237 _listView.currentIndex = index 0238 _menu.open() 0239 } 0240 0241 onRightClicked: 0242 { 0243 _listView.currentIndex = index 0244 _menu.open() 0245 } 0246 } 0247 }, 0248 0249 Loader 0250 { 0251 asynchronous: true 0252 active: tagListComposer.list.urls.length > 1 0253 visible: active 0254 Layout.fillWidth: true 0255 0256 sourceComponent: Maui.ListItemTemplate 0257 { 0258 id: _info 0259 0260 property var itemInfo : FB.FM.getFileInfo( tagListComposer.list.urls[0]) 0261 label1.text: i18nd("mauikitfilebrowsing", "Tagging %1 files", tagListComposer.list.urls.length) 0262 label2.text: i18nd("mauikitfilebrowsing", "Add new tags for the selected files.") 0263 label2.wrapMode: Text.WrapAtWordBoundaryOrAnywhere 0264 iconSource : itemInfo.icon 0265 imageSource: itemInfo.thumbnail 0266 // iconSizeHint: Maui.Style.iconSizes.huge 0267 // headerSizeHint: iconSizeHint + Maui.Style.space.big 0268 0269 iconComponent: Item 0270 { 0271 Item 0272 { 0273 anchors.fill: parent 0274 layer.enabled: true 0275 0276 Rectangle 0277 { 0278 anchors.fill: parent 0279 anchors.leftMargin: Maui.Style.space.small 0280 anchors.rightMargin: Maui.Style.space.small 0281 radius: Maui.Style.radiusV 0282 color: Qt.tint(control.Maui.Theme.textColor, Qt.rgba(control.Maui.Theme.backgroundColor.r, control.Maui.Theme.backgroundColor.g, control.Maui.Theme.backgroundColor.b, 0.9)) 0283 border.color: Maui.Theme.backgroundColor 0284 } 0285 0286 Rectangle 0287 { 0288 anchors.fill: parent 0289 anchors.topMargin: Maui.Style.space.tiny 0290 anchors.leftMargin: Maui.Style.space.tiny 0291 anchors.rightMargin: Maui.Style.space.tiny 0292 radius: Maui.Style.radiusV 0293 color: Qt.tint(control.Maui.Theme.textColor, Qt.rgba(control.Maui.Theme.backgroundColor.r, control.Maui.Theme.backgroundColor.g, control.Maui.Theme.backgroundColor.b, 0.9)) 0294 border.color: Maui.Theme.backgroundColor 0295 } 0296 0297 Rectangle 0298 { 0299 anchors.fill: parent 0300 anchors.topMargin: Maui.Style.space.small 0301 border.color: Maui.Theme.backgroundColor 0302 0303 radius: Maui.Style.radiusV 0304 color: Qt.tint(control.Maui.Theme.textColor, Qt.rgba(control.Maui.Theme.backgroundColor.r, control.Maui.Theme.backgroundColor.g, control.Maui.Theme.backgroundColor.b, 0.9)) 0305 0306 Maui.GridItemTemplate 0307 { 0308 anchors.fill: parent 0309 anchors.margins: Maui.Style.space.tiny 0310 iconSizeHint: _info.iconSizeHint 0311 0312 iconSource: _info.iconSource 0313 imageSource: _info.imageSource 0314 } 0315 } 0316 } 0317 } 0318 } 0319 } 0320 ] 0321 0322 page.footer: FB.TagList 0323 { 0324 id: tagListComposer 0325 width: parent.width 0326 visible: count > 0 0327 0328 onTagRemoved: list.remove(index) 0329 placeholderText: i18nd("mauikitfilebrowsing", "No tags yet.") 0330 } 0331 0332 onClosed: 0333 { 0334 composerList.urls = [] 0335 tagText.clear() 0336 _tagsModel.filter = "" 0337 } 0338 0339 onOpened: tagText.forceActiveFocus() 0340 0341 /** 0342 * @brief Gathers the composed set of tags in the bottom composing TagsBar to the given file URLs, emits the `tagsReady` signal and then closes the dialog. 0343 */ 0344 function setTags() 0345 { 0346 var tags = tagListComposer.list.tags 0347 control.tagsReady(tags) 0348 close() 0349 } 0350 }