~mterry/ubuntu-calculator-app/confined

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
/*
 * Copyright (C) 2012-2015 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

VisualDataModel {
    id: visualModel

    groups: [
        VisualDataGroup {
            id: selectedGroup

            name: "selected"
        }
    ]

    property Item currentSwipedItem: null
    property alias selectedItems: selectedGroup
    // This property holds if the selection will accept multiple items or single items
    property bool multipleSelection: true

    // This property holds a list with the index of selected items
    property string state: ""
    readonly property bool isInSelectionMode: state === "selection"

    function updateSwipeState(item) {
        if (item.swipping) {
            return;
        }

        if (item.swipeState !== "Normal") {
            if (currentSwipedItem !== item) {
                if (currentSwipedItem) {
                    currentSwipedItem.resetSwipe();
                }
                currentSwipedItem = item;
            } else if (item.swipeState !== "Normal" && currentSwipedItem === item) {
                currentSwipedItem = null;
            }
        }
    }
    /*!
     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(visualModel.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 && selectedItems.count < visualModel.items.count) {
            visualModel.items.addGroups(0, visualModel.items.count, ["selected"] );
        } else {
            clearSelection();
        }
    }

    function getModelIndexFromIndex(index) {
        return visualModel.modelIndex(index);
    }
}