Warning, /office/klevernotes/src/contents/ui/dialogs/imagePickerDialog/ImagePickerDialog.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2023 Louis Schul <schul9louis@gmail.com>
0003
0004 import QtQuick 2.15
0005 import QtQuick.Controls 2.3 as Controls
0006 import QtQuick.Layouts 1.15
0007 import Qt.labs.platform 1.1
0008
0009 import org.kde.kirigami 2.19 as Kirigami
0010 import org.kde.kirigamiaddons.formcard 1.0 as FormCard
0011
0012 import org.kde.Klever 1.0
0013
0014 import "qrc:/contents/ui/dialogs"
0015
0016
0017 Kirigami.Dialog {
0018 id: imagePickerDialog
0019
0020 readonly property Image imageObject: displayImage
0021 readonly property FormCard.FormCheckDelegate storeCheckbox: storeCheckbox
0022 readonly property bool imageLoaded: displayImage.visible
0023 readonly property bool storeImage: storeCheckbox.checked && !storedImageChoosen
0024
0025 property string noteImagesStoringPath
0026 property var paintClipRect
0027 property string path: ""
0028 property alias imageName: nameTextField.text
0029 property bool storedImageChoosen: false
0030 property bool paintedImageChoosen: false
0031 property bool storedImagesExist: !KleverUtility.isEmptyDir(noteImagesStoringPath)
0032
0033 title: i18nc("@title:dialog", "Image selector")
0034
0035 height: header.height + footer.height + topPadding + bottomPadding + mainItem.height
0036
0037 standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
0038
0039 onPathChanged: {
0040 displayImage.source = path
0041 }
0042 onClosed: {
0043 clearTmp()
0044 path = ""
0045 imageName = ""
0046 displayImage.height = undefined
0047 }
0048
0049 FilePickerDialog {
0050 id: filePickerDialog
0051
0052 caller: imagePickerDialog
0053 }
0054
0055 URLDialog {
0056 id: urlDialog
0057
0058 caller: imagePickerDialog
0059 }
0060
0061 // GridLayout was causing to much problem :/
0062 ColumnLayout {
0063 id: mainItem
0064
0065 property int iconSize: imageHolder.visible
0066 ? Kirigami.Units.iconSizes.small
0067 : Kirigami.Units.iconSizes.large
0068
0069 width: Kirigami.Units.iconSizes.huge * 4
0070 spacing: 0
0071
0072 RowLayout {
0073 spacing: 0
0074
0075 Layout.fillWidth: true
0076 Layout.fillHeight: true
0077
0078 ButtonDelegate {
0079 id: internetButton
0080
0081 text: i18nc("@label:button, As in 'image from the internet'", "Web image")
0082 padding: Kirigami.Units.largeSpacing
0083
0084 display: imageHolder.visible
0085 ? Controls.AbstractButton.TextBesideIcon
0086 : Controls.AbstractButton.TextUnderIcon
0087
0088 icon {
0089 name: "internet-amarok"
0090 width: mainItem.iconSize
0091 height: mainItem.iconSize
0092 }
0093
0094 Layout.preferredWidth: Kirigami.Units.iconSizes.huge * 2
0095 Layout.preferredHeight: imageHolder.visible
0096 ? Kirigami.Units.iconSizes.small * 3
0097 : width
0098
0099 onClicked: {
0100 imagePickerDialog.paintClipRect = undefined
0101 clearTmp()
0102 storedImageChoosen = false
0103 urlDialog.open()
0104 }
0105 }
0106
0107 ButtonDelegate {
0108 id: localButton
0109
0110 text: i18nc("label:button, Image from the local file system", "Local image")
0111 display: internetButton.display
0112
0113 icon {
0114 name: "document-open-folder"
0115 width: mainItem.iconSize
0116 height: mainItem.iconSize
0117 }
0118
0119 Layout.preferredWidth: Kirigami.Units.iconSizes.huge * 2
0120 Layout.preferredHeight: internetButton.height
0121
0122 onClicked: {
0123 imagePickerDialog.paintClipRect = undefined
0124 clearTmp()
0125 storedImageChoosen = false
0126 filePickerDialog.folder = StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
0127 filePickerDialog.open()
0128 }
0129 }
0130 }
0131
0132 RowLayout {
0133 spacing: 0
0134
0135 Layout.fillWidth: true
0136 Layout.fillHeight: true
0137
0138 ButtonDelegate {
0139 id: paintingButton
0140
0141 text: i18nc("@label:button", "Paint an image")
0142 display: internetButton.display
0143
0144 icon {
0145 name: "draw-brush"
0146 width: mainItem.iconSize
0147 height: mainItem.iconSize
0148 }
0149
0150 Layout.preferredWidth: storageButton.visible ? Kirigami.Units.iconSizes.huge * 2 : Kirigami.Units.iconSizes.huge * 4
0151 Layout.preferredHeight: internetButton.height
0152
0153 onClicked: {
0154 imagePickerDialog.paintClipRect = undefined
0155 clearTmp()
0156 imagePickerDialog.close()
0157 applicationWindow().switchToPage('Painting')
0158 }
0159 }
0160
0161 ButtonDelegate {
0162 id: storageButton
0163
0164 text: i18nc("@label:button, Collection of image stored inside the note folder", "Image collection")
0165 display: internetButton.display
0166 visible: imagePickerDialog.storedImagesExist
0167
0168 icon {
0169 name: "dblatex"
0170 width: mainItem.iconSize
0171 height: mainItem.iconSize
0172 }
0173
0174 Layout.preferredWidth: visible ? Kirigami.Units.iconSizes.huge * 2 : 0
0175 Layout.preferredHeight: visible ? internetButton.height : 0
0176
0177 onClicked: {
0178 imagePickerDialog.paintClipRect = undefined
0179 clearTmp()
0180 storedImageChoosen = true
0181 filePickerDialog.folder = "file://"+imagePickerDialog.noteImagesStoringPath
0182 filePickerDialog.open()
0183 }
0184 }
0185 }
0186
0187 Kirigami.Separator {
0188 visible: imageHolder.visible
0189 Layout.fillWidth: true
0190 }
0191
0192 Item {
0193 id: imageHolder
0194
0195 visible: imagePickerDialog.path !== ""
0196
0197 Layout.fillWidth: true
0198 Layout.preferredHeight: Kirigami.Units.iconSizes.huge * 3 + Kirigami.Units.largeSpacing
0199 Layout.margins: Kirigami.Units.smallSpacing
0200
0201 Image {
0202 id: displayImage
0203
0204 property int idealWidth
0205 property int idealHeight
0206
0207 anchors.centerIn: parent
0208
0209 source: path
0210 visible: displayImage.status == Image.Ready
0211 fillMode: Image.PreserveAspectFit
0212 sourceClipRect: imagePickerDialog.paintClipRect
0213
0214 onStatusChanged: if (status == Image.Ready){
0215 // If the image is placed inside the note folder, we want it to be max 1024x1024
0216 if (Math.max(implicitWidth, implicitHeight, 1024) == 1024) {
0217 idealWidth = implicitWidth
0218 idealHeight = implicitHeight
0219 } else {
0220 let divider = (implicitHeight > implicitWidth)
0221 ? implicitHeight / 1024
0222 : implicitWidth / 1024
0223
0224 idealWidth = Math.round(implicitWidth / divider)
0225 idealHeight = Math.round(implicitHeight / divider)
0226 }
0227 height = Kirigami.Units.iconSizes.huge * 3
0228 }
0229 }
0230
0231 Text {
0232 padding: Kirigami.Units.largeSpacing
0233 anchors.fill: parent
0234 anchors.centerIn: parent
0235
0236 text: i18n("It appears that the image you selected does not exist or is not supported.")
0237 wrapMode: Text.WordWrap
0238 visible: !displayImage.visible
0239
0240 Kirigami.Theme.colorSet: Kirigami.Theme.View
0241 Kirigami.Theme.inherit: false
0242
0243 color: Kirigami.Theme.textColor
0244 }
0245 }
0246
0247 Kirigami.Separator {
0248 visible: imageHolder.visible
0249 Layout.fillWidth: true
0250 }
0251
0252 FormCard.FormTextFieldDelegate {
0253 id: nameTextField
0254
0255 label: i18nc("@label:textbox, text associated to the selected image", "Image text: ")
0256 maximumLength: 40
0257
0258 Layout.fillWidth: true
0259 }
0260
0261 FormCard.FormCheckDelegate {
0262 id: storeCheckbox
0263
0264 text: i18nc("@label:checkbox", "Place this image inside the note folder")
0265
0266 Layout.fillWidth: true
0267 }
0268 }
0269
0270 function clearTmp() {
0271 if (paintedImageChoosen) {
0272 paintedImageChoosen = false
0273 storeCheckbox.enabled = true
0274 storeCheckbox.checked = false
0275 }
0276 }
0277 }