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 }