~sylvain-pineau/checkbox/git_release_tools

« back to all changes in this revision

Viewing changes to checkbox-touch/components/SelectionPage.qml

"automatic merge of lp:~kissiel/checkbox/converged-keyboard-support/ by tarmac [r=pierre-equoy][bug=1231844,1318466][author=kissiel]"

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
    signal selectionDone(var selected_id_list)
37
37
    property string continueText: i18n.tr("Continue")
38
38
    readonly property alias model: selectionModel
 
39
    property alias keys: keysDelegator
39
40
    property bool onlyOneAllowed: false
40
41
    property bool emptyAllowed: false
41
42
    property bool largeBuffer: false
44
45
    visible: false
45
46
    flickable: null
46
47
    property var selectedCount : 0
 
48
    property var filteredSelectedCount: 0
47
49
    property var disabledSelectedCount: 0
 
50
    property var filter: new RegExp('.*');
48
51
    state : selectedCount > 0 ? "nonempty selection" :
49
52
        (disabledSelectedCount > 0 ? "disabled only selection" : "empty selection")
 
53
    ListModel {
 
54
        // This model holds all items that can be selected, even when filtered-out
 
55
        id: selectionModel
 
56
    }
50
57
 
51
58
    // A function that needs to be called after changes are done to the model
52
59
    // to re-count number of selected items on the list
54
61
        selectedCount = 0;
55
62
        disabledSelectedCount = 0;
