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 }