diff --git a/src/declarativeimports/plasmastyle/CursorDelegate.qml b/src/declarativeimports/plasmastyle/CursorDelegate.qml new file mode 100644 index 000000000..07a817589 --- /dev/null +++ b/src/declarativeimports/plasmastyle/CursorDelegate.qml @@ -0,0 +1,66 @@ +/* +* 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.2 +import org.kde.plasma.core 2.0 as PlasmaCore + +Item { + id: root + + property Item input: parent + + width: units.smallSpacing + height: input.cursorRectangle.height + visible: input.activeFocus && input.selectionStart === input.selectionEnd + + + Rectangle { + width: units.smallSpacing + height: parent.height + units.gridUnit + radius: width + color: theme.highlightColor + } + + Rectangle { + id: handle + x: -width/2 + parent.width/2 + width: units.gridUnit + height: width + radius: width + color: theme.highlightColor + anchors.top: parent.bottom + } + MouseArea { + drag { + target: root + minimumX: 0 + minimumY: 0 + maximumX: input.width + maximumY: input.height - root.height + } + width: handle.width * 2 + height: parent.height + handle.height + x: -width/2 + onReleased: { + var pos = mapToItem(input, mouse.x, mouse.y); + input.cursorPosition = input.positionAt(pos.x, pos.y); + } + } +} + diff --git a/src/declarativeimports/plasmastyle/CursorHandleStyle.qml b/src/declarativeimports/plasmastyle/CursorHandleStyle.qml new file mode 100644 index 000000000..baec252b3 --- /dev/null +++ b/src/declarativeimports/plasmastyle/CursorHandleStyle.qml @@ -0,0 +1,51 @@ +/* +* 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.2 +import org.kde.plasma.core 2.0 as PlasmaCore + +Item { + width: units.gridUnit + height: styleData.lineHeight + units.gridUnit + visible: styleData.hasSelection + + Rectangle { + id: handle + width: units.gridUnit + height: width + radius: width + color: theme.highlightColor + anchors.bottom: parent.bottom + } + Rectangle { + width: units.gridUnit/2 + height: width + anchors { + left: handle.left + top: handle.top + } + color: theme.highlightColor + } + Rectangle { + width: units.smallSpacing + height: styleData.lineHeight + units.gridUnit/2 + color: theme.highlightColor + anchors.left: parent.left + } +} diff --git a/src/declarativeimports/plasmastyle/EditMenuTouch.qml b/src/declarativeimports/plasmastyle/EditMenuTouch.qml new file mode 100644 index 000000000..4c818ffc5 --- /dev/null +++ b/src/declarativeimports/plasmastyle/EditMenuTouch.qml @@ -0,0 +1,143 @@ +/* + * 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 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Controls.Private 1.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents + +Item { + anchors.fill: parent + + property Component defaultMenu: PlasmaCore.FrameSvgItem { + id: popup + imagePath: "widgets/background" + visible: false + width: childrenRect.width + margins.left + margins.right + height: childrenRect.height + margins.top + margins.bottom + z: 9999 + Component.onCompleted: { + var par = control + //heuristic: if a flickable is found in the parents, + //reparent to it, so it scrolls together + while (par.parent && par.parent.contentY === undefined) { + par = par.parent + } + + popup.parent = par + } + + function popup(pos) { + popup.x = pos.x; + popup.y = pos.y; + popup.visible = true; + } + function dismiss() { + popup.visible = false; + } + Row { + x: parent.margins.left + y: parent.margins.top + property Item checkedButton + PlasmaComponents.ToolButton { + iconSource: "edit-cut" + flat: false + visible: input.selectedText != "" + onClicked: { + control.cut(); + select(input.cursorPosition, input.cursorPosition); + } + } + PlasmaComponents.ToolButton { + iconSource: "edit-copy" + visible: input.selectedText != "" + flat: false + onClicked: { + control.copy(); + select(input.cursorPosition, input.cursorPosition); + } + } + PlasmaComponents.ToolButton { + iconSource: "edit-paste" + enabled: input.canPaste + flat: false + onClicked: { + control.paste(); + } + } + } + } + + Connections { + target: mouseArea + + onClicked: { + if (control.menu && getMenuInstance().__popupVisible) { + select(input.cursorPosition, input.cursorPosition); + } else { + input.activate(); + } + + if (input.activeFocus) { + var pos = input.positionAt(mouse.x, mouse.y) + input.moveHandles(pos, pos) + } + popupTimer.restart(); + } + onPressAndHold: { + input.activate(); + var pos = input.positionAt(mouseArea.mouseX, mouseArea.mouseY); + input.select(pos, pos); + selectWord(); + popupTimer.restart(); + } + } + + Connections { + target: input + onSelectionStartChanged: popupTimer.restart() + onSelectionEndChanged: popupTimer.restart() + onActiveFocusChanged: popupTimer.restart() + } + + Connections { + target: flickable + onMovingChanged: popupTimer.restart() + } + + Timer { + id: popupTimer + interval: 1 + onTriggered: { + if ((input.canPaste || selectionStart !== selectionEnd) && control.activeFocus) { + var startRect = input.positionToRectangle(input.selectionStart); + var endRect = input.positionToRectangle(input.selectionEnd); + + var pos = getMenuInstance().parent.mapFromItem(input, startRect.x, startRect.y + units.gridUnit); + + getMenuInstance().dismiss(); + getMenuInstance().popup(pos); + } else { + getMenuInstance().dismiss(); + } + } + } +} diff --git a/src/declarativeimports/plasmastyle/SelectionHandleStyle.qml b/src/declarativeimports/plasmastyle/SelectionHandleStyle.qml new file mode 100644 index 000000000..44def9cdc --- /dev/null +++ b/src/declarativeimports/plasmastyle/SelectionHandleStyle.qml @@ -0,0 +1,52 @@ +/* +* 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.2 +import org.kde.plasma.core 2.0 as PlasmaCore + +Item { + width: units.gridUnit + x: -width + height: styleData.lineHeight + units.gridUnit + visible: styleData.hasSelection + + Rectangle { + id: handle + width: units.gridUnit + height: width + radius: width + color: theme.highlightColor + anchors.bottom: parent.bottom + } + Rectangle { + width: units.gridUnit/2 + height: width + anchors { + right: handle.right + top: handle.top + } + color: theme.highlightColor + } + Rectangle { + width: units.smallSpacing + height: styleData.lineHeight + units.gridUnit/2 + color: theme.highlightColor + anchors.right: parent.right + } +} diff --git a/src/declarativeimports/plasmastyle/TextAreaStyle.qml b/src/declarativeimports/plasmastyle/TextAreaStyle.qml index 114c32208..0beb0c002 100644 --- a/src/declarativeimports/plasmastyle/TextAreaStyle.qml +++ b/src/declarativeimports/plasmastyle/TextAreaStyle.qml @@ -20,6 +20,7 @@ import QtQuick 2.1 import QtQuick.Controls.Styles 1.1 as QtQuickControlStyle +import QtQuick.Controls.Private 1.0 as QtQuickControlsPrivate import QtQuick.Controls 1.1 import org.kde.plasma.core 2.0 as PlasmaCore @@ -67,4 +68,17 @@ QtQuickControlStyle.TextAreaStyle { incrementControl: svs.incrementControl decrementControl: svs.decrementControl + Component { + id: editMenuTouch + EditMenuTouch {} + } + Component { + id: cursorTouch + CursorDelegate {} + } + + __cursorHandle: CursorHandleStyle {} + __cursorDelegate: QtQuickControlsPrivate.Settings.isMobile ? cursorTouch : null + __selectionHandle: SelectionHandleStyle {} + property Component __editMenu: QtQuickControlsPrivate.Settings.isMobile ? editMenuTouch : null } diff --git a/src/declarativeimports/plasmastyle/TextFieldStyle.qml b/src/declarativeimports/plasmastyle/TextFieldStyle.qml index 635c938f1..8daaa0b83 100644 --- a/src/declarativeimports/plasmastyle/TextFieldStyle.qml +++ b/src/declarativeimports/plasmastyle/TextFieldStyle.qml @@ -19,6 +19,7 @@ import QtQuick 2.0 import QtQuick.Controls.Styles 1.1 as QtQuickControlStyle +import QtQuick.Controls.Private 1.0 as QtQuickControlsPrivate import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents @@ -65,4 +66,18 @@ QtQuickControlStyle.TextFieldStyle { root.padding.bottom = base.margins.bottom } } + + Component { + id: editMenuTouch + EditMenuTouch {} + } + Component { + id: cursorTouch + CursorDelegate {} + } + + __cursorHandle: CursorHandleStyle {} + __cursorDelegate: QtQuickControlsPrivate.Settings.isMobile ? cursorTouch : null + __selectionHandle: SelectionHandleStyle {} + property Component __editMenu: QtQuickControlsPrivate.Settings.isMobile ? editMenuTouch : null }