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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
/*
* Copyright (C) 2013 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.4
import Ubuntu.Components 1.3
import Ubuntu.Components.Popups 1.3 as Popups
/*!
\qmltype ContactSimpleListView
\inqmlmodule Ubuntu.Contacts 0.1
\ingroup ubuntu
\brief The MultipleSelectionListView provides a ListView with support to multiple selection
The MultipleSelectionListViewprovides a ListView with support to multiple selection which can be used by any
application.
Example:
\qml
import Ubuntu.Contacts 0.1
MultipleSelectionListView {
id: view
anchors.fill: paret
model: 100
delegate: Rectangle {
width: parent.width
height: 100
color: view.selectedItems.indexOf(index) == -1 ? "white" : "blue"
MouseArea {
anchors.fill: parent
onClicked: {
if (view.isInSelectionModel) {
view.selectItem(index)
}
}
onPressAndHold: view.startSelection()
}
}
onSelectionDone: console.debug("Selected items:" + view.selectedItems)
}
\endqml
*/
ListView {
id: listView
/*!
\qmlproperty model selectedItems
This property holds the list of selected items
*/
readonly property alias selectedItems: visualModel.selectedItems
/*!
\qmlproperty bool multipleSelection
This property holds if the selection will accept multiple items or single items
*/
property bool multipleSelection: true
/*!
\qmlproperty model listModel
This property holds the model providing data for the list.
*/
property alias listModel: visualModel.model
/*!
\qmlproperty Component listDelegate
The delegate provides a template defining each item instantiated by the view.
*/
property alias listDelegate: visualModel.delegate
/*!
\qmlproperty bool isInSelectionMode
This property holds a list with the index of selected items
*/
readonly property bool isInSelectionMode: state === "selection"
/*!
This handler is called when the selection mode is finished without be canceled
*/
signal selectionDone(var items)
/*!
This handler is called when the selection mode is canceled
*/
signal selectionCanceled()
/*!
Start the selection mode on the list view.
*/
function startSelection()
{
state = "selection"
}
/*!
Check if the item is selected
Returns true if the item was marked as selected or false if the item is unselected
*/
function isSelected(item)
{
if (item && item.VisualDataModel) {
return (item.VisualDataModel.inSelected === true)
} else {
return false
}
}
/*!
Mark the item as selected
Returns true if the item was marked as selected or false if the item is already selected
*/
function selectItem(item)
{
if (item.VisualDataModel.inSelected) {
return false
} else {
if (!multipleSelection) {
clearSelection()
}
item.VisualDataModel.inSelected = true
return true
}
}
/*!
Remove the index from the selected list
*/
function deselectItem(item)
{
var result = false
if (item.VisualDataModel.inSelected) {
item.VisualDataModel.inSelected = false
result = true
}
return result
}
/*!
Finish the selection mode with sucess
*/
function endSelection()
{
selectionDone(listView.selectedItems)
clearSelection()
state = ""
}
/*!
Cancel the selection
*/
function cancelSelection()
{
selectionCanceled()
clearSelection()
state = ""
}
/*!
Remove any selected item from the selection list
*/
function clearSelection()
{
if (selectedItems.count > 0) {
selectedItems.remove(0, selectedItems.count)
}
}
/*!
Select all items in the list
*/
function selectAll()
{
if (multipleSelection) {
visualModel.items.addGroups(0, visualModel.items.count, ["selected"] )
}
}
model: visualModel
MultipleSelectionVisualModel {
id: visualModel
}
Component.onCompleted: {
// FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
// for Flickable.maximumFlickVelocity and Flickable.flickDeceleration
var scaleFactor = units.gridUnit / 8;
maximumFlickVelocity = maximumFlickVelocity * scaleFactor;
flickDeceleration = flickDeceleration * scaleFactor;
}
}
|