Warning, /pim/kube/framework/qml/EntitySelector.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright (C) 2018 Michael Bohlender, <bohlender@kolabsys.com> 0003 * Copyright (C) 2019 Christian Mollekopf, <mollekopf@kolabsys.com> 0004 * 0005 * This program is free software; you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation; either version 2 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License along 0016 * with this program; if not, write to the Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 2.9 0021 import QtQuick.Controls 2 0022 import QtQuick.Layouts 1.2 0023 0024 import org.kube.framework 1.0 as Kube 0025 0026 Kube.InlineAccountSwitcher { 0027 id: root 0028 0029 property bool selectionEnabled: false 0030 property string entityType 0031 property var roles 0032 property string sortRole 0033 property var filter: ({}) 0034 0035 property alias enabledEntities: entityFilterCollector.checkedEntities 0036 property var currentEntityIdentifier: null 0037 property var currentEntity: null 0038 0039 signal entityCreated(var text, var accountId) 0040 signal entityRemoved(var entity) 0041 0042 function clearSelection() { 0043 if (root.currentDelegate) { 0044 root.currentDelegate.clearSelection() 0045 } 0046 } 0047 0048 function selectEntity(entity) { 0049 root.currentDelegate.selectEntity(entity) 0050 } 0051 0052 Kube.CheckedEntities { 0053 id: entityFilterCollector 0054 } 0055 0056 delegate: Kube.ListView { 0057 id: listView 0058 0059 property bool editMode: false 0060 0061 function clearSelection() { 0062 listView.currentIndex = -1 0063 } 0064 0065 function selectEntity(entity) { 0066 if (entity) { 0067 var foundIndex = checkableModel.findIndex("object", entity) 0068 if (foundIndex >= 0) { 0069 listView.currentIndex = foundIndex; 0070 } 0071 } else { 0072 listView.currentIndex = -1; 0073 } 0074 } 0075 0076 function currentChanged(isCurrent) { 0077 if (isCurrent) { 0078 //Necessary to re-select folder on account change (so the tasklist is updated) 0079 if (currentItem) { 0080 root.currentEntityIdentifier = currentItem.currentData.identifier 0081 root.currentEntity = currentItem.currentData.object 0082 } 0083 } 0084 } 0085 0086 property Component buttonDelegate: Kube.IconButton { 0087 height: Kube.Units.gridUnit 0088 padding: 0 0089 iconName: Kube.Icons.overflowMenu_inverted 0090 onClicked: listView.editMode = !listView.editMode; 0091 checkable: true 0092 checked: listView.editMode 0093 } 0094 0095 footer: Component { 0096 FocusScope { 0097 height: Kube.Units.gridUnit + Kube.Units.smallSpacing * 2 0098 width: parent.width 0099 visible: listView.editMode 0100 0101 Kube.TextButton { 0102 id: button 0103 text: "+ " + qsTr("Add") 0104 textColor: Kube.Colors.highlightColor 0105 focus: true 0106 onClicked: { 0107 lineEdit.visible = true 0108 lineEdit.forceActiveFocus() 0109 } 0110 } 0111 0112 Kube.TextField { 0113 id: lineEdit 0114 anchors { 0115 left: parent.left 0116 right: parent.right 0117 } 0118 visible: false 0119 0120 signal aborted() 0121 0122 selectByMouse: true 0123 0124 onEditingFinished: { 0125 accepted() 0126 } 0127 0128 validator: RegExpValidator { regExp: /.+/ } 0129 0130 Keys.onReturnPressed: { 0131 if (acceptableInput) { 0132 accepted() 0133 } else { 0134 aborted() 0135 } 0136 } 0137 0138 Keys.onEscapePressed: { 0139 aborted() 0140 } 0141 0142 placeholderText: button.text 0143 0144 onAccepted: { 0145 root.entityCreated(text, listView.parent.accountId) 0146 clear() 0147 visible = false 0148 button.forceActiveFocus(Qt.TabFocusReason) 0149 } 0150 onAborted: { 0151 clear() 0152 visible = false 0153 button.forceActiveFocus(Qt.TabFocusReason) 0154 } 0155 } 0156 } 0157 0158 } 0159 footerPositioning: ListView.InlineFooter 0160 0161 currentIndex: -1 0162 0163 Layout.fillWidth: true 0164 Layout.maximumHeight: Math.min(contentHeight, parent.height - Kube.Units.gridUnit) 0165 Layout.preferredHeight: contentHeight 0166 0167 onCurrentItemChanged: { 0168 if (currentItem) { 0169 root.currentEntityIdentifier = currentItem.currentData.identifier 0170 root.currentEntity = currentItem.currentData.object 0171 } 0172 } 0173 0174 model: Kube.CheckableEntityModel { 0175 id: checkableModel 0176 type: root.entityType 0177 roles: root.roles 0178 sortRole: root.sortRole 0179 filter: (listView.editMode ? root.filter : Object.assign({}, root.filter, {enabled: true})) 0180 accountId: listView.parent.accountId 0181 checkedEntities: entityFilterCollector 0182 onInitialItemsLoaded: { 0183 //Automatically enable edit mode if no entities are enabled 0184 if (rowCount() == 0) { 0185 listView.editMode = true; 0186 } 0187 } 0188 0189 } 0190 delegate: Kube.ListDelegate { 0191 id: delegate 0192 0193 selectionEnabled: root.selectionEnabled 0194 0195 width: listView.availableWidth 0196 height: Kube.Units.gridUnit * 1.5 0197 hoverEnabled: true 0198 property bool isActive: listView.currentIndex === index 0199 property color color: !!model.color ? model.color : Kube.Colors.textColor 0200 property bool showColorIndicator: !!model.color 0201 0202 DropArea { 0203 id: dropArea 0204 //Allows the source to find the target folder id on a drop event 0205 property var targetId: model.identifier 0206 anchors.fill: parent 0207 0208 Rectangle { 0209 anchors.fill: parent 0210 color: Kube.Colors.highlightColor 0211 opacity: 0.3 0212 visible: parent.containsDrag 0213 } 0214 0215 onDropped: drop.accept(Qt.MoveAction) 0216 } 0217 0218 background: Kube.DelegateBackground { 0219 anchors.fill: parent 0220 color: Kube.Colors.textColor 0221 focused: delegate.activeFocus || delegate.hovered 0222 selected: isActive 0223 } 0224 0225 RowLayout { 0226 anchors { 0227 fill: parent 0228 leftMargin: Kube.Units.smallSpacing 0229 rightMargin: Kube.Units.smallSpacing 0230 } 0231 spacing: Kube.Units.smallSpacing 0232 Kube.CheckBox { 0233 id: checkBox 0234 opacity: 0.9 0235 visible: listView.editMode 0236 checked: model.checked || model.enabled 0237 onCheckedChanged: { 0238 model.checked = checked 0239 model.enabled = checked 0240 } 0241 0242 indicator: Rectangle { 0243 width: Kube.Units.gridUnit * 0.8 0244 height: Kube.Units.gridUnit * 0.8 0245 0246 color: delegate.color 0247 0248 //Add a border because we don't have a background 0249 border.color: Kube.Colors.backgroundColor 0250 border.width: !delegate.showColorIndicator ? 1 : 0 0251 0252 Rectangle { 0253 id: highlight 0254 anchors.fill: parent 0255 visible: checkBox.hovered || checkBox.visualFocus 0256 color: Kube.Colors.highlightColor 0257 opacity: 0.4 0258 } 0259 0260 Kube.Icon { 0261 anchors.centerIn: parent 0262 height: Kube.Units.gridUnit - 4 0263 width: Kube.Units.gridUnit - 4 0264 visible: checkBox.checked 0265 iconName: Kube.Icons.checkbox_inverted 0266 } 0267 } 0268 0269 } 0270 Kube.Label { 0271 id: label 0272 Layout.fillWidth: true 0273 text: model.name 0274 color: Kube.Colors.highlightedTextColor 0275 elide: Text.ElideLeft 0276 clip: true 0277 } 0278 Rectangle { 0279 visible: delegate.showColorIndicator && !listView.editMode 0280 width: Kube.Units.gridUnit * 0.8 0281 height: Kube.Units.gridUnit * 0.8 0282 radius: width / 2 0283 color: delegate.color 0284 } 0285 Kube.IconButton { 0286 id: removeButton 0287 0288 visible: listView.editMode 0289 onClicked: root.entityRemoved(model.object) 0290 padding: 0 0291 iconName: Kube.Icons.remove 0292 } 0293 ToolTip { 0294 id: toolTipItem 0295 visible: delegate.hovered && label.truncated 0296 text: label.text 0297 } 0298 } 0299 } 0300 } 0301 }