Warning, /utilities/powerplant/src/contents/ui/PlantEditorPage.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2023 Mathis <mbb@kaidan.im>
0003
0004 import QtQuick 2.15
0005 import QtQuick.Controls 2.15 as Controls
0006 import QtQuick.Layouts 1.15
0007 import org.kde.kirigami 2.19 as Kirigami
0008 import org.kde.kirigamiaddons.formcard 1.0 as FormCard
0009 import QtGraphicalEffects 1.0
0010 import Qt.labs.platform 1.1
0011 import org.kde.kirigamiaddons.dateandtime 0.1 as KirigamiDateTime
0012
0013 import "components"
0014
0015 import org.kde.powerplant 1.0
0016
0017 FormCard.FormCardPage {
0018 id: root
0019
0020 required property PlantsModel plantsModel
0021 property int waterInterval: 2
0022 required property int mode
0023 property int plantId: -1
0024
0025 readonly property PlantEditor plantEditor: PlantEditor {
0026 plantId: root.plantId
0027 mode: root.mode
0028 plantsModel: root.plantsModel
0029 }
0030
0031 title: mode === PlantEditor.Creator ? i18n("Add Plant") : i18n("Edit %1", plantEditor.plant.name)
0032
0033 FormCard.FormCard {
0034 FormCard.AbstractFormDelegate {
0035 background: null
0036 contentItem: ColumnLayout {
0037 clip: true
0038 Controls.Label {
0039 text: i18n("Image:")
0040 }
0041
0042 ListView {
0043 id: imageView
0044
0045 Layout.preferredHeight: Kirigami.Units.gridUnit * 10
0046 Layout.fillWidth: true
0047 onCurrentIndexChanged: if (currentIndex >= 0) {
0048 plantEditor.plant.imgUrl = currentItem.url
0049 }
0050 currentIndex: -1
0051
0052 Connections {
0053 target: plantEditor.plant
0054 function onImgUrlChanged() {
0055 plantImageModel.customImage = plantEditor.plant.imgUrl;
0056 imageView.currentIndex = plantImageModel.urlToIndex(plantEditor.plant.imgUrl);
0057 }
0058 }
0059
0060 orientation: ListView.Horizontal
0061
0062 header: Item {
0063 width: 120
0064 height: ListView.view.height
0065
0066 ActionButton {
0067 anchors.centerIn: parent
0068 icon.name: "list-add"
0069 text: i18n("Use custom image")
0070 onClicked: fileDialog.open()
0071 }
0072
0073 FileDialog {
0074 id: fileDialog
0075 title: i18n("Please choose a file")
0076 folder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
0077 onAccepted: {
0078 plantImageModel.customImage = file;
0079
0080 // Hack force refresh
0081 imageView.currentIndex = -1;
0082 imageView.currentIndex = 0;
0083 }
0084
0085 nameFilters: [i18nc("Name filter for image files", "Image files (*.png *.jpg* *.webp)")]
0086 }
0087 }
0088
0089 model: PlantImageModel {
0090 id: plantImageModel
0091 }
0092
0093 delegate: Controls.ItemDelegate {
0094 id: imageDelegate
0095
0096 required property string index
0097 required property string url
0098
0099 y: 2
0100
0101 height: ListView.view.height
0102 width: ListView.view.height
0103
0104 onClicked: imageView.currentIndex = index
0105
0106 background: RadialGradient {
0107 visible: imageDelegate.ListView.isCurrentItem
0108
0109 gradient: Gradient {
0110 GradientStop {
0111 position: 0.0
0112 color: Kirigami.ColorUtils.tintWithAlpha(
0113 Kirigami.Theme.backgroundColor,
0114 healthSlider.healthColor,
0115 0.5
0116 )
0117 }
0118 GradientStop {
0119 position: 0.5
0120 color: Kirigami.Theme.backgroundColor
0121 }
0122 }
0123 }
0124
0125 Image {
0126 id: image
0127 anchors.fill: parent
0128 fillMode: Image.PreserveAspectFit
0129 source: parent.url
0130 layer {
0131 enabled: true
0132 effect: OpacityMask {
0133 maskSource: mask
0134 }
0135 }
0136 }
0137 Rectangle {
0138 id: mask
0139 anchors.fill: parent
0140 visible: false
0141 gradient: Gradient {
0142 GradientStop {
0143 position: 0.5
0144 color: "white"
0145 }
0146 GradientStop {
0147 position: 0.75
0148 color: "transparent"
0149 }
0150 }
0151 }
0152 }
0153 }
0154 }
0155 }
0156
0157 FormCard.FormDelegateSeparator {}
0158
0159 FormCard.FormTextFieldDelegate {
0160 label: i18n("Name")
0161 text: plantEditor.plant.name
0162 onTextChanged: plantEditor.plant.name = text
0163 }
0164
0165 FormCard.FormDelegateSeparator {}
0166
0167 FormCard.FormTextFieldDelegate {
0168 label: i18n("Species")
0169 text: plantEditor.plant.species
0170 onTextChanged: plantEditor.plant.species = text
0171 }
0172
0173 FormCard.FormDelegateSeparator {}
0174
0175 FormCard.FormTextFieldDelegate {
0176 label: i18n("Room")
0177 text: plantEditor.plant.location
0178 onTextChanged: plantEditor.plant.location = text
0179 }
0180
0181 FormCard.FormDelegateSeparator {}
0182
0183 FormCard.AbstractFormDelegate {
0184 id: interval
0185 background: null
0186 contentItem: ColumnLayout {
0187 Controls.Label {
0188 text: i18n("How often does the plant need Watering?")
0189 }
0190 Controls.ButtonGroup {
0191 id: buttonGroup
0192 }
0193
0194 RowLayout {
0195 id: row
0196
0197 Layout.fillHeight: true
0198 Layout.fillWidth: true
0199 spacing: Kirigami.Units.smallSpacing
0200
0201 Controls.Button {
0202 text: i18n("2 days")
0203 checkable: true
0204 Controls.ButtonGroup.group: buttonGroup
0205 Layout.fillWidth: true
0206 onClicked: plantEditor.plant.waterIntervall = 2
0207 }
0208
0209 Controls.Button {
0210 text: i18n("5 days")
0211 checkable: true
0212 Controls.ButtonGroup.group: buttonGroup
0213 Layout.fillWidth: true
0214 onClicked: plantEditor.plant.waterIntervall = 5
0215 }
0216
0217 Controls.Button {
0218 text: i18n("weekly")
0219 checkable: true
0220 Controls.ButtonGroup.group: buttonGroup
0221 Layout.fillWidth: true
0222 onClicked: plantEditor.plant.waterIntervall = 7
0223 }
0224
0225 Controls.Button {
0226 id: buttonWeeks
0227 text: i18n("2 weeks")
0228 checkable: true
0229 Controls.ButtonGroup.group: buttonGroup
0230 Layout.fillWidth: true
0231 onClicked: plantEditor.plant.waterIntervall = 14
0232 }
0233 }
0234
0235 RowLayout {
0236 Layout.fillWidth: true
0237 Layout.fillHeight: true
0238
0239 Controls.Label {
0240 text: i18n("Custom:")
0241 }
0242
0243 Controls.SpinBox {
0244 onValueChanged: plantEditor.plant.waterIntervall = value
0245 value: plantEditor.plant.waterIntervall
0246 Layout.fillWidth: true
0247 }
0248 }
0249 }
0250 }
0251
0252 FormCard.FormDelegateSeparator {
0253 visible: root.mode === PlantEditor.Creator
0254 }
0255
0256 FormCard.AbstractFormDelegate {
0257 id: health
0258 visible: root.mode === PlantEditor.Creator
0259 background: null
0260 contentItem: ColumnLayout {
0261 Controls.Label {
0262 text: i18n("How healthy is your plant at the moment?")
0263 }
0264
0265 HealthSlider {
0266 id: healthSlider
0267 Layout.fillWidth: true
0268 Layout.alignment: Qt.AlignHCenter
0269 Layout.maximumWidth: 200
0270 from: 0
0271 to: 100
0272 onValueChanged: plantEditor.plant.currentHealth = value
0273 }
0274 }
0275 }
0276
0277 FormCard.FormDelegateSeparator {}
0278
0279 FormCard.AbstractFormDelegate{
0280 background: null
0281 contentItem: ColumnLayout{
0282 Controls.Label {
0283 text: i18n("Birthday")
0284 Layout.fillWidth: true
0285 }
0286
0287 KirigamiDateTime.DateInput {
0288 id: birthday
0289 // selectedDate: plantEditor.plant.dateOfBirth
0290 onSelectedDateChanged: {
0291 console.log(selectedDate)
0292 plantEditor.plant.dateOfBirth = selectedDate
0293 }
0294 }
0295 }
0296 }
0297 }
0298
0299 footer: Controls.ToolBar {
0300 contentItem: RowLayout {
0301 Item {
0302 Layout.fillWidth: true
0303 }
0304
0305 Controls.Button {
0306 text: plantEditor.mode === PlantEditor.Editor ? i18n("Edit") : i18n("Add")
0307 icon.name: plantEditor.mode === PlantEditor.Editor ? "document-edit" : "list-add"
0308 onClicked: {
0309 plantEditor.save();
0310 root.closeDialog()
0311 }
0312 }
0313 }
0314 }
0315 }