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 KQuickImageEditor.ImageItem {
0060 id: editImage
0061 // Assigning this to the contentItem and setting the padding causes weird positioning issues
0062 anchors.fill: parent
0063 anchors.margins: Kirigami.Units.gridUnit
0064 fillMode: KQuickImageEditor.ImageItem.PreserveAspectFit
0065 image: imageDoc.image
0066
0067 Shortcut {
0068 sequence: StandardKey.Undo
0069 onActivated: undoAction.trigger()
0070 }
0071
0072 Shortcut {
0073 sequences: [StandardKey.Save, "Enter"]
0074 onActivated: saveAction.trigger()
0075 }
0076
0077 Shortcut {
0078 sequence: StandardKey.SaveAs
0079 onActivated: saveAsAction.trigger()
0080 }
0081
0082 KQuickImageEditor.ImageDocument {
0083 id: imageDoc
0084 path: rootEditorView.imagePath
0085 }
0086
0087 KQuickImageEditor.SelectionTool {
0088 id: selectionTool
0089 visible: rootEditorView.resizing
0090 width: editImage.paintedWidth
0091 height: editImage.paintedHeight
0092 x: editImage.horizontalPadding
0093 y: editImage.verticalPadding
0094 KQuickImageEditor.CropBackground {
0095 anchors.fill: parent
0096 z: -1
0097 insideX: selectionTool.selectionX
0098 insideY: selectionTool.selectionY
0099 insideWidth: selectionTool.selectionWidth
0100 insideHeight: selectionTool.selectionHeight
0101 }
0102 Connections {
0103 target: selectionTool.selectionArea
0104 function onDoubleClicked() {
0105 rootEditorView.crop();
0106 }
0107 }
0108 }
0109 onImageChanged: {
0110 selectionTool.selectionX = 0;
0111 selectionTool.selectionY = 0;
0112 selectionTool.selectionWidth = Qt.binding(() => selectionTool.width);
0113 selectionTool.selectionHeight = Qt.binding(() => selectionTool.height);
0114 }
0115 }
0116
0117 header: QQC2.ToolBar {
0118 contentItem: Kirigami.ActionToolBar {
0119 id: actionToolBar
0120 display: QQC2.Button.TextBesideIcon
0121 actions: [
0122 Kirigami.Action {
0123 icon.name: rootEditorView.resizing ? "dialog-cancel" : "transform-crop"
0124 text: rootEditorView.resizing ? i18n("Cancel") : i18nc("@action:button Crop an image", "Crop")
0125 onTriggered: {
0126 resizeRectangle.width = editImage.paintedWidth;
0127 resizeRectangle.height = editImage.paintedHeight;
0128 resizeRectangle.x = editImage.horizontalPadding;
0129 resizeRectangle.y = editImage.verticalPadding;
0130 resizeRectangle.insideX = 100;
0131 resizeRectangle.insideY = 100;
0132 resizeRectangle.insideWidth = 100;
0133 resizeRectangle.insideHeight = 100;
0134 rootEditorView.resizing = !rootEditorView.resizing;
0135 }
0136 },
0137 Kirigami.Action {
0138 icon.name: "dialog-ok"
0139 visible: rootEditorView.resizing
0140 text: i18nc("@action:button Crop an image", "Crop")
0141 onTriggered: rootEditorView.crop()
0142 },
0143 Kirigami.Action {
0144 icon.name: "object-rotate-left"
0145 text: i18nc("@action:button Rotate an image to the left", "Rotate left")
0146 onTriggered: imageDoc.rotate(-90)
0147 visible: !rootEditorView.resizing
0148 },
0149 Kirigami.Action {
0150 icon.name: "object-rotate-right"
0151 text: i18nc("@action:button Rotate an image to the right", "Rotate right")
0152 onTriggered: imageDoc.rotate(90)
0153 visible: !rootEditorView.resizing
0154 },
0155 Kirigami.Action {
0156 icon.name: "object-flip-vertical"
0157 text: i18nc("@action:button Mirror an image vertically", "Flip")
0158 onTriggered: imageDoc.mirror(false, true)
0159 visible: !rootEditorView.resizing
0160 },
0161 Kirigami.Action {
0162 icon.name: "object-flip-horizontal"
0163 text: i18nc("@action:button Mirror an image horizontally", "Mirror")
0164 onTriggered: imageDoc.mirror(true, false)
0165 visible: !rootEditorView.resizing
0166 }
0167 ]
0168 }
0169 }
0170
0171 footer: KirigamiComponents.Banner {
0172 id: msg
0173 type: Kirigami.MessageType.Error
0174 showCloseButton: true
0175 visible: false
0176 }
0177 }