Warning, /pim/kube/views/todo/qml/View.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  *  Copyright (C) 2017 Michael Bohlender, <michael.bohlender@kdemail.net>
0003  *  Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsys.com>
0004  *
0005  *  This program is free software; you can redistribute it and/or modify
0006  *  it under the terms of the GNU General Public License as published by
0007  *  the Free Software Foundation; either version 2 of the License, or
0008  *  (at your option) any later version.
0009  *
0010  *  This program is distributed in the hope that it will be useful,
0011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0013  *  GNU General Public License for more details.
0014  *
0015  *  You should have received a copy of the GNU General Public License along
0016  *  with this program; if not, write to the Free Software Foundation, Inc.,
0017  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0018  */
0019 
0020 
0021 import QtQuick 2.9
0022 import QtQuick.Controls 1.3 as Controls1
0023 import QtQuick.Controls 2
0024 import QtQuick.Layouts 1.1
0025 
0026 import org.kube.framework 1.0 as Kube
0027 
0028 Kube.View {
0029     id: root
0030     property string currentAccount: Kube.Context.currentAccountId
0031     property var currentFolder: null
0032     property var currentFolderIdentifier: null
0033 
0034     //We have to hardcode because all the mapToItem/mapFromItem functions are garbage
0035     searchArea: Qt.rect(ApplicationWindow.window.sidebarWidth + todoView.parent.x, 0, todoView.parent.width + todoDetails.parent.width, height)
0036 
0037     onRefresh: {
0038         if (!!root.currentFolder) {
0039             Kube.Fabric.postMessage(Kube.Messages.synchronize, {"folder": root.currentFolder});
0040             Kube.Fabric.postMessage(Kube.Messages.synchronize, {"accountId": root.currentAccount, "type": "folder"})
0041         } else {
0042             Kube.Fabric.postMessage(Kube.Messages.synchronize, {"accountId": root.currentAccount})
0043         }
0044     }
0045 
0046     states: [
0047         State {
0048             name: "inbox"
0049             PropertyChanges {target: root; currentFolder: null}
0050             PropertyChanges {target: root; currentFolderIdentifier: null}
0051             StateChangeScript {script: accountSwitcher.clearSelection()}
0052             PropertyChanges {target: todoModel; filter: {
0053                 "account": accountSwitcher.currentAccount,
0054                 "calendars": accountSwitcher.enabledEntities,
0055                 "inbox": true,
0056                 "string": root.filter
0057             }}
0058         },
0059         State {
0060             name: "doing"
0061             PropertyChanges {target: root; currentFolder: null}
0062             PropertyChanges {target: root; currentFolderIdentifier: null}
0063             StateChangeScript {script: accountSwitcher.clearSelection()}
0064             PropertyChanges {target: todoModel; filter: {
0065                 "account": accountSwitcher.currentAccount,
0066                 "calendars": accountSwitcher.enabledEntities,
0067                 "doing": true,
0068                 "string": root.filter
0069             }}
0070         },
0071         State {
0072             name: "all"
0073             PropertyChanges {target: root; currentFolder: null}
0074             PropertyChanges {target: root; currentFolderIdentifier: null}
0075             StateChangeScript {script: accountSwitcher.clearSelection()}
0076             PropertyChanges {target: todoModel; filter: {
0077                 "account": accountSwitcher.currentAccount,
0078                 "calendars": accountSwitcher.enabledEntities,
0079                 "string": root.filter
0080             }}
0081         },
0082         State {
0083             name: "calendar"
0084             PropertyChanges {target: root; currentFolder: accountSwitcher.currentEntity}
0085             PropertyChanges {target: root; currentFolderIdentifier: accountSwitcher.currentEntityIdentifier}
0086             PropertyChanges {target: todoModel; filter: {
0087                 "account": accountSwitcher.currentAccount,
0088                 "calendars": [accountSwitcher.currentEntityIdentifier],
0089                 "string": root.filter
0090             }}
0091         }
0092     ]
0093     state: "doing"
0094 
0095     Kube.Listener {
0096         filter: Kube.Messages.search
0097         onMessageReceived: root.triggerSearch()
0098     }
0099 
0100     helpViewComponent: Kube.HelpPopup {
0101         ListModel {
0102             ListElement { description: qsTr("Go to top of list:"); shortcut: "t" }
0103             ListElement { description: qsTr("Go to bottom of list:"); shortcut: "b" }
0104             ListElement { description: qsTr("Go to next todo:"); shortcut: "j" }
0105             ListElement { description: qsTr("Go to previous todo:"); shortcut: "k" }
0106             ListElement { description: qsTr("Create new todo:"); shortcut: "c" }
0107             ListElement { description: qsTr("Edit todo:"); shortcut: "e" }
0108             ListElement { description: qsTr("Show this help text:"); shortcut: "?" }
0109         }
0110     }
0111     Shortcut {
0112         enabled: root.isCurrentView
0113         sequences: ['t']
0114         onActivated: todoView.currentIndex = 0
0115     }
0116     Shortcut {
0117         enabled: root.isCurrentView
0118         sequences: ['b']
0119         onActivated: todoView.currentIndex = todoView.count - 1
0120     }
0121     Shortcut {
0122         enabled: root.isCurrentView
0123         sequences: ['j']
0124         onActivated: todoView.incrementCurrentIndex()
0125     }
0126     Shortcut {
0127         enabled: root.isCurrentView
0128         sequences: ['k']
0129         onActivated: todoView.decrementCurrentIndex()
0130     }
0131     Shortcut {
0132         enabled: root.isCurrentView
0133         sequences: ['c']
0134         onActivated: editorPopup.createObject(root, {}).open()
0135     }
0136     Shortcut {
0137         enabled: root.isCurrentView
0138         sequences: ['e']
0139         onActivated: todoDetails.edit()
0140     }
0141     Shortcut {
0142         enabled: root.isCurrentView
0143         sequence: "?"
0144         onActivated: root.showHelp()
0145     }
0146 
0147     Kube.Listener {
0148         filter: Kube.Messages.todoEditor
0149         onMessageReceived: editorPopup.createObject(root, message).open()
0150     }
0151 
0152     ButtonGroup { id: viewButtonGroup }
0153 
0154     Controls1.SplitView {
0155         Layout.fillWidth: true
0156         Layout.fillHeight: true
0157 
0158         Kube.LeftSidebar {
0159             Layout.fillHeight: parent.height
0160             buttons: [
0161                 Kube.PositiveButton {
0162                     id: newMailButton
0163                     objectName: "newMailButton"
0164 
0165                     Layout.fillWidth: true
0166                     focus: true
0167                     text: qsTr("New Todo")
0168                     onClicked: editorPopup.createObject(root, {}).open()
0169                 },
0170 
0171                 ColumnLayout {
0172                     Kube.TextButton {
0173                         id: inboxViewButton
0174                         Layout.fillWidth: true
0175                         text: qsTr("Inbox")
0176                         textColor: Kube.Colors.highlightedTextColor
0177                         checkable: true
0178                         checked: root.state == "inbox"
0179                         horizontalAlignment: Text.AlignHLeft
0180                         ButtonGroup.group: viewButtonGroup
0181                         onClicked: root.state = "inbox"
0182                     }
0183                     Kube.TextButton {
0184                         id: doingViewButton
0185                         Layout.fillWidth: true
0186                         text: qsTr("Doing")
0187                         textColor: Kube.Colors.highlightedTextColor
0188                         checkable: true
0189                         checked: root.state == "doing"
0190                         horizontalAlignment: Text.AlignHLeft
0191                         ButtonGroup.group: viewButtonGroup
0192                         onClicked: root.state = "doing"
0193                     }
0194                     Kube.TextButton {
0195                         id: allViewButton
0196                         Layout.fillWidth: true
0197                         text: qsTr("All")
0198                         textColor: Kube.Colors.highlightedTextColor
0199                         checkable: true
0200                         checked: root.state == "all"
0201                         horizontalAlignment: Text.AlignHLeft
0202                         ButtonGroup.group: viewButtonGroup
0203                         onClicked: root.state = "all"
0204                     }
0205                 }
0206             ]
0207 
0208             Kube.CalendarSelector {
0209                 id: accountSwitcher
0210                 Layout.fillWidth: true
0211                 Layout.fillHeight: true
0212                 activeFocusOnTab: true
0213                 selectionEnabled: true
0214                 contentType: "todo"
0215                 onCurrentEntityChanged: {
0216                     if (currentEntity) {
0217                         root.state = "calendar"
0218                     }
0219                 }
0220             }
0221         }
0222         Kube.ListView {
0223             id: todoView
0224             Layout.fillHeight: true
0225             Layout.minimumWidth: Kube.Units.gridUnit * 10
0226 
0227             onCurrentItemChanged: {
0228                 if (currentItem) {
0229                     var currentData = currentItem.currentData;
0230                     todoDetails.controller = controllerComponent.createObject(parent, {"todo": currentData.domainObject})
0231                 }
0232             }
0233 
0234             Keys.onPressed: {
0235                 //Not implemented as a shortcut because we want it only to apply if we have the focus
0236                 if (event.text == "d" || event.key == Qt.Key_Delete) {
0237                     todoDetails.controller.remove()
0238                 } else if (event.key == Qt.Key_Return) {
0239                     todoDetails.controller.complete = !todoDetails.controller.complete;
0240                     todoDetails.controller.saveAction.execute();
0241                 } else if (event.key == Qt.Key_Home) {
0242                     todoView.currentIndex = 0
0243                 }
0244             }
0245 
0246             Column {
0247                 anchors.centerIn: parent
0248                 visible: todoView.count === 0
0249                 Kube.Label {
0250                     text: qsTr("Nothing here yet...")
0251                 }
0252                 Kube.PositiveButton {
0253                     visible: doingViewButton.checked
0254                     text: qsTr("Pick some tasks")
0255                     onClicked: {
0256                         allViewButton.checked = true
0257                         allViewButton.clicked()
0258                     }
0259                 }
0260                 Kube.PositiveButton {
0261                     visible: allViewButton.checked
0262                     text: qsTr("Add a new task")
0263                     onClicked: editorPopup.createObject(root, {}).open()
0264                 }
0265             }
0266 
0267             model: Kube.TodoModel {
0268                 id: todoModel
0269             }
0270 
0271             footerPositioning: ListView.OverlayFooter
0272             footer: Rectangle {
0273                 property int taskLimit: 5
0274                 visible: doingViewButton.checked && todoView.count > taskLimit
0275                 color: Kube.Colors.warningColor
0276                 height: Kube.Units.gridUnit * 2
0277                 width: parent. width
0278                 Label {
0279                     anchors.centerIn: parent
0280                     text: qsTr("This list is longer than %1 tasks. Focus on the top %1?").arg(taskLimit)
0281                 }
0282             }
0283 
0284             delegate: Kube.TodoListDelegate {
0285                 summary: model.summary
0286                 complete: model.complete
0287                 doing: model.doing
0288                 important: model.important
0289                 calendar: model.calendar
0290                 date: model.date
0291                 dueDate: model.dueDate
0292                 domainObject: model.domainObject
0293                 dotColor: model.color
0294                 bold: model.doing && root.state != "doing"
0295 
0296                 currentDate: Kube.Context.currentDate
0297             }
0298         }
0299         Rectangle {
0300             Layout.fillHeight: parent.height
0301             Layout.fillWidth: true
0302 
0303             color: Kube.Colors.paperWhite
0304 
0305             TodoEditor {
0306                 id: todoDetails
0307                 anchors.fill: parent
0308                 editMode: true
0309                 // onDone: popup.close()
0310             }
0311         }
0312         Component {
0313             id: controllerComponent
0314             Kube.TodoController {
0315             }
0316         }
0317 
0318     }
0319 
0320     Component {
0321         id: editorPopup
0322         Kube.Popup {
0323             id: popup
0324 
0325             property alias parentUid: editor.parentUid
0326 
0327             x: root.width * 0.15
0328             y: root.height * 0.15
0329 
0330             width: root.width * 0.7
0331             height: root.height * 0.7
0332             padding: 0
0333             closePolicy: Popup.NoAutoClose
0334             Rectangle {
0335                 anchors.fill: parent
0336                 color: Kube.Colors.paperWhite
0337                 TodoEditor {
0338                     id: editor
0339                     focus: true
0340                     anchors.fill: parent
0341                     accountId: root.currentAccount
0342                     currentFolder: root.currentFolderIdentifier
0343                     doing: doingViewButton.checked
0344                     onDone: popup.close()
0345                 }
0346             }
0347         }
0348     }
0349 
0350 }