summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@digia.com>2014-08-05 15:23:03 +0200
committerRichard Moe Gustavsen <richard.gustavsen@digia.com>2014-09-11 22:33:08 +0200
commit84d99bccfb7c627d83abe3c52a5a9d035f90c8d1 (patch)
tree014d37f4f4f5ee98f8346dcb6ea35bf25ad998b4
parent080d028c99df0f313f7dddf25da4843dabd57ef5 (diff)
downloadqtquickcontrols-84d99bccfb7c627d83abe3c52a5a9d035f90c8d1.tar.gz
Add new private control 'EditMenu'
This control will be used as a part of the different text edit controls for controlling how the edit menu should work. Change-Id: Id3ed5795111c37269fce62a97cf4d9bde1b5f6b3 Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
-rw-r--r--src/controls/Private/EditMenu.qml53
-rw-r--r--src/controls/Private/EditMenu_ios.qml190
-rw-r--r--src/controls/Private/private.pri2
-rw-r--r--src/controls/Private/qmldir2
4 files changed, 247 insertions, 0 deletions
diff --git a/src/controls/Private/EditMenu.qml b/src/controls/Private/EditMenu.qml
new file mode 100644
index 00000000..b7cebc19
--- /dev/null
+++ b/src/controls/Private/EditMenu.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Loader {
+ property Item control
+ property Item input
+ property Item cursorHandle
+ property Item selectionHandle
+ property Flickable flickable
+ property Menu defaultMenu: item && item.defaultMenu ? item.defaultMenu : null
+
+ source: Qt.platform.os === "ios" ? Qt.resolvedUrl("EditMenu_ios.qml") : ""
+}
diff --git a/src/controls/Private/EditMenu_ios.qml b/src/controls/Private/EditMenu_ios.qml
new file mode 100644
index 00000000..e41e0cb6
--- /dev/null
+++ b/src/controls/Private/EditMenu_ios.qml
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.1
+import QtQuick.Controls 1.1
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+Item {
+ anchors.fill: parent
+ property bool __showMenuFromTouchAndHold: false
+
+ property Menu defaultMenu: Menu {
+ MenuItem {
+ text: "cut"
+ visible: !input.readOnly && selectionStart !== selectionEnd
+ onTriggered: {
+ cut();
+ select(input.cursorPosition, input.cursorPosition);
+ }
+ }
+ MenuItem {
+ text: "copy"
+ visible: selectionStart !== selectionEnd
+ onTriggered: {
+ copy();
+ select(input.cursorPosition, input.cursorPosition);
+ }
+ }
+ MenuItem {
+ text: "paste"
+ visible: input.canPaste
+ onTriggered: paste();
+ }
+ MenuItem {
+ text: "delete"
+ visible: !input.readOnly && selectionStart !== selectionEnd
+ onTriggered: remove(selectionStart, selectionEnd)
+ }
+ MenuItem {
+ text: "select"
+ visible: selectionStart === selectionEnd
+ onTriggered: selectWord();
+ }
+ MenuItem {
+ text: "select all"
+ visible: !(selectionStart === 0 && selectionEnd === length)
+ onTriggered: selectAll();
+ }
+ }
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+
+ function clearFocusFromOtherItems()
+ {
+ var selectionItem = TextSingleton.selectionItem;
+ if (!selectionItem)
+ return;
+ var otherPos = selectionItem.cursorPosition;
+ selectionItem.select(otherPos, otherPos)
+ }
+
+ onClicked: {
+ if (control.menu && control.menu.__popupVisible) {
+ select(input.cursorPosition, input.cursorPosition);
+ } else {
+ input.activate();
+ clearFocusFromOtherItems();
+ }
+
+ if (input.activeFocus) {
+ var pos = input.positionAt(mouse.x, mouse.y)
+ input.moveHandles(pos, pos)
+ }
+ }
+
+ onPressAndHold: {
+ var pos = input.positionAt(mouseArea.mouseX, mouseArea.mouseY);
+ input.select(pos, pos);
+ if (!control.menu || !input.activeFocus || (selectionStart != selectionEnd)) {
+ selectWord();
+ } else {
+ // We don't select anything at this point, the
+ // menu will instead offer to select a word.
+ __showMenuFromTouchAndHold = true;
+ menuTimer.start();
+ clearFocusFromOtherItems();
+ }
+ }
+
+ onReleased: __showMenuFromTouchAndHold = false
+ onCanceled: __showMenuFromTouchAndHold = false
+ }
+
+ Connections {
+ target: cursorHandle ? cursorHandle : null
+ ignoreUnknownSignals: true
+ onPressedChanged: menuTimer.start()
+ }
+
+ Connections {
+ target: selectionHandle ? selectionHandle : null
+ ignoreUnknownSignals: true
+ onPressedChanged: menuTimer.start()
+ }
+
+ Connections {
+ target: flickable
+ ignoreUnknownSignals: true
+ onMovingChanged: menuTimer.start()
+ }
+
+ Connections {
+ id: selectionConnections
+ target: input
+ ignoreUnknownSignals: true
+ onSelectionStartChanged: menuTimer.start()
+ onSelectionEndChanged: menuTimer.start()
+ onActiveFocusChanged: menuTimer.start()
+ }
+
+ Timer {
+ // We use a timer so that we end up with one update when multiple connections fire at the same time.
+ // Basically we wan't the menu to be open if the user does a press and hold, or if we have a selection.
+ // The exceptions are if the user is moving selection handles or otherwise touching the screen (e.g flicking).
+ // What is currently missing are showing a magnifyer to place the cursor, and to reshow the edit menu when
+ // flicking stops.
+ id: menuTimer
+ interval: 1
+ onTriggered: {
+ if (!control.menu)
+ return;
+
+ if ((__showMenuFromTouchAndHold || selectionStart !== selectionEnd)
+ && (!cursorHandle.pressed && !selectionHandle.pressed)
+ && (!flickable || !flickable.moving)
+ && (cursorHandle.delegate)) {
+ // center menu on top of selection:
+ var r1 = input.positionToRectangle(input.selectionStart);
+ var r2 = input.cursorRectangle;
+ var xMin = Math.min(r1.x, r2.x);
+ var xMax = Math.max(r1.x, r2.x);
+ var centerX = xMin + ((xMax - xMin) / 2);
+ var popupPos = input.mapToItem(null, centerX, r1.y);
+ control.menu.__dismissMenu();
+ control.menu.__popup(popupPos.x, popupPos.y, -1, MenuPrivate.EditMenu);
+ } else {
+ control.menu.__dismissMenu();
+ }
+ }
+ }
+}
diff --git a/src/controls/Private/private.pri b/src/controls/Private/private.pri
index ac2c5238..b407cbf4 100644
--- a/src/controls/Private/private.pri
+++ b/src/controls/Private/private.pri
@@ -57,6 +57,8 @@ PRIVATE_QML_FILES += \
$$PWD/ContentItem.qml \
$$PWD/HoverButton.qml \
$$PWD/TextInputWithHandles.qml \
+ $$PWD/EditMenu.qml \
+ $$PWD/EditMenu_ios.qml \
$$PWD/qmldir
QML_FILES += $$PRIVATE_QML_FILES
diff --git a/src/controls/Private/qmldir b/src/controls/Private/qmldir
index 18fc8eb0..7ef7ae95 100644
--- a/src/controls/Private/qmldir
+++ b/src/controls/Private/qmldir
@@ -29,3 +29,5 @@ singleton SystemPaletteSingleton 1.0 SystemPaletteSingleton.qml
singleton TextSingleton 1.0 TextSingleton.qml
TextHandle 1.0 TextHandle.qml
TextInputWithHandles 1.0 TextInputWithHandles.qml
+EditMenu 1.0 EditMenu.qml
+EditMenu_ios 1.0 EditMenu_ios.qml