174 lines
5.1 KiB
QML
174 lines
5.1 KiB
QML
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import QtQuick.LocalStorage
|
|
|
|
Page {
|
|
id: root
|
|
|
|
header: Label {
|
|
text: qsTr("Projects")
|
|
font.pointSize: AppSettings.fontSize + 20
|
|
font.styleName: "Semibold"
|
|
leftPadding: 30
|
|
topPadding: 20
|
|
bottomPadding: 20
|
|
}
|
|
|
|
ListView {
|
|
id: projectListView
|
|
anchors.fill: parent
|
|
clip: true
|
|
|
|
model: ListModel {
|
|
id: projectsModel
|
|
|
|
Component.onCompleted: {
|
|
let projects = Database.getProjects()
|
|
for (let project of projects)
|
|
append(project)
|
|
}
|
|
}
|
|
|
|
delegate: SwipeDelegate {
|
|
id: projectDelegate
|
|
width: ListView.view.width
|
|
height: projectContent.implicitHeight
|
|
|
|
required property int index
|
|
required property int projectId
|
|
required property string projectName
|
|
required property int completedTasks
|
|
required property int totalTasks
|
|
|
|
swipe.right: Rectangle {
|
|
width: 50
|
|
height: parent.height
|
|
color: "red"
|
|
anchors.right: parent.right
|
|
|
|
SwipeDelegate.onClicked: {
|
|
Database.deleteProject(projectDelegate.projectId)
|
|
projectsModel.remove(projectDelegate.index, 1)
|
|
}
|
|
|
|
Image {
|
|
source: Qt.styleHints.colorScheme === Qt.Dark ? "images/close-white.png"
|
|
: "images/close.png"
|
|
width: 20
|
|
height: 20
|
|
anchors.centerIn: parent
|
|
}
|
|
}
|
|
|
|
Column {
|
|
id: projectContent
|
|
topPadding: 8
|
|
bottomPadding: 10
|
|
leftPadding: 30
|
|
|
|
Label {
|
|
text: completedTasks + " / " + totalTasks
|
|
font.pointSize: AppSettings.fontSize
|
|
}
|
|
|
|
Label {
|
|
id: project
|
|
text: projectName
|
|
font.pointSize: AppSettings.fontSize
|
|
font.styleName: "Semibold"
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: projectDelegate
|
|
function onClicked() {
|
|
let project = projectsModel.get(index)
|
|
root.StackView.view.push("ProjectPage.qml", {
|
|
"projectsModel": projectsModel,
|
|
"projectId": project.projectId,
|
|
"projectName": project.projectName,
|
|
"projectIndex": index,
|
|
"projectNote": project.projectNote,
|
|
"completedTasks": project.completedTasks,
|
|
"totalTasks": project.totalTasks
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Popup {
|
|
id: newProjectPopup
|
|
anchors.centerIn: parent
|
|
height: 200
|
|
modal: true
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
|
|
Label {
|
|
text: qsTr("Project Name")
|
|
font.pointSize: AppSettings.fontSize + 2.0
|
|
font.bold: true
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
}
|
|
|
|
TextField {
|
|
id: newProjectTextField
|
|
placeholderText: qsTr("Enter project name")
|
|
font.pointSize: AppSettings.fontSize
|
|
|
|
Layout.fillWidth: true
|
|
Layout.leftMargin: 10
|
|
Layout.rightMargin: 10
|
|
|
|
Keys.onReturnPressed: {
|
|
if (createProjectButton.enabled)
|
|
createProjectButton.clicked()
|
|
}
|
|
}
|
|
|
|
Button {
|
|
id: createProjectButton
|
|
text: qsTr("Create project")
|
|
flat: true
|
|
font.pointSize: AppSettings.fontSize
|
|
enabled: newProjectTextField.length > 0
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
Layout.fillWidth: false
|
|
|
|
onClicked: {
|
|
let results = Database.newProject(newProjectTextField.text)
|
|
projectsModel.append({
|
|
projectId: parseInt(results.insertId),
|
|
projectName: newProjectTextField.text,
|
|
totalTasks: 0,
|
|
completedTasks: 0,
|
|
projectNote: ""
|
|
})
|
|
newProjectTextField.text = ""
|
|
newProjectPopup.close()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
footer: ToolBar {
|
|
ToolButton {
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: 5
|
|
text: qsTr("New project")
|
|
font.pointSize: AppSettings.fontSize - 2
|
|
icon.source: "images/add-new.png"
|
|
|
|
onClicked: newProjectPopup.open()
|
|
}
|
|
}
|
|
}
|