Warning, /network/neochat/src/qml/ImageEditorPage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2020 Carl Schwan <carl@carlschwan.eu>
0002 // SPDX-License-Identifier: BSD-2-Clause
0003 
0004 import QtQuick
0005 import QtQuick.Controls as QQC2
0006 import QtQuick.Layouts
0007 import Qt.labs.platform as Platform
0008 
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.kirigamiaddons.labs.components as KirigamiComponents
0011 import org.kde.kquickimageeditor as KQuickImageEditor
0012 
0013 Kirigami.Page {
0014     id: rootEditorView
0015 
0016     property bool resizing: false;
0017     required property string imagePath
0018 
0019     signal newPathChanged(string newPath);
0020 
0021     title: i18n("Edit")
0022     leftPadding: 0
0023     rightPadding: 0
0024     topPadding: 0
0025     bottomPadding: 0
0026 
0027     function crop() {
0028         const ratioX = editImage.paintedWidth / editImage.nativeWidth;
0029         const ratioY = editImage.paintedHeight / editImage.nativeHeight;
0030         rootEditorView.resizing = false
0031         imageDoc.crop(selectionTool.selectionX / ratioX, selectionTool.selectionY / ratioY, selectionTool.selectionWidth / ratioX, selectionTool.selectionHeight / ratioY);
0032     }
0033 
0034     actions: [
0035         Kirigami.Action {
0036             id: undoAction
0037             text: i18nc("@action:button Undo modification", "Undo")
0038             icon.name: "edit-undo"
0039             onTriggered: imageDoc.undo();
0040             visible: imageDoc.edited
0041         },
0042         Kirigami.Action {
0043             id: okAction
0044             text: i18nc("@action:button Accept image modification", "Accept")
0045             icon.name: "dialog-ok"
0046             onTriggered: {
0047                 let newPath = Platform.StandardPaths.writableLocation(Platform.StandardPaths.CacheLocation) + "/" + (new Date()).getTime() + "." + imagePath.split('.').pop();
0048                 if (imageDoc.saveAs(newPath)) {;
0049                     newPathChanged(newPath);
0050                 } else {
0051                     msg.type = Kirigami.MessageType.Error
0052                     msg.text = i18n("Unable to save file. Check if you have the correct permission to edit the cache directory.")
0053                     msg.visible = true;
0054                 }
0055             }
0056         }
0057     ]
0058 
0059 
0060 
0061     KQuickImageEditor.ImageItem {
0062         id: editImage
0063         // Assigning this to the contentItem and setting the padding causes weird positioning issues
0064         anchors.fill: parent
0065         anchors.margins: Kirigami.Units.gridUnit
0066         fillMode: KQuickImageEditor.ImageItem.PreserveAspectFit
0067         image: imageDoc.image
0068 
0069         Shortcut {
0070             sequence: StandardKey.Undo
0071             onActivated: undoAction.trigger();
0072         }
0073 
0074         Shortcut {
0075             sequences: [StandardKey.Save, "Enter"]
0076             onActivated: saveAction.trigger();
0077         }
0078 
0079         Shortcut {
0080             sequence: StandardKey.SaveAs
0081             onActivated: saveAsAction.trigger();
0082         }
0083 
0084         KQuickImageEditor.ImageDocument {
0085             id: imageDoc
0086             path: rootEditorView.imagePath
0087         }
0088 
0089         KQuickImageEditor.SelectionTool {
0090             id: selectionTool
0091             visible: rootEditorView.resizing
0092             width: editImage.paintedWidth
0093             height: editImage.paintedHeight
0094             x: editImage.horizontalPadding
0095             y: editImage.verticalPadding
0096             KQuickImageEditor.CropBackground {
0097                 anchors.fill: parent
0098                 z: -1
0099                 insideX: selectionTool.selectionX
0100                 insideY: selectionTool.selectionY
0101                 insideWidth: selectionTool.selectionWidth
0102                 insideHeight: selectionTool.selectionHeight
0103             }
0104             Connections {
0105                 target: selectionTool.selectionArea
0106                 function onDoubleClicked() {
0107                     rootEditorView.crop()
0108                 }
0109             }
0110         }
0111         onImageChanged: {
0112             selectionTool.selectionX = 0
0113             selectionTool.selectionY = 0
0114             selectionTool.selectionWidth = Qt.binding(() => selectionTool.width)
0115             selectionTool.selectionHeight = Qt.binding(() => selectionTool.height)
0116         }
0117     }
0118 
0119     header: QQC2.ToolBar {
0120         contentItem: Kirigami.ActionToolBar {
0121             id: actionToolBar
0122             display: QQC2.Button.TextBesideIcon
0123             actions: [
0124                 Kirigami.Action {
0125                     icon.name: rootEditorView.resizing ? "dialog-cancel" : "transform-crop"
0126                     text: rootEditorView.resizing ? i18n("Cancel") : i18nc("@action:button Crop an image", "Crop");
0127                     onTriggered: {
0128                         resizeRectangle.width = editImage.paintedWidth
0129                         resizeRectangle.height = editImage.paintedHeight
0130                         resizeRectangle.x = editImage.horizontalPadding
0131                         resizeRectangle.y = editImage.verticalPadding
0132                         resizeRectangle.insideX = 100
0133                         resizeRectangle.insideY = 100
0134                         resizeRectangle.insideWidth = 100
0135                         resizeRectangle.insideHeight = 100
0136 
0137                         rootEditorView.resizing = !rootEditorView.resizing;
0138                     }
0139                 },
0140                 Kirigami.Action {
0141                     icon.name: "dialog-ok"
0142                     visible: rootEditorView.resizing
0143                     text: i18nc("@action:button Crop an image", "Crop");
0144                     onTriggered: rootEditorView.crop();
0145                 },
0146                 Kirigami.Action {
0147                     icon.name: "object-rotate-left"
0148                     text: i18nc("@action:button Rotate an image to the left", "Rotate left");
0149                     onTriggered: imageDoc.rotate(-90);
0150                     visible: !rootEditorView.resizing
0151                 },
0152                 Kirigami.Action {
0153                     icon.name: "object-rotate-right"
0154                     text: i18nc("@action:button Rotate an image to the right", "Rotate right");
0155                     onTriggered: imageDoc.rotate(90);
0156                     visible: !rootEditorView.resizing
0157                 },
0158                 Kirigami.Action {
0159                     icon.name: "object-flip-vertical"
0160                     text: i18nc("@action:button Mirror an image vertically", "Flip");
0161                     onTriggered: imageDoc.mirror(false, true);
0162                     visible: !rootEditorView.resizing
0163                 },
0164                 Kirigami.Action {
0165                     icon.name: "object-flip-horizontal"
0166                     text: i18nc("@action:button Mirror an image horizontally", "Mirror");
0167                     onTriggered: imageDoc.mirror(true, false);
0168                     visible: !rootEditorView.resizing
0169                 }
0170             ]
0171         }
0172     }
0173 
0174     footer: KirigamiComponents.Banner {
0175         id: msg
0176         type: Kirigami.MessageType.Error
0177         showCloseButton: true
0178         visible: false
0179     }
0180 }