From eef99055e629628366b0bcb146c2ec2bd7ffe092 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 16 Jul 2015 15:26:18 +0200 Subject: [PATCH] rewrite the EditMenu implementation license reasons --- .../plasmastyle/EditMenuTouch.qml | 130 +++++------------- 1 file changed, 34 insertions(+), 96 deletions(-) diff --git a/src/declarativeimports/plasmastyle/EditMenuTouch.qml b/src/declarativeimports/plasmastyle/EditMenuTouch.qml index d01eb7eee..07529859b 100644 --- a/src/declarativeimports/plasmastyle/EditMenuTouch.qml +++ b/src/declarativeimports/plasmastyle/EditMenuTouch.qml @@ -1,38 +1,21 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the Qt Quick Controls module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information to -** ensure the GNU General Public License version 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +/* + * Copyright (C) 2015 by Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. + */ import QtQuick 2.1 import QtQuick.Controls 1.1 @@ -43,7 +26,6 @@ import org.kde.plasma.components 2.0 as PlasmaComponents Item { anchors.fill: parent - property bool __showMenuFromTouchAndHold: false property Component defaultMenu: PlasmaCore.FrameSvgItem { id: popup @@ -60,13 +42,13 @@ Item { } } - function __popup(pos) { + function popup(pos) { popup.x = pos.x; popup.y = pos.y; popup.visible = true; popup.z = 9999 } - function __dismissMenu() { + function dismiss() { popup.visible = false; input.z = 0 } @@ -99,96 +81,52 @@ Item { } } } + Connections { target: mouseArea - function clearFocusFromOtherItems() - { - var selectionItem = TextSingleton.selectionItem; - if (!selectionItem) - return; - var otherPos = selectionItem.cursorPosition; - selectionItem.select(otherPos, otherPos) - } - onClicked: { if (control.menu && getMenuInstance().__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) } + popupTimer.restart(); } - onPressAndHold: { var pos = input.positionAt(mouseArea.mouseX, mouseArea.mouseY); input.select(pos, pos); var hasSelection = selectionStart != selectionEnd; selectWord(); + popupTimer.restart(); } - - 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() + onSelectionStartChanged: popupTimer.restart() + onSelectionEndChanged: popupTimer.restart() + onActiveFocusChanged: popupTimer.restart() } 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 + id: popupTimer interval: 1 onTriggered: { - if (!control.menu) - return; + if (selectionStart !== selectionEnd && control.activeFocus) { + var startRect = input.positionToRectangle(input.selectionStart); + var endRect = input.positionToRectangle(input.selectionEnd); - if ((__showMenuFromTouchAndHold || selectionStart !== selectionEnd) - && control.activeFocus - && (!cursorHandle.pressed && !selectionHandle.pressed) - && (!flickable || !flickable.moving) - && (cursorHandle.delegate)) { - var p1 = input.positionToRectangle(input.selectionStart); - var p2 = input.positionToRectangle(input.selectionEnd); - var topLeft = input.mapToItem(null, p1.x, p1.y + units.gridUnit); - var size = Qt.size(p2.x - p1.x + p1.width, p2.y - p1.y + p1.height) - var targetRect = Qt.rect(topLeft.x, topLeft.y, size.width, size.height); - getMenuInstance().__dismissMenu(); - getMenuInstance().__popup(targetRect, -1, MenuPrivate.EditMenu); + var pos = getMenuInstance().mapFromItem(input, startRect.x, startRect.y + units.gridUnit); + getMenuInstance().dismiss(); + getMenuInstance().popup(pos); } else { - getMenuInstance().__dismissMenu(); + getMenuInstance().dismiss(); } } }