56
63
        for (var i=0; i < selectionModel.count; i++) {
57
 
            if (selectionModel.get(i).mod_selected) {
58
 
                if (selectionModel.get(i).mod_disabled) {
 
64
            var modelItem = selectionModel.get(i);
 
65
            if (modelItem.mod_selected) {
 
66
                if (modelItem.mod_disabled) {
59
67
                    disabledSelectedCount++;
60
68
                } else {
61
69
                    selectedCount++;
62
70
                }
63
71
            }
64
72
        }
 
73
        updateFilteredModel();
 
74
    }
 
75
    function updateFilteredModel() {
 
76
        filteredSelectionModel.clear();
 
77
        filteredSelectedCount = 0;
 
78
        for (var i=0; i < selectionModel.count; i++) {
 
79
            var modelItem = selectionModel.get(i);
 
80
            modelItem['fullListIndex'] = i;
 
81
            if (modelItem.mod_name.search(filter) > -1) {
 
82
                filteredSelectionModel.append(modelItem);
 
83
                if (modelItem.mod_selected) {
 
84
                    filteredSelectedCount++;
 
85
                }
 
86
            }
 
87
        }
65
88
    }
66
89
    function gatherSelection() {
67
90
        var selected_id_list = [];
77
100
        continueButton.unlatch();
78
101
    }
79
102
    function deselectAll() {
80
 
        selectedCount = 0;
81
 
        disabledSelectedCount = 0;
82
 
        for (var i=0; i<selectionModel.count; i++) {
83
 
            if (!selectionModel.get(i)["mod_disabled"]) {
84
 
                selectionModel.setProperty(i, "mod_selected", false);
85
 
            } else {
86
 
                if (selectionModel.get(i).mod_selected) {
87
 
                    disabledSelectedCount++;
 
103
        for (var i=0; i<filteredSelectionModel.count; i++) {
 
104
            var modelItem = filteredSelectionModel.get(i);
 
105
            if (!modelItem.mod_disabled) {
 
106
                if (modelItem.mod_selected) {
 
107
                    filteredSelectionModel.setProperty(i, "mod_selected", false);
 
108
                    selectionModel.setProperty(modelItem.fullListIndex, "mod_selected", false);
 
109
                    selectedCount--;
 
110
                    filteredSelectedCount--;
88
111
                }
89
112
            }
90
113
        }
91
114
    }
92
115
    function selectAll() {
93
 
        selectedCount = 0;
94
 
        disabledSelectedCount = 0;
95
 
        for (var i=0; i<selectionModel.count; i++) {
96
 
            if (!selectionModel.get(i)["mod_disabled"]) {
97
 
                selectionModel.setProperty(i, "mod_selected", true);
98
 
                selectedCount++;
99
 
            } else {
100
 
                if (selectionModel.get(i).mod_selected) {
101
 
                    disabledSelectedCount++;
 
116
        for (var i=0; i<filteredSelectionModel.count; i++) {
 
117
            var modelItem = filteredSelectionModel.get(i);
 
118
            if (!modelItem.mod_disabled) {
 
119
                if (!modelItem.mod_selected) {
 
120
                    filteredSelectionModel.setProperty(i, "mod_selected", true);
 
121
                    selectionModel.setProperty(modelItem.fullListIndex, "mod_selected", true);
 
122
                    selectedCount++;
 
123
                    filteredSelectedCount++;
102
124
                }
103
125
            }
104
126
        }
117
139
                    visible: !onlyOneAllowed
118
140
                    onTriggered: {
119
141
                        if (state === "empty selection" || state == "disabled only selection") {
120
 
                            selectAll();
 
142
                            if (!onlyOneAllowed) // still reachable via key shortcut
 
143
                                selectAll();
121
144
                        }
122
145
                        else if (state === "nonempty selection") {
123
146
                            deselectAll();
124
147
                        }
125
 
 
 
148
                    }
 
149
                },
 
150
                Action {
 
151
                    id: findAction
 
152
                    text: i18n.tr("Find")
 
153
                    iconName: 'find'
 
154
                    onTriggered: {
 
155
                        if (!searchBox.visible) {
 
156
                            searchBox.visible = true;
 
157
                            searchBox.forceActiveFocus();
 
158
                        } else {
 
159
                            searchBox.visible = false;
 
160
                        }
126
161
                    }
127
162
                }
128
163
            ]
145
180
         }
146
181
    ]
147
182
 
 
183
    KeysDelegator {
 
184
        id: keysDelegator
 
185
        onKeyPressed: {
 
186
            var c = event.text
 
187
            if (event.modifiers == 0 && c.search(/[a-z]/, 'i') > -1) {
 
188
                searchBox.insert(searchBox.cursorPosition, c)
 
189
                searchBox.forceActiveFocus();
 
190
                searchBox.visible = true
 
191
                searchBox.focus = true
 
192
            }
 
193
            if (event.key == Qt.Key_Escape) {
 
194
                searchBox.text = '';
 
195
                searchBox.focus = false;
 
196
                searchBox.visible = false;
 
197
            }
 
198
        }
 
199
        Component.onCompleted: {
 
200
            rootKeysDelegator.setHandler('alt+t', root, function() {
 
201
                if (selectedCount > 0 || disabledSelectedCount > 0) {
 
202
                    continueButton.clicked();
 
203
                }
 
204
            });
 
205
            rootKeysDelegator.setHandler('ctrl+a', root, toggleSelection.trigger);
 
206
        }
 
207
    }
 
208
 
148
209
    ColumnLayout {
149
210
        spacing: units.gu(3)
150
211
        anchors {
158
219
            rightMargin: units.gu(1)
159
220
        }
160
221
 
 
222
        TextField {
 
223
            id: searchBox
 
224
            Layout.fillWidth: true
 
225
            visible: false
 
226
            onTextChanged: {
 
227
                filter = new RegExp('.*' + text, 'i');
 
228
                updateFilteredModel();
 
229
            }
 
230
            onFocusChanged: {
 
231
                if (text == '' && focus == false) {
 
232
                    visible = false;
 
233
                }
 
234
            }
 
235
        }
 
236
 
161
237
        Component {
162
238
            id: sectionHeading
163
239
            Item {
191
267
 
192
268
        UbuntuListView {
193
269
            model: ListModel {
194
 
                id: selectionModel
 
270
                id: filteredSelectionModel
195
271
            }
196
272
            objectName: "listView"
197
273
            Layout.fillWidth: true
218
294
                    // Toggle the mod_selected property
219
295
                    onClicked: {
220
296
                        if (onlyOneAllowed && !checked && selectedCount > 0) {
221
 
                            // clear other selections
222
297
                            deselectAll();
 
298
                            // clear other selections on the original list
 
299
                            for (var i=0; i < selectionModel.count; i++) {
 
300
                                var modelItem = selectionModel.get(i);
 
301
                                if (!modelItem.mod_disabled) {
 
302
                                    if (modelItem.mod_selected) {
 
303
                                        selectionModel.setProperty(i, "mod_selected", false);
 
304
                                        selectedCount--;
 
305
                                    }
 
306
                                }
 
307
                            }
223
308
                        }
224
 
                        selectionModel.setProperty(index, 'mod_selected', !checked);
 
309
                        filteredSelectionModel.setProperty(index, 'mod_selected', !checked);
225
310
                        selectedCount += checked ? 1 : -1;
 
311
                        // propagate selection to the original list
 
312
                        selectionModel.setProperty(fullListIndex, 'mod_selected', checked);
 
313
 
226
314
                    }
227
315
                }
228
316
                onClicked: checkBox.clicked()