Introduced styles - first version of Widgets
[opentodolist:opentodolist.git] / OpenTodoList / qml / OpenTodoList / styles / neutral / controls / TodoListEntry.qml
1 /*
2  *  OpenTodoList - A todo and task manager
3  *  Copyright (C) 2013  Martin Höher <martin@rpdev.net>
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 import QtQuick 2.0
20 import QtQuick.Layouts 1.0
21 import "../../../js/Utils.js" as Utils;
22
23 Rectangle {
24     id: entry
25     
26     property QtObject todo: null
27     property alias containsMouse: mouseArea.containsMouse
28     property color fontColor: "black"
29     property int padding: 4
30     property bool hasNext: true
31
32     readonly property string checkActionApplyAll: "all"
33     readonly property string checkActionShowDetails: "details"
34     readonly property string checkActionCancel: "cancel"
35     
36     signal clicked
37
38     height: childrenRect.height + 2*padding
39     color: "transparent"
40     border.color: entry.todo.priority >= 0 ? priorityHint.color : "gray"
41
42     MouseArea {
43         id: mouseArea
44         anchors.fill: entryContent
45         hoverEnabled: true
46         
47         onClicked: entry.clicked()
48     }
49
50     Image {
51         id: priorityHint
52
53         property color color: Utils.PriorityColors[entry.todo.priority]
54         property int size: layout.minimumButtonHeight / 4
55
56         visible: entry.todo.priority >= 0
57         source:"image://primitives/polygon/color=" + color +
58                ",fill=" + color +
59                ",points=0:0-1:0-1:1"
60         width: size
61         height: size
62         anchors.right: parent.right
63         anchors.top: parent.top
64     }
65
66     RowLayout {
67         id: entryContent
68         anchors.left: parent.left
69         anchors.leftMargin: + priorityHint.width
70         anchors.right: parent.right
71         anchors.rightMargin: 4 + priorityHint.width
72         spacing: 10
73         y: padding
74
75         Item {
76             width: childrenRect.width
77             height: childrenRect.height
78             anchors.verticalCenter: parent.verticalCenter
79             SymbolButton {
80                 id: checkMark
81
82                 function handleResult( result ) {
83                     if ( result === checkActionApplyAll ) {
84                         Utils.recursiveSetTodoProgress( entry.todo, entry.todo.progress === 100 ? 0 : 100 )
85                     } else if ( result === checkActionShowDetails ) {
86                         entry.clicked();
87                     }
88                     popup.result.disconnect( handleResult );
89                 }
90
91                 text: entry.todo.progress === 100 ? "\uf046" : "\uf096"
92                 color: fontColor
93
94                 onClicked: if ( entry.todo.hasSubTodos() ) {
95                                var options = [
96                                            { label: entry.todo.progress === 100 ? "Uncheck Sub Todos" : "Check Sub Todos", id: checkActionApplyAll },
97                                            { label: "Show Details", id: checkActionShowDetails },
98                                            { label: "Cancel", id: checkActionCancel }
99                                        ];
100                                popup.result.connect( checkMark.handleResult )
101                                popup.show( options )
102                            } else {
103                                entry.todo.progress =
104                                        ( entry.todo.progress === 100 ? 0 : 100 )
105                            }
106             }
107         }
108
109         Text {
110             id: label
111             text: entry.todo.title
112             color: fontColor
113             font.pointSize: 12
114             wrapMode: Text.Wrap
115             Layout.fillWidth: true
116         }
117
118         SymbolButton {
119             id: deleteTodoButton
120             text: entry.todo.deleted ? "\uf0e2" : "\uf014"
121             color: fontColor
122             onClicked: entry.todo.deleted = !entry.todo.deleted;
123         }
124     }
125 }