aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick/views/delegatemodel/dragselection.qml
blob: 1a66264e1d7a2094a085828b226df4b3a6fbdd61 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQml
import QtQuick
import QtQml.Models

Item {
    id: root

    width: 320
    height: 480

    property bool dragging: false

    Component {
        id: packageDelegate
        Package {
            id: packageRoot

            required property var modelData

            MouseArea {
                id: visibleContainer
                Package.name: "visible"

                width: 64
                height: 64
                enabled: packageRoot.DelegateModel.inSelected

                drag.target: draggable

                Item {
                    id: draggable

                    width: 64
                    height: 64

                    Drag.active: visibleContainer.drag.active

                    anchors { horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter }

                    states: State {
                        when: visibleContainer.drag.active
                        AnchorChanges { target:  draggable; anchors { horizontalCenter: undefined; verticalCenter: undefined} }
                        ParentChange { target: selectionView; parent: draggable; x: 0; y: 0 }
                        PropertyChanges { root.dragging: true }
                        ParentChange { target: draggable; parent: root }
                    }
                }
                DropArea {
                    anchors.fill: parent
                    onEntered: selectedItems.move(0, visualModel.items.get(packageRoot.DelegateModel.itemsIndex), selectedItems.count)
                }
            }
            Item {
                id: selectionContainer
                Package.name: "selection"

                width: 64
                height: 64

                visible: PathView.onPath
            }
            Rectangle {
                id: content
                parent: visibleContainer

                width: 58
                height: 58

                radius: 8

                gradient: Gradient {
                    GradientStop { id: gradientStart; position: 0.0; color: "#8AC953" }
                    GradientStop { id: gradientEnd; position: 1.0; color: "#8BC953" }
                }

                border.width: 2
                border.color: "#007423"

                state: root.dragging && packageRoot.DelegateModel.inSelected ? "selected" : "visible"

                Text {
                    anchors.fill: parent
                    horizontalAlignment: Text.AlignHCenter
                    verticalAlignment: Text.AlignVCenter
                    color: "white"
                    text: packageRoot.modelData
                    font.pixelSize: 18
                }

                Rectangle {
                    anchors { right: parent.right; top: parent.top; margins: 3 }
                    width: 12; height: 12
                    color: packageRoot.DelegateModel.inSelected ? "black" : "white"
                    radius: 6

                    border.color: "white"
                    border.width: 2

                    MouseArea {
                        anchors.fill: parent
                        onClicked: packageRoot.DelegateModel.inSelected = !packageRoot.DelegateModel.inSelected
                    }
                }

                states: [
                    State {
                        name: "selected"
                        ParentChange { target: content; parent: selectionContainer; x: 3; y: 3 }
                        PropertyChanges {
                            packageRoot.DelegateModel.inItems: visibleContainer.drag.active
                            gradientStart.color: "#017423"
                        }
                        PropertyChanges { gradientStart.color: "#007423" }
                    }, State {
                        name: "visible"
                        PropertyChanges { packageRoot.DelegateModel.inItems: true }
                        ParentChange { target: content; parent: visibleContainer; x: 3; y: 3 }
                        PropertyChanges { gradientStart.color: "#8AC953" }
                        PropertyChanges { gradientStart.color: "#8BC953" }
                    }
                ]
                transitions: Transition {
                    PropertyAction { target: packageRoot; properties: "DelegateModel.inItems" }
                    ParentAnimation {
                        target: content
                        NumberAnimation { target: content; properties: "x,y"; duration: 500 }
                    }
                    ColorAnimation { targets: [gradientStart, gradientEnd]; duration: 500 }
                }
            }
        }
    }

    DelegateModel {
        id: visualModel
        model: 35
        delegate: packageDelegate

        groups: DelegateModelGroup { id: selectedItems; name: "selected" }

        Component.onCompleted:  parts.selection.filterOnGroup = "selected"
    }

    PathView {
        id: selectionView

        height: 64
        width: 64

        model: visualModel.parts.selection

        path: Path {
            startX: 0
            startY: 0
            PathLine { x: 64; y: 64 }
        }
    }

    GridView {
        id: itemsView
        anchors { fill: parent }
        cellWidth: 64
        cellHeight: 64
        model: visualModel.parts.visible
    }
}