diff options
author | Richard Moe Gustavsen <richard.gustavsen@digia.com> | 2014-08-05 15:23:03 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@digia.com> | 2014-09-11 22:33:08 +0200 |
commit | 84d99bccfb7c627d83abe3c52a5a9d035f90c8d1 (patch) | |
tree | 014d37f4f4f5ee98f8346dcb6ea35bf25ad998b4 | |
parent | 080d028c99df0f313f7dddf25da4843dabd57ef5 (diff) | |
download | qtquickcontrols-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.qml | 53 | ||||
-rw-r--r-- | src/controls/Private/EditMenu_ios.qml | 190 | ||||
-rw-r--r-- | src/controls/Private/private.pri | 2 | ||||
-rw-r--r-- | src/controls/Private/qmldir | 2 |
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 |