Warning, /graphics/spectacle/src/Gui/Annotations/ResizeHandles.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2022 Marco Martin <mart@kde.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 import QtQuick 0008 import org.kde.kirigami as Kirigami 0009 import org.kde.spectacle.private 0010 import ".." 0011 0012 AnimatedLoader { 0013 id: root 0014 required property AnnotationViewport viewport 0015 readonly property AnnotationDocument document: viewport.document 0016 readonly property bool shouldShow: enabled 0017 && document.tool.type === AnnotationTool.SelectTool 0018 && document.selectedItem.hasSelection 0019 && (document.selectedItem.options & AnnotationTool.TextOption) === 0 0020 property bool dragging: false 0021 0022 state: shouldShow ? "active" : "inactive" 0023 0024 sourceComponent: Item { 0025 id: resizeHandles 0026 readonly property bool dragging: tlHandle.active || tHandle.active || trHandle.active 0027 || lHandle.active || rHandle.active 0028 || blHandle.active || bHandle.active || brHandle.active 0029 0030 LayoutMirroring.enabled: false 0031 LayoutMirroring.childrenInherit: true 0032 0033 focus: true 0034 0035 Binding { 0036 target: root 0037 property: "dragging" 0038 value: resizeHandles.dragging 0039 when: root.shouldShow 0040 restoreMode: Binding.RestoreNone 0041 } 0042 0043 // These have to be set here to avoid having a (0,0,0,0) rect. 0044 Binding { 0045 target: root 0046 property: "x" 0047 value: root.document.selectedItem.mousePath.boundingRect.x 0048 when: root.shouldShow 0049 restoreMode: Binding.RestoreNone 0050 } 0051 Binding { 0052 target: root 0053 property: "y" 0054 value: root.document.selectedItem.mousePath.boundingRect.y 0055 when: root.shouldShow 0056 restoreMode: Binding.RestoreNone 0057 } 0058 Binding { 0059 target: root 0060 property: "width" 0061 value: root.document.selectedItem.mousePath.boundingRect.width 0062 when: root.shouldShow 0063 restoreMode: Binding.RestoreNone 0064 } 0065 Binding { 0066 target: root 0067 property: "height" 0068 value: root.document.selectedItem.mousePath.boundingRect.height 0069 when: root.shouldShow 0070 restoreMode: Binding.RestoreNone 0071 } 0072 0073 SelectionBackground { 0074 id: outline 0075 svgPath: root.document.selectedItem.mousePath.svgPath 0076 zoom: root.viewport.effectiveZoom 0077 pathScale: Qt.size((root.width + effectiveStrokeWidth) / root.width, 0078 (root.height + effectiveStrokeWidth) / root.height) 0079 x: -startX - boundingRect.x 0080 y: -startY - boundingRect.y 0081 width: boundingRect.width 0082 height: boundingRect.height 0083 containsMode: SelectionBackground.FillContains 0084 HoverHandler { 0085 cursorShape: Qt.SizeAllCursor 0086 } 0087 } 0088 0089 component ResizeHandle: Handle { 0090 id: handle 0091 property int edges 0092 readonly property alias active: dragHandler.active 0093 0094 implicitWidth: Kirigami.Units.gridUnit + Kirigami.Units.gridUnit % 2 0095 implicitHeight: Kirigami.Units.gridUnit + Kirigami.Units.gridUnit % 2 0096 visible: root.document.selectedItem.hasSelection 0097 && (root.document.selectedItem.options & AnnotationTool.NumberOption) === 0 0098 enabled: visible 0099 0100 HoverHandler { 0101 margin: dragHandler.margin 0102 cursorShape: { 0103 if (enabled) { 0104 if (handle.edges === (Qt.LeftEdge | Qt.TopEdge) 0105 || handle.edges === (Qt.RightEdge | Qt.BottomEdge)) { 0106 return Qt.SizeFDiagCursor; 0107 } else if (handle.edges === Qt.LeftEdge 0108 || handle.edges === Qt.RightEdge) { 0109 return Qt.SizeHorCursor; 0110 } else if (handle.edges === (Qt.LeftEdge | Qt.BottomEdge) 0111 || handle.edges === (Qt.RightEdge | Qt.TopEdge)) { 0112 return Qt.SizeBDiagCursor; 0113 } else if (handle.edges === Qt.TopEdge 0114 || handle.edges === Qt.BottomEdge) { 0115 return Qt.SizeVerCursor; 0116 } 0117 } else { 0118 return undefined 0119 } 0120 } 0121 } 0122 DragHandler { 0123 id: dragHandler 0124 margin: Math.min(root.width, root.height) < 12 ? 0 : 4 0125 target: null 0126 dragThreshold: 0 0127 onActiveTranslationChanged: if (active) { 0128 let dx = activeTranslation.x / viewport.effectiveZoom 0129 let dy = activeTranslation.y / viewport.effectiveZoom 0130 root.document.selectedItem.transform(dx, dy, edges) 0131 } 0132 onActiveChanged: if (!active) { 0133 root.document.selectedItem.commitChanges() 0134 } 0135 } 0136 } 0137 ResizeHandle { 0138 id: tlHandle 0139 anchors { 0140 horizontalCenter: parent.left 0141 verticalCenter: parent.top 0142 } 0143 startAngle: 90 0144 sweepAngle: 270 0145 edges: Qt.TopEdge | Qt.LeftEdge 0146 } 0147 ResizeHandle { 0148 id: lHandle 0149 anchors { 0150 horizontalCenter: parent.left 0151 verticalCenter: parent.verticalCenter 0152 } 0153 startAngle: 90 0154 sweepAngle: 180 0155 edges: Qt.LeftEdge 0156 } 0157 ResizeHandle { 0158 id: blHandle 0159 anchors { 0160 horizontalCenter: parent.left 0161 verticalCenter: parent.bottom 0162 } 0163 startAngle: 0 0164 sweepAngle: 270 0165 edges: Qt.BottomEdge | Qt.LeftEdge 0166 } 0167 ResizeHandle { 0168 id: tHandle 0169 anchors { 0170 horizontalCenter: parent.horizontalCenter 0171 verticalCenter: parent.top 0172 } 0173 startAngle: 180 0174 sweepAngle: 180 0175 edges: Qt.TopEdge 0176 } 0177 ResizeHandle { 0178 id: bHandle 0179 anchors { 0180 horizontalCenter: parent.horizontalCenter 0181 verticalCenter: parent.bottom 0182 } 0183 startAngle: 0 0184 sweepAngle: 180 0185 edges: Qt.BottomEdge 0186 } 0187 ResizeHandle { 0188 id: trHandle 0189 anchors { 0190 horizontalCenter: parent.right 0191 verticalCenter: parent.top 0192 } 0193 startAngle: 180 0194 sweepAngle: 270 0195 edges: Qt.TopEdge | Qt.RightEdge 0196 } 0197 ResizeHandle { 0198 id: rHandle 0199 anchors { 0200 horizontalCenter: parent.right 0201 verticalCenter: parent.verticalCenter 0202 } 0203 startAngle: 270 0204 sweepAngle: 180 0205 edges: Qt.RightEdge 0206 } 0207 ResizeHandle { 0208 id: brHandle 0209 anchors { 0210 horizontalCenter: parent.right 0211 verticalCenter: parent.bottom 0212 } 0213 startAngle: 270 0214 sweepAngle: 270 0215 edges: Qt.BottomEdge | Qt.RightEdge 0216 } 0217 Component.onCompleted: forceActiveFocus() 0218 } 0219 } 0220 0221