rewrite the EditMenu implementation
license reasons
This commit is contained in:
parent
9e318ed6d9
commit
eef99055e6
@ -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 <mart@kde.org>
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user