2022-05-13 13:12:05 +00:00
// Copyright (C) 2017 The Qt Company Ltd.
2024-02-22 14:51:16 +00:00
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
2022-08-31 07:59:05 +00:00
import QtQuick
2011-04-27 10:05:43 +00:00
Rectangle {
id: editor
color: "lightGrey"
2023-03-03 11:27:25 +00:00
width: 640
height: 480
2011-04-27 10:05:43 +00:00
Rectangle {
color: "white"
anchors.fill: parent
anchors.margins: 20
BorderImage {
id: startHandle
source: "pics/startHandle.sci"
opacity: 0.0
width: 10
x: edit . positionToRectangle ( edit . selectionStart ) . x - flick . contentX - width
y: edit . positionToRectangle ( edit . selectionStart ) . y - flick . contentY
height: edit . positionToRectangle ( edit . selectionStart ) . height
}
BorderImage {
id: endHandle
source: "pics/endHandle.sci"
opacity: 0.0
width: 10
x: edit . positionToRectangle ( edit . selectionEnd ) . x - flick . contentX
y: edit . positionToRectangle ( edit . selectionEnd ) . y - flick . contentY
height: edit . positionToRectangle ( edit . selectionEnd ) . height
}
Flickable {
id: flick
anchors.fill: parent
2022-03-25 17:55:31 +00:00
contentWidth: edit . contentWidth
contentHeight: edit . contentHeight
2011-04-27 10:05:43 +00:00
interactive: true
clip: true
function ensureVisible ( r ) {
if ( contentX >= r . x )
contentX = r . x ;
else if ( contentX + width <= r . x + r . width )
contentX = r . x + r . width - width ;
if ( contentY >= r . y )
contentY = r . y ;
else if ( contentY + height <= r . y + r . height )
contentY = r . y + r . height - height ;
}
TextEdit {
id: edit
width: flick . width
height: flick . height
focus: true
wrapMode: TextEdit . Wrap
2011-12-13 03:56:42 +00:00
textFormat: TextEdit . RichText
2011-04-27 10:05:43 +00:00
onCursorRectangleChanged: flick . ensureVisible ( cursorRectangle )
text: "<h1>Text Selection</h1>"
+ "<p>This example is a whacky text selection mechanisms, showing how these can be implemented in the TextEdit element, to cater for whatever style is appropriate for the target platform."
+ "<p><b>Press-and-hold</b> to select a word, then drag the selection handles."
+ "<p><b>Drag outside the selection</b> to scroll the text."
+ "<p><b>Click inside the selection</b> to cut/copy/paste/cancel selection."
+ "<p>It's too whacky to let you paste if there is no current selection."
}
}
Item {
id: menu
opacity: 0.0
width: 100
height: 120
anchors.centerIn: parent
Rectangle {
border.width: 1
border.color: "darkBlue"
radius: 15
color: "#806080FF"
anchors.fill: parent
}
Column {
anchors.centerIn: parent
spacing: 8
Rectangle {
border.width: 1
border.color: "darkBlue"
color: "#ff7090FF"
width: 60
height: 16
2023-03-03 11:27:25 +00:00
Text {
anchors.centerIn: parent
text: qsTr ( "Cut" )
}
2011-04-27 10:05:43 +00:00
2014-01-15 21:01:15 +00:00
MouseArea {
2011-04-27 10:05:43 +00:00
anchors.fill: parent
2023-03-03 11:27:25 +00:00
onClicked: function ( ) {
edit . cut ( )
editor . state = ""
}
2011-04-27 10:05:43 +00:00
}
}
Rectangle {
border.width: 1
border.color: "darkBlue"
color: "#ff7090FF"
width: 60
height: 16
2023-03-03 11:27:25 +00:00
Text {
anchors.centerIn: parent
text: qsTr ( "Copy" )
}
2011-04-27 10:05:43 +00:00
2014-01-15 21:01:15 +00:00
MouseArea {
2011-04-27 10:05:43 +00:00
anchors.fill: parent
2023-03-03 11:27:25 +00:00
onClicked: function ( ) {
edit . copy ( )
editor . state = "selection"
}
2011-04-27 10:05:43 +00:00
}
}
Rectangle {
border.width: 1
border.color: "darkBlue"
color: "#ff7090FF"
width: 60
height: 16
2023-03-03 11:27:25 +00:00
Text {
anchors.centerIn: parent
text: qsTr ( "Paste" )
}
2011-04-27 10:05:43 +00:00
2014-01-15 21:01:15 +00:00
MouseArea {
2011-04-27 10:05:43 +00:00
anchors.fill: parent
2023-03-03 11:27:25 +00:00
onClicked: function ( ) {
edit . paste ( )
edit . cursorPosition = edit . selectionEnd
editor . state = ""
}
2011-04-27 10:05:43 +00:00
}
}
Rectangle {
border.width: 1
border.color: "darkBlue"
color: "#ff7090FF"
width: 60
height: 16
2023-03-03 11:27:25 +00:00
Text {
anchors.centerIn: parent
text: qsTr ( "Deselect" )
}
2011-04-27 10:05:43 +00:00
2014-01-15 21:01:15 +00:00
MouseArea {
2011-04-27 10:05:43 +00:00
anchors.fill: parent
2014-01-15 21:01:15 +00:00
onClicked: {
2011-04-27 10:05:43 +00:00
edit . cursorPosition = edit . selectionEnd ;
edit . deselect ( ) ;
2014-01-15 21:01:15 +00:00
editor . state = ""
}
2011-04-27 10:05:43 +00:00
}
}
}
}
}
states: [
State {
name: "selection"
2021-10-28 07:34:00 +00:00
PropertyChanges {
startHandle.opacity: 1.0
endHandle.opacity: 1.0
}
2011-04-27 10:05:43 +00:00
} ,
State {
name: "menu"
2021-10-28 07:34:00 +00:00
PropertyChanges {
startHandle.opacity: 0.5
endHandle.opacity: 0.5
menu.opacity: 1.0
}
2011-04-27 10:05:43 +00:00
}
]
}