Warning, /maui/mauikit/src/controls.6/ItemDelegate.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright 2018 Camilo Higuita <milo.h@aol.com> 0003 * 0004 * This program is free software; you can redistribute it and/or modify 0005 * it under the terms of the GNU Library General Public License as 0006 * published by the Free Software Foundation; either version 2, or 0007 * (at your option) any later version. 0008 * 0009 * This program is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0012 * GNU General Public License for more details 0013 * 0014 * You should have received a copy of the GNU Library General Public 0015 * License along with this program; if not, write to the 0016 * Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 0021 import QtQuick.Controls 0022 0023 import org.mauikit.controls 1.3 as Maui 0024 0025 /** 0026 * @inherit QtQuick.Controls.Control 0027 * @brief ItemDelegate is the base for the MauiKit delegate controls. 0028 * It is radically different from QQC2 ItemDelegate. 0029 * 0030 * <a href="https://doc.qt.io/qt-6/qml-qtquick-controls-control.html">This controls inherits from QQC2 Control, to checkout its inherited properties refer to the Qt Docs.</a> 0031 * 0032 * This is just a container with some predefined features to allow items using it to be drag and drop, and allow long-press selection to trigger contextual actions. 0033 * 0034 * Some of the controls that inherit from this are the GridBrowserDelegate adn ListBrowserDelegate. 0035 * 0036 * @section features Features 0037 * 0038 * Setting up the drag and drop feature requires a few lines. To start you need to set `draggable: true`, and after that set up what the drag data will contain.: 0039 * 0040 * @code 0041 * ItemDelegate 0042 * { 0043 * draggable: true 0044 * 0045 * Drag.keys: ["text/uri-list"] 0046 * Drag.mimeData: { "text/uri-list": "file:/path/one.txt,file:/path/two.txt,file:/path/three.txt" } //a dummy example of three paths in a single string separated by comma. 0047 * } 0048 * @endcode 0049 * 0050 * Another feature is to react to a long-press - to emulate a "right-click" - sent by a touch gesture in a mobile device, where it could mean a request to launch some contextual action menu for the item. 0051 * 0052 * @attention The long-press can either launch the drag-and-drop (DnD) or the contextual request via the `pressAndHold` signal. If after a long press the item is dragged while maintaining the pressed it will launch the DnD action, but if the long-press is released then it will launch the signal `pressAndHold`. 0053 * @see pressAndHold 0054 */ 0055 Control 0056 { 0057 id: control 0058 0059 hoverEnabled: !Maui.Handy.isMobile 0060 0061 padding: 0 0062 0063 focus: true 0064 0065 ToolTip.delay: 1000 0066 ToolTip.timeout: 5000 0067 ToolTip.visible: control.hovered && control.tooltipText 0068 ToolTip.text: control.tooltipText 0069 0070 /** 0071 * @brief The text used for the tool-tip, revealed when the item is hovered with the mouse cursor. 0072 * This type of text usually presents to the user with some extra information about the item. 0073 */ 0074 property string tooltipText 0075 0076 0077 /** 0078 * @brief The children items of this item will be place by default inside an Item. 0079 * Ideally there is only one single child element. The children elements need to be positioned manually, using either anchors or coordinates and explicit sizes. 0080 * @code 0081 * Maui.ItemDelegate 0082 * { 0083 * Rectangle //the single child element 0084 * { 0085 * anchors.fill: parent 0086 * color: "pink" 0087 * } 0088 * } 0089 * @endcode 0090 * 0091 * @property list<QtObject> ItemDelegate::content 0092 */ 0093 default property alias content : _content.data 0094 0095 /** 0096 * @brief An alias to the MouseArea handling the press events. 0097 * @note See Qt documentation on the MouseArea for more information. 0098 * @property MouseArea ItemDelegate::mouseArea 0099 */ 0100 readonly property alias mouseArea : _mouseArea 0101 0102 /** 0103 * @brief Whether the item should respond to a drag event after have been pressed for a long time. 0104 * If this is set to `true`, after the long press and a drag movement, the item contain will be captured as the Drag image source. And the drag target will be set to enable dropping the element. 0105 * By default this is set to `false`. 0106 */ 0107 property bool draggable: false 0108 0109 /** 0110 * @brief Whether the item should be styled in a "selected/checked" state. 0111 * This is an alias to the `highlighted` property. 0112 * @property bool ItemDelegate::isCurrentItem 0113 */ 0114 property alias isCurrentItem : control.highlighted 0115 0116 /** 0117 * @brief Whether the item is currently being pressed. 0118 * This is an alias to `mouseArea.containsPress` property. 0119 * @property bool ItemDelegate::containsPress 0120 */ 0121 property alias containsPress: _mouseArea.containsPress 0122 0123 /** 0124 * @brief Whether the item is being highlighted. A visual clue will be use to indicate the highlighted state. 0125 * By default this is set to `false`. 0126 */ 0127 property bool highlighted: false 0128 0129 /** 0130 * @brief The border radius of the background. 0131 * @By default this is set to `Style.radiusV`, which picks the system preference for the radius of rounded elements corners. 0132 */ 0133 property int radius: Maui.Style.radiusV 0134 0135 /** 0136 * @brief Whether the item should be styled as a flat element. A flat element usually does not have any selected state or background. 0137 * By default this property is set to `!Handy.isMobile" 0138 * @see Handy::isMobile 0139 */ 0140 property bool flat : !Maui.Handy.isMobile 0141 0142 /** 0143 * @brief Emitted when the item has been pressed. 0144 * @param mouse The object with the event information. 0145 */ 0146 signal pressed(var mouse) 0147 0148 /** 0149 * @brief Emitted when the item has been pressed and hold for a few seconds. 0150 * @param mouse The object with the event information. 0151 */ 0152 signal pressAndHold(var mouse) 0153 0154 /** 0155 * @brief Emitted when the item has been clicked - this means that the item has been pressed and then released. 0156 * @param mouse The object with the event information. 0157 */ 0158 signal clicked(var mouse) 0159 0160 /** 0161 * @brief Emitted when the item has been right clicked. Usually with a mouse device. 0162 * @param mouse The object with the event information. 0163 */ 0164 signal rightClicked(var mouse) 0165 0166 /** 0167 * @brief Emitted when the item has been double clicked in a short period of time. 0168 * @param mouse The object with the event information. 0169 */ 0170 signal doubleClicked(var mouse) 0171 0172 Drag.active: mouseArea.drag.active && control.draggable 0173 Drag.dragType: Drag.Automatic 0174 // Drag.supportedActions: Qt.MoveAction 0175 Drag.hotSpot.x: control.width / 2 0176 Drag.hotSpot.y: control.height / 2 0177 0178 contentItem: MouseArea 0179 { 0180 id: _mouseArea 0181 0182 propagateComposedEvents: false 0183 acceptedButtons: Qt.RightButton | Qt.LeftButton 0184 0185 property bool pressAndHoldIgnored : false 0186 0187 onClicked: (mouse) => 0188 { 0189 if(mouse.button === Qt.RightButton) 0190 { 0191 control.rightClicked(mouse) 0192 } 0193 else 0194 { 0195 control.clicked(mouse) 0196 } 0197 } 0198 0199 onDoubleClicked: (mouse) => 0200 { 0201 control.doubleClicked(mouse) 0202 } 0203 0204 onPressed: (mouse) => 0205 { 0206 if(control.draggable && mouse.source !== Qt.MouseEventSynthesizedByQt) 0207 { 0208 drag.target = _content 0209 control.grabToImage(function(result) 0210 { 0211 control.Drag.imageSource = result.url 0212 }) 0213 }else 0214 { 0215 // drag.target = null 0216 } 0217 // 0218 _mouseArea.pressAndHoldIgnored = false 0219 control.pressed(mouse) 0220 } 0221 0222 onReleased : (mouse) => 0223 { 0224 _content.x = 0 0225 _content.y = 0 0226 // if(control.draggable) 0227 // { 0228 // drag.target = null 0229 // } 0230 console.log("DROPPING DRAG", _mouseArea.pressAndHoldIgnored) 0231 0232 if(!mouseArea.drag.active && _mouseArea.pressAndHoldIgnored) 0233 { 0234 control.pressAndHold(mouse) 0235 _mouseArea.pressAndHoldIgnored = false 0236 } 0237 } 0238 0239 onPressAndHold : (mouse) => 0240 { 0241 xAnim.running = control.draggable || mouse.source === Qt.MouseEventSynthesizedByQt 0242 0243 _mouseArea.pressAndHoldIgnored = true 0244 0245 if(control.draggable && mouse.source === Qt.MouseEventSynthesizedByQt) 0246 { 0247 drag.target = _content 0248 console.log("GETTING DRAG", _mouseArea.pressAndHoldIgnored) 0249 control.grabToImage(function(result) 0250 { 0251 control.Drag.imageSource = result.url 0252 }) 0253 0254 }else 0255 { 0256 // drag.target = null 0257 control.pressAndHold(mouse) 0258 } 0259 } 0260 0261 onPositionChanged: (mouse) => 0262 { 0263 if(control.draggable) 0264 { 0265 console.log("MOVING DRAG", _mouseArea.pressAndHoldIgnored) 0266 _mouseArea.pressAndHoldIgnored = false 0267 mouse.accepted = true 0268 } 0269 } 0270 0271 Item 0272 { 0273 id: _content 0274 0275 height: parent.height 0276 width: parent.width 0277 0278 SequentialAnimation on y 0279 { 0280 id: xAnim 0281 // Animations on properties start running by default 0282 running: false 0283 loops: 3 0284 NumberAnimation { from: 0; to: -10; duration: 200; easing.type: Easing.InBack } 0285 NumberAnimation { from: -10; to: 0; duration: 200; easing.type: Easing.OutBack } 0286 PauseAnimation { duration: 50 } // This puts a bit of time between the loop 0287 } 0288 } 0289 } 0290 0291 background: Rectangle 0292 { 0293 color: control.isCurrentItem || control.containsPress ? Maui.Theme.highlightColor : ( control.hovered ? Maui.Theme.hoverColor : "transparent") 0294 0295 radius: control.radius 0296 } 0297 } 0298