Warning, /plasma/qqc2-breeze-style/style/impl/CursorHandle.qml is written in an unsupported language. File is not indexed.
0001 /* SPDX-FileCopyrightText: 2018 Marco Martin <mart@kde.org> 0002 * SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com> 0003 * SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 import QtQuick 0007 import QtQuick.Window 0008 import QtQuick.Templates 0009 import org.kde.kirigami as Kirigami 0010 0011 import "." as Impl 0012 0013 Loader { 0014 id: root 0015 property Item target 0016 property bool isSelectionEnd: false 0017 visible: Kirigami.Settings.tabletMode && target.selectByMouse && target.activeFocus && (isSelectionEnd ? target.selectionStart !== target.selectionEnd : true) 0018 active: visible 0019 sourceComponent: Kirigami.ShadowedRectangle { 0020 id: handle 0021 property real selectionStartX: Math.floor(Qt.inputMethod.anchorRectangle.x + (Qt.inputMethod.cursorRectangle.width - width)/2) 0022 property real selectionStartY: Math.floor(Qt.inputMethod.anchorRectangle.y + Qt.inputMethod.cursorRectangle.height + pointyBitVerticalOffset) 0023 property real selectionEndX: Math.floor(Qt.inputMethod.cursorRectangle.x + (Qt.inputMethod.cursorRectangle.width - width)/2) 0024 property real selectionEndY: Math.floor(Qt.inputMethod.cursorRectangle.y + Qt.inputMethod.cursorRectangle.height + pointyBitVerticalOffset) 0025 property real pointyBitVerticalOffset: Math.abs(pointyBit.y*2) 0026 parent: Overlay.overlay 0027 x: isSelectionEnd ? selectionEndX : selectionStartX 0028 y: isSelectionEnd ? selectionEndY : selectionStartY 0029 0030 // HACK: make it appear above most popups that show up in the 0031 // overlay in case any of them use TextField or TextArea 0032 z: 999 0033 0034 //opacity: target.activeFocus ? 1 : 0 0035 implicitHeight: { 0036 let h = Kirigami.Units.gridUnit 0037 return h - (h % 2 == 0 ? 1 : 0) 0038 } 0039 implicitWidth: implicitHeight 0040 radius: width/2 0041 0042 color: target.selectionColor 0043 0044 shadow { 0045 color: Qt.rgba(0,0,0,0.2) 0046 size: 3 0047 yOffset: 1 0048 } 0049 0050 Rectangle { 0051 id: pointyBit 0052 x: (parent.width - width)/2 0053 y: -height/4 + 0.2 // magic number to get it to line up with the edge of the circle 0054 implicitHeight: parent.implicitHeight/2 0055 implicitWidth: implicitHeight 0056 antialiasing: true 0057 rotation: 45 0058 color: parent.color 0059 } 0060 0061 Kirigami.ShadowedRectangle { 0062 id: inner 0063 visible: target.selectionStart !== target.selectionEnd && (handle.y < selectionStartY || handle.y < selectionEndY) 0064 anchors.fill: parent 0065 anchors.margins: Impl.Units.smallBorder 0066 color: target.selectedTextColor 0067 radius: height/2 0068 Rectangle { 0069 id: innerPointyBit 0070 x: (parent.width - width)/2 0071 y: -height/4 + 0.8 // magic number to get it to line up with the edge of the circle 0072 implicitHeight: pointyBit.implicitHeight 0073 implicitWidth: implicitHeight 0074 antialiasing: true 0075 rotation: 45 0076 color: parent.color 0077 } 0078 } 0079 0080 MouseArea { 0081 enabled: handle.visible 0082 anchors.fill: parent 0083 // preventStealing: true 0084 onPositionChanged: { 0085 let pos = mapToItem(root.target, mouse.x, mouse.y); 0086 pos = root.target.positionAt(pos.x, pos.y - handle.height - handle.pointyBitVerticalOffset); 0087 0088 if (target.selectionStart !== target.selectionEnd) { 0089 if (!isSelectionEnd) { 0090 root.target.select(Math.min(pos, root.target.selectionEnd - 1), root.target.selectionEnd); 0091 } else { 0092 root.target.select(root.target.selectionStart, Math.max(pos, root.target.selectionStart + 1)); 0093 } 0094 } else { 0095 root.target.cursorPosition = pos; 0096 } 0097 } 0098 } 0099 0100 // NumberAnimations/SmoothedAnimations appear smoother than X/Y Animators for some reason. 0101 // The animations feel a bit janky when moving handles while text is selected. 0102 /*Behavior on x { 0103 enabled: enableXYAnimations && target.selectionStart === target.selectionEnd 0104 SmoothedAnimation { 0105 velocity: 200 0106 reversingMode: SmoothedAnimation.Immediate 0107 duration: Kirigami.Units.shortDuration 0108 } 0109 } 0110 Behavior on y { 0111 enabled: enableXYAnimations && target.selectionStart === target.selectionEnd 0112 SmoothedAnimation { 0113 velocity: 200 0114 reversingMode: SmoothedAnimation.Immediate 0115 duration: Kirigami.Units.shortDuration 0116 } 0117 } 0118 0119 //HACK 0120 property bool enableXYAnimations: false 0121 Timer { 0122 id: animationHackTimer 0123 running: true 0124 interval: 1 0125 onTriggered: handle.enableXYAnimations = true 0126 } 0127 */ 0128 } 0129 }