aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quickcontrols2/ios/todolist/ProjectPage.qml
diff options
context:
space:
mode:
Diffstat (limited to 'examples/quickcontrols2/ios/todolist/ProjectPage.qml')
-rw-r--r--examples/quickcontrols2/ios/todolist/ProjectPage.qml239
1 files changed, 239 insertions, 0 deletions
diff --git a/examples/quickcontrols2/ios/todolist/ProjectPage.qml b/examples/quickcontrols2/ios/todolist/ProjectPage.qml
new file mode 100644
index 0000000000..ca86ea521a
--- /dev/null
+++ b/examples/quickcontrols2/ios/todolist/ProjectPage.qml
@@ -0,0 +1,239 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtQuick.Controls.iOS
+
+Page {
+ id: root
+
+ required property int projectIndex
+ required property int projectId
+ required property string projectName
+ required property string projectNote
+
+ required property int completedTasks
+ required property int totalTasks
+
+ required property ListModel projectsModel
+
+ header: ColumnLayout {
+ id: titleRow
+ spacing: 4
+
+ TextField {
+ id: projectNameLabel
+ Layout.fillWidth: true
+ text: root.projectName
+ font.pointSize: AppSettings.fontSize + 10
+ font.styleName: "Bold"
+ padding: 0
+ background: null
+ wrapMode: TextField.Wrap
+
+ Layout.topMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+
+ onEditingFinished: {
+ Database.updateProjectName(root.projectId, text)
+ projectsModel.setProperty(projectIndex, "projectName", projectNameLabel.text)
+ }
+ }
+
+ Label {
+ text: root.completedTasks + " / " + root.totalTasks
+ Layout.leftMargin: 20
+ }
+
+ ProgressBar {
+ id: progressBar
+ from: 0
+ value: root.completedTasks
+ to: root.totalTasks
+ Layout.leftMargin: 20
+ }
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ TextArea {
+ id: textArea
+ leftPadding: 15
+ rightPadding: 15
+ bottomPadding: 10
+ topPadding: 10
+ font.pointSize: AppSettings.fontSize
+ placeholderText: qsTr("Write a note...")
+ text: root.projectNote
+ wrapMode: TextArea.Wrap
+
+ Layout.fillWidth: true
+ Layout.preferredHeight: 80
+ Layout.topMargin: 20
+
+ onEditingFinished: {
+ Database.updateProjectNote(root.projectId, text)
+ projectsModel.setProperty(projectIndex, "projectNote", textArea.text)
+ }
+ }
+
+ ListView {
+ id: taskListView
+ model: taskModel
+ clip: true
+
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.topMargin: 20
+
+ ListModel {
+ id: taskModel
+
+ Component.onCompleted: {
+ let tasks = Database.getTaskByProject(projectId)
+ for (let task of tasks)
+ append(task)
+ }
+ }
+
+ delegate: CheckDelegate {
+ id: taskList
+ width: taskListView.width
+ height: visible ? 40 : 0
+ checked: done
+ visible: !done || (done && AppSettings.showDoneTasks)
+
+ required property bool done
+ required property int taskId
+ required property string taskName
+ required property int index
+
+ onClicked: {
+ Database.updateDoneState(taskId, checked ? 1 : 0)
+ taskModel.setProperty(index, "done", checked)
+ root.completedTasks = Math.max(Database.countDoneTasksByProject(root.projectId).rows.length, 0)
+ root.totalTasks = Math.max(Database.countTaskByProject(root.projectId).rows.length, 0)
+ root.projectsModel.setProperty(projectIndex, "completedTasks", root.completedTasks)
+ }
+
+ TextField {
+ id: taskNameLabel
+ text: taskList.taskName
+ anchors.left: deleteTaskButton.right
+ anchors.leftMargin: 10
+ padding: 0
+ font.pointSize: AppSettings.fontSize
+ anchors.verticalCenter: parent.verticalCenter
+ background: null
+
+ onEditingFinished: {
+ Database.updateTaskName(taskList.taskId, taskNameLabel.text)
+ taskModel.setProperty(index, "taskName", taskNameLabel.text)
+ }
+ }
+
+ Button {
+ id: deleteTaskButton
+ anchors.left: parent.left
+ width: 15
+ height: 15
+ flat: true
+ topPadding: 0
+ bottomPadding: 0
+ rightPadding: 0
+ leftPadding: 0
+ anchors.leftMargin: 10
+ anchors.verticalCenter: parent.verticalCenter
+ icon.source: "images/close.png"
+ icon.color: IOS.theme === IOS.Dark ? "white" : "black"
+
+ onClicked: {
+ Database.deleteTask(taskList.taskId)
+ taskModel.remove(index, 1)
+ root.totalTasks--
+ if (taskList.done)
+ root.completedTasks--
+ }
+ }
+ }
+ }
+
+ Popup {
+ id: addTaskPopup
+ parent: root
+ anchors.centerIn: parent
+ height: 200
+ modal: true
+ focus: true
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ Label {
+ text: qsTr("Add New Task")
+ font.pointSize: AppSettings.fontSize + 2.0
+ font.bold: true
+
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ TextField {
+ id: newTaskNameTextField
+ placeholderText: qsTr("Enter task name")
+ font.pointSize: AppSettings.fontSize
+
+ Layout.fillWidth: true
+ Layout.leftMargin: 10
+ Layout.rightMargin: 10
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ Button {
+ text: qsTr("Add task")
+ flat: true
+ font.pointSize: AppSettings.fontSize
+ enabled: newTaskNameTextField.length > 0
+
+ Layout.alignment: Qt.AlignHCenter
+
+ onClicked: {
+ const result = Database.newTask(root.projectId, newTaskNameTextField.text)
+ taskModel.append({
+ "taskId": parseInt(result.insertId),
+ "taskName": newTaskNameTextField.text, "done": false
+ })
+ root.projectsModel.setProperty(projectIndex, "totalTasks", taskListView.count)
+ newTaskNameTextField.text = ""
+ root.totalTasks++
+ addTaskPopup.close()
+ }
+ }
+ }
+ }
+
+ Label {
+ text: qsTr("Task limit reached.")
+ Layout.alignment: Qt.AlignHCenter
+ Layout.bottomMargin: 20
+ font.pointSize: AppSettings.fontSize
+ visible: taskListView.count >= AppSettings.maxTasks
+ }
+ }
+
+ footer: ToolBar {
+ ToolButton {
+ anchors.right: parent.right
+ anchors.rightMargin: 5
+ text: qsTr("New task")
+ font.pointSize: AppSettings.fontSize - 2
+ icon.source: "images/add-new.png"
+ enabled: taskListView.count < AppSettings.maxTasks
+
+ onClicked: addTaskPopup.open()
+ }
+ }
+}