Commit 6a4b5870 authored by Furkan Tokac's avatar Furkan Tokac 💬
Browse files

Touchpad KCM QtQuickControls2 Conversion

Summary:
Tested. Working fine. Functionality is same.

{F5916032}

Reviewers: romangg, ngraham, #plasma, mart

Reviewed By: romangg, ngraham, #plasma, mart

Subscribers: mart, davidedmundson, plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D13573
parent ea21521b
/*
* Copyright 2017 Roman Gilg <subdiff@gmail.com>
* Copyright 2018 Furkan Tokac <furkantokac34@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.7
import QtQuick.Controls 1.4 as Controls
import org.kde.plasma.core 2.0 as PlasmaCore
Column {
spacing: units.smallSpacing / 2
property alias label: textlabel.text
property alias model: repeater.model
property alias current: exlGroupbox.current
function itemAt(index) {
return repeater.itemAt(index)
}
Controls.Label {
id: textlabel
}
Controls.ExclusiveGroup { id: exlGroupbox }
Column {
spacing: units.smallSpacing / 2
Repeater {
id: repeater
Controls.RadioButton {
text: modelData
exclusiveGroup: exlGroupbox
property alias tooltiptext: tooltip.text
ToolTip {
id: tooltip
}
}
}
}
}
/*
* Copyright 2017 Roman Gilg <subdiff@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import QtQuick 2.7
import QtQuick.Controls.Private 1.0
MouseArea {
anchors.fill: parent
property string text: ""
hoverEnabled: true
acceptedButtons: Qt.NoButton
onEntered: timer.start()
onExited: timer.killTooltip()
onPositionChanged: timer.resetTooltip()
Timer {
id: timer
interval: 1000
onTriggered: {
Tooltip.showText(parent, Qt.point(mouseX, mouseY), text)
}
function killTooltip() {
stop()
Tooltip.hideText()
}
function resetTooltip() {
restart()
Tooltip.hideText()
}
}
}
......@@ -18,19 +18,21 @@
*/
import QtQuick 2.7
import QtQuick.Controls 1.4 as Controls
import QtQuick.Controls 2.0 as Controls
import QtQuick.Layouts 1.3 as Layouts
import QtQuick.Controls.Styles 1.4 as Styles
import org.kde.kcm 1.1 as KCM
import org.kde.kirigami 2.4 as Kirigami
import org.kde.plasma.core 2.0 as PlasmaCore
import "components"
Kirigami.Page {
// TODO: Change ScrollablePage as KCM.SimpleKCM
// after rewrite the KCM in KConfigModule.
Kirigami.ScrollablePage {
id: root
spacing: Kirigami.Units.smallSpacing
property size minimumSizeHint: Qt.size(formLayout.width/2, deviceSelector.height)
property alias deviceIndex: deviceSelector.currentIndex
signal changeSignal()
......@@ -66,16 +68,12 @@ Kirigami.Page {
leftHanded.load()
accelSpeed.load()
accelProfile.load()
tapToClick.load()
tapAndDrag.load()
tapAndDragLock.load()
multiTap.load()
scrollmethod.load()
scrollMethod.load()
naturalScroll.load()
// TODO:
// scrollbutton.load()
loading = false
}
......@@ -83,22 +81,12 @@ Kirigami.Page {
Kirigami.FormLayout {
id: formLayout
topPadding: root.topPadding
leftPadding: root.leftPadding
rightPadding: root.rightPadding
bottomPadding: root.bottomPadding
anchors {
fill: parent
topMargin: root.header ? root.header.height : 0
bottomMargin: root.footer ? root.footer.height : 0
}
// Device
Controls.ComboBox {
Kirigami.FormData.label: i18n("Device:")
id: deviceSelector
enabled: touchpadCount > 1
implicitWidth: units.gridUnit * 16
Layouts.Layout.fillWidth: true
model: deviceModel
textRole: "name"
......@@ -125,6 +113,13 @@ Kirigami.Page {
id: deviceEnabled
text: i18n("Device enabled")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Accept input through this device.")
visible: parent.hovered
delay: 1000
}
function load() {
if (!formLayout.enabled) {
checked = false
......@@ -140,16 +135,19 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Accept input through this device.")
}
}
Controls.CheckBox {
id: dwt
text: i18n("Disable while typing")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Disable touchpad while typing to prevent accidental inputs.")
visible: parent.hovered
delay: 1000
}
function load() {
if (!formLayout.enabled) {
checked = false
......@@ -165,16 +163,19 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Disable touchpad while typing to prevent accidental inputs.")
}
}
Controls.CheckBox {
id: leftHanded
text: i18n("Left handed mode")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Swap left and right buttons.")
visible: parent.hovered
delay: 1000
}
function load() {
if (!formLayout.enabled) {
checked = false
......@@ -190,16 +191,19 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Swap left and right buttons.")
}
}
Controls.CheckBox {
id: middleEmulation
text: i18n("Press left and right buttons for middle click")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Clicking left and right button simultaneously sends middle button click.")
visible: parent.hovered
delay: 1000
}
function load() {
if (!formLayout.enabled) {
checked = false
......@@ -215,10 +219,6 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Clicking left and right button simultaneously sends middle button click.")
}
}
Kirigami.Separator {
......@@ -229,14 +229,10 @@ Kirigami.Page {
Kirigami.FormData.label: i18n("Pointer speed:")
id: accelSpeed
tickmarksEnabled: true
minimumValue: 1
maximumValue: 10
from: 1
to: 10
stepSize: 1
implicitWidth: units.gridUnit * 9
function load() {
enabled = touchpad.supportsPointerAcceleration
if (!enabled) {
......@@ -256,34 +252,61 @@ Kirigami.Page {
}
}
ExclGroupBox {
Layouts.ColumnLayout {
Kirigami.FormData.label: i18n("Acceleration profile:")
Kirigami.FormData.buddyFor: accelProfileFlat
id: accelProfile
model: [i18n("Flat"), i18n("Adaptive")]
spacing: Kirigami.Units.smallSpacing
function load() {
enabled = touchpad.supportsPointerAccelerationProfileAdaptive
if (!enabled) {
itemAt(0).checked = false
itemAt(1).checked = false
accelProfileFlat.checked = false
accelProfileAdaptive.checked = false
return
}
itemAt(0).tooltiptext = i18n("Cursor moves the same distance as finger.")
itemAt(1).tooltiptext = i18n("Cursor travel distance depends on movement speed of finger.")
var toCheck = touchpad.pointerAccelerationProfileAdaptive ? 1 : 0
itemAt(toCheck).checked = true
if(touchpad.pointerAccelerationProfileAdaptive) {
accelProfileAdaptive.checked = true
} else {
accelProfileFlat.checked = true
}
}
onCurrentChanged: {
function syncCurrent() {
if (enabled && !root.loading) {
touchpad.pointerAccelerationProfileFlat = itemAt(0).checked
touchpad.pointerAccelerationProfileAdaptive = itemAt(1).checked
touchpad.pointerAccelerationProfileFlat = accelProfileFlat.checked
touchpad.pointerAccelerationProfileAdaptive = accelProfileAdaptive.checked
root.changeSignal()
}
}
Controls.RadioButton {
id: accelProfileFlat
text: i18n("Flat")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Cursor moves the same distance as finger.")
visible: parent.hovered
delay: 1000
}
onCheckedChanged: accelProfile.syncCurrent()
}
Controls.RadioButton {
id: accelProfileAdaptive
text: i18n("Adaptive")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Cursor travel distance depends on movement speed of finger.")
visible: parent.hovered
delay: 1000
}
onCheckedChanged: accelProfile.syncCurrent()
}
}
Kirigami.Separator {
......@@ -295,6 +318,13 @@ Kirigami.Page {
id: tapToClick
text: i18n("Tap-to-click")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Single tap is left button click.")
visible: parent.hovered
delay: 1000
}
function load() {
enabled = touchpad.tapFingerCount > 0
checked = enabled && touchpad.tapToClick
......@@ -315,16 +345,19 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Single tap is left button click.")
}
}
Controls.CheckBox {
id: tapAndDrag
text: i18n("Tap-and-drag")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Sliding over touchpad directly after tap drags.")
visible: parent.hovered
delay: 1000
}
function load() {
enabled = touchpad.tapFingerCount > 0 && tapToClick.checked
checked = enabled && touchpad.tapAndDrag
......@@ -343,16 +376,19 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Sliding over touchpad directly after tap drags.")
}
}
Controls.CheckBox {
id: tapAndDragLock
text: i18n("Tap-and-drag lock")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Dragging continues after a short finger lift.")
visible: parent.hovered
delay: 1000
}
function load() {
enabled = touchpad.tapFingerCount > 0 && tapAndDrag.checked
checked = enabled && touchpad.tapDragLock
......@@ -364,81 +400,137 @@ Kirigami.Page {
root.changeSignal()
}
}
ToolTip {
text: i18n("Dragging continues after a short finger lift.")
}
}
ExclGroupBox {
Layouts.ColumnLayout {
Kirigami.FormData.label: i18n("Two-finger tap:")
Kirigami.FormData.buddyFor: multiTapRightClick
id: multiTap
spacing: Kirigami.Units.smallSpacing
function load() {
enabled = touchpad.supportsLmrTapButtonMap && tapToClick.checked
if (touchpad.tapFingerCount > 2) {
model = [i18n("Right-click (three-finger tap to middle-click)"),
i18n("Middle-click (three-finger tap right-click)")]
itemAt(0).tooltiptext = i18n("Tap with two fingers to right-click, tap with three fingers to middle-click.")
itemAt(1).tooltiptext = i18n("Tap with two fingers to middle-click, tap with three fingers to right-click.")
multiTapRightClick.text = i18n("Right-click (three-finger tap to middle-click)")
multiTapRightClickToolTip.text = i18n("Tap with two fingers to right-click, tap with three fingers to middle-click.")
multiTapMiddleClick.text = i18n("Middle-click (three-finger tap right-click)")
multiTapMiddleClickToolTip.text = i18n("Tap with two fingers to middle-click, tap with three fingers to right-click.")
} else {
model = [i18n("Righ-click"), i18n("Middle-click")]
itemAt(0).tooltiptext = i18n("Tap with two fingers to right-click.")
itemAt(1).tooltiptext = i18n("Tap with two fingers to middle-click.")
multiTapRightClick.text = i18n("Righ-click")
multiTapRightClickToolTip.text = i18n("Tap with two fingers to right-click.")
multiTapMiddleClick.text = i18n("Middle-click")
multiTapMiddleClickToolTip.text = i18n("Tap with two fingers to middle-click.")
}
if (!enabled) {
itemAt(0).checked = false
itemAt(1).checked = false
multiTapRightClick.checked = false
multiTapMiddleClick.checked = false
return
}
var toCheck = touchpad.lmrTapButtonMap ? 1 : 0
itemAt(toCheck).checked = true
if(touchpad.lmrTapButtonMap) {
multiTapMiddleClick.checked = true
} else {
multiTapRightClick.checked = true
}
}
onCurrentChanged: {
function syncCurrent() {
if (enabled && !root.loading) {
touchpad.lmrTapButtonMap = itemAt(1).checked
touchpad.lmrTapButtonMap = multiTapMiddleClick.checked
root.changeSignal()
}
}
Controls.RadioButton {
id: multiTapRightClick
// text: is handled dynamically on load.
hoverEnabled: true
Controls.ToolTip {
id: multiTapRightClickToolTip
visible: parent.hovered
delay: 1000
// text: is handled dynamically on load.
}
onCheckedChanged: multiTap.syncCurrent()
}
Controls.RadioButton {
id: multiTapMiddleClick
// text: is handled dynamically on load.
hoverEnabled: true
Controls.ToolTip {
id: multiTapMiddleClickToolTip
visible: parent.hovered
delay: 1000
// text: is handled dynamically on load.
}
onCheckedChanged: multiTap.syncCurrent()
}
}
Kirigami.Separator {
}
// Scrolling
ExclGroupBox {
Layouts.ColumnLayout {
Kirigami.FormData.label: i18n("Scrolling:")
id: scrollmethod
model: [i18n("Two fingers"), i18n("Touchpad edges")]
Kirigami.FormData.buddyFor: scrollMethodTwoFingers
id: scrollMethod
spacing: Kirigami.Units.smallSpacing
function load() {
itemAt(0).enabled = touchpad.supportsScrollTwoFinger
itemAt(1).enabled = touchpad.supportsScrollEdge
var toCheck = 0
if (itemAt(0).enabled && touchpad.scrollTwoFinger) {
toCheck = 0
} else if (itemAt(1).enabled && touchpad.scrollEdge) {
toCheck = 1
}
itemAt(0).tooltiptext = i18n("Slide with two fingers scrolls.")
itemAt(1).tooltiptext = i18n("Slide on the touchpad edges scrolls.")
scrollMethodTwoFingers.enabled = touchpad.supportsScrollTwoFinger
scrollMethodTouchpadEdges.enabled = touchpad.supportsScrollEdge
itemAt(toCheck).checked = formLayout.enabled
if(scrollMethodTouchpadEdges.enabled && touchpad.scrollEdge) {
scrollMethodTouchpadEdges.checked = formLayout.enabled
} else {
scrollMethodTwoFingers.checked = formLayout.enabled
}
}
onCurrentChanged: {
function syncCurrent() {
if (enabled && !root.loading) {
touchpad.scrollTwoFinger = itemAt(0).checked
touchpad.scrollEdge = itemAt(1).checked
touchpad.scrollTwoFinger = scrollMethodTwoFingers.checked
touchpad.scrollEdge = scrollMethodTouchpadEdges.checked
root.changeSignal()
}
loading = true
naturalScroll.load()
loading = false
}
Controls.RadioButton {
id: scrollMethodTwoFingers
text: i18n("Two fingers")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Slide with two fingers scrolls.")
visible: parent.hovered
delay: 1000
}
}
Controls.RadioButton {
id: scrollMethodTouchpadEdges
text: i18n("Touchpad edges")
hoverEnabled: true
Controls.ToolTip {
text: i18n("Slide on the touchpad edges scrolls.")
visible: parent.hovered
delay: 1000
}
onCheckedChanged: scrollMethod.syncCurrent()
}
}
Controls.CheckBox {
......@@ -457,8 +549,11 @@ Kirigami.Page {
}
}
ToolTip {
hoverEnabled: true
Controls.ToolTip {
text: i18n("Touchscreen like scrolling.")
visible: parent.hovered
delay: 1000
}