aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick/externaldraganddrop/DragAndDropTextItem.qml
blob: c241f6ed820cbf75dde23eb0ddc94f1536ccdc63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQuick
import QtQuick.Controls

Rectangle {
    id: item
    property string display
    property alias dropEnabled: acceptDropCB.checked
    color: dropArea.containsDrag ? "#CFC" : "#EEE"
    ColorAnimation on color {
        id: rejectAnimation
        from: "#FCC"
        to: "#EEE"
        duration: 1000
    }
    Label {
        anchors.fill: parent
        anchors.margins: 10
        text: item.display
        wrapMode: Text.WordWrap
    }
    DropArea {
        id: dropArea
        anchors.fill: parent
        keys: ["text/plain"]
        onEntered: (drag) => {
            if (!acceptDropCB.checked) {
                drag.accepted = false
                rejectAnimation.start()
            }
        }
        onDropped: (drop) => {
            if (drop.hasText && acceptDropCB.checked) {
                if (drop.proposedAction == Qt.MoveAction || drop.proposedAction == Qt.CopyAction) {
                    item.display = drop.text
                    drop.acceptProposedAction()
                }
            }
        }
    }
    MouseArea {
        id: mouseArea
        anchors.fill: parent
        drag.target: draggable
    }
    Item {
        id: draggable
        anchors.fill: parent
        Drag.active: mouseArea.drag.active
        Drag.hotSpot.x: 0
        Drag.hotSpot.y: 0
        Drag.mimeData: { "text/plain": item.display }
        Drag.dragType: Drag.Automatic
        Drag.onDragFinished: (dropAction) => {
            if (dropAction == Qt.MoveAction)
                item.display = ""
        }
    }
    CheckBox {
        id: acceptDropCB
        anchors.bottom: parent.bottom
        checked: true
        text: "accept drop"
    }
}