House keeping in QML resource dir
[opentodolist:opentodolist.git] / OpenTodoList / qml / OpenTodoList / controls / TodoListEntry.qml
1 /*
2  *  OpenTodoListDesktopQml - Desktop QML frontend for OpenTodoList
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 Item {
24     id: entry
25     
26     property QtObject todo: null
27     property alias containsMouse: mouseArea.containsMouse
28     property color fontColor: colors.fontColorFor( color )
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
40     MouseArea {
41         id: mouseArea
42         anchors.fill: entryContent
43         hoverEnabled: true
44         
45         onClicked: entry.clicked()
46     }
47
48     RowLayout {
49         id: entryContent
50         anchors.left: parent.left
51         anchors.leftMargin: 4
52         anchors.right: parent.right
53         anchors.rightMargin: 4
54         y: padding
55
56         Item {
57             width: childrenRect.width
58             height: childrenRect.height
59             anchors.verticalCenter: parent.verticalCenter
60             SymbolButton {
61                 text: "\uf0c8"
62                 color: Utils.PriorityColors[entry.todo.priority]
63             }
64             SymbolButton {
65                 id: checkMark
66
67                 function handleResult( result ) {
68                     if ( result === checkActionApplyAll ) {
69                         Utils.recursiveSetTodoProgress( entry.todo, entry.todo.progress === 100 ? 0 : 100 )
70                     } else if ( result === checkActionShowDetails ) {
71                         entry.clicked();
72                     }
73                     popup.result.disconnect( handleResult );
74                 }
75
76                 text: entry.todo.progress === 100 ? "\uf046" : "\uf096"
77                 color: fontColor
78
79                 onClicked: if ( entry.todo.hasSubTodos() ) {
80                                var options = [
81                                            { label: entry.todo.progress === 100 ? "Uncheck Sub Todos" : "Check Sub Todos", id: checkActionApplyAll },
82                                            { label: "Show Details", id: checkActionShowDetails },
83                                            { label: "Cancel", id: checkActionCancel }
84                                        ];
85                                popup.result.connect( checkMark.handleResult )
86                                popup.show( options )
87                            } else {
88                                entry.todo.progress =
89                                        ( entry.todo.progress === 100 ? 0 : 100 )
90                            }
91             }
92         }
93
94         Text {
95             id: label
96             text: entry.todo.title
97             color: fontColor
98             font.pointSize: 12
99             wrapMode: Text.Wrap
100             Layout.fillWidth: true
101         }
102
103         SymbolButton {
104             id: deleteTodoButton
105             text: entry.todo.deleted ? "\uf0e2" : "\uf014"
106             color: fontColor
107             onClicked: entry.todo.deleted = !entry.todo.deleted;
108         }
109     }
110
111     Rectangle {
112         height: entry.hasNext ? 2 : 0
113         border.color: "#50000000"
114         anchors { left: parent.left; right: parent.right; top: entryContent.bottom; topMargin: entry.padding }
115     }
116 }