Warning, /plasma/plasma-desktop/kcms/touchpad/kcm/libinput/touchpad.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2017 Roman Gilg <subdiff@gmail.com>
0003     SPDX-FileCopyrightText: 2018 Furkan Tokac <furkantokac34@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 import QtQuick
0009 import QtQuick.Controls as QQC2
0010 import QtQuick.Layouts
0011 
0012 import org.kde.kcmutils as KCM
0013 import org.kde.kirigami as Kirigami
0014 
0015 import org.kde.touchpad.kcm
0016 
0017 KCM.SimpleKCM {
0018     id: root
0019 
0020     spacing: Kirigami.Units.smallSpacing
0021 
0022     property alias deviceIndex: deviceSelector.currentIndex
0023     signal changeSignal()
0024 
0025     property QtObject touchpad
0026     property int touchpadCount: backend.touchpadCount
0027 
0028     property bool loading: false
0029 
0030     function resetModel(index) {
0031         touchpadCount = backend.touchpadCount
0032         formLayout.enabled = touchpadCount
0033         deviceSelector.enabled = touchpadCount > 1
0034 
0035         loading = true
0036         if (touchpadCount) {
0037             touchpad = deviceModel[index]
0038             deviceSelector.model = deviceModel
0039             deviceSelector.currentIndex = index
0040         } else {
0041             deviceSelector.model = [""]
0042         }
0043         loading = false
0044     }
0045 
0046     function syncValuesFromBackend() {
0047         loading = true
0048 
0049         deviceEnabled.load()
0050         dwt.load()
0051         leftHanded.load()
0052         middleEmulation.load()
0053         accelSpeedSpinbox.load()
0054         accelSpeedSlider.load()
0055         accelProfile.load()
0056         tapToClick.load()
0057         tapAndDrag.load()
0058         tapAndDragLock.load()
0059         multiTap.load()
0060         scrollMethod.load()
0061         naturalScroll.load()
0062         scrollFactor.load()
0063         rightClickMethod.load()
0064         middleClickMethod.load()
0065         disableHorizontalScrolling.load()
0066 
0067         loading = false
0068     }
0069 
0070     header: Kirigami.InlineMessage {
0071         id: inlineMessage
0072     }
0073 
0074     Connections {
0075         target: TouchpadConfig
0076 
0077         function onShowMessage(message, type) {
0078 
0079             if (touchpadCount === 0) {
0080                 return
0081             }
0082 
0083             if (message.length !== 0) {
0084                 inlineMessage.text = message
0085                 inlineMessage.type = type
0086                 inlineMessage.visible = true
0087             } else {
0088                 inlineMessage.visible = false
0089             }
0090         }
0091     }
0092 
0093     Kirigami.PlaceholderMessage {
0094         text: i18nd("kcm_touchpad", "No touchpad found")
0095         anchors.centerIn: parent
0096         visible: touchpadCount === 0
0097         width: parent.width - (Kirigami.Units.largeSpacing * 4)
0098     }
0099 
0100 
0101     Kirigami.FormLayout {
0102         id: formLayout
0103 
0104         visible: touchpadCount > 0
0105 
0106         // Device
0107         QQC2.ComboBox {
0108             Kirigami.FormData.label: i18nd("kcm_touchpad", "Device:")
0109             id: deviceSelector
0110 
0111             visible: touchpadCount > 1
0112             Layout.fillWidth: true
0113             model: deviceModel
0114             textRole: "name"
0115 
0116             onCurrentIndexChanged: {
0117                 if (touchpadCount) {
0118                     touchpad = deviceModel[currentIndex]
0119                     if (!loading) {
0120                         changeSignal()
0121                     }
0122                 }
0123                 root.syncValuesFromBackend()
0124             }
0125         }
0126 
0127         Item {
0128             Kirigami.FormData.isSection: false
0129         }
0130 
0131         // General settings
0132         QQC2.CheckBox {
0133             id: deviceEnabled
0134             Kirigami.FormData.label: i18nd("kcm_touchpad", "General:")
0135             text: i18nd("kcm_touchpad", "Device enabled")
0136 
0137             hoverEnabled: true
0138             QQC2.ToolTip {
0139                 text: i18nd("kcm_touchpad", "Accept input through this device.")
0140                 visible: parent.hovered
0141                 delay: 1000
0142             }
0143 
0144             function load() {
0145                 if (!formLayout.enabled) {
0146                     checked = false
0147                     return
0148                 }
0149                 enabled = touchpad.supportsDisableEvents
0150                 checked = enabled && touchpad.enabled
0151             }
0152 
0153             onCheckedChanged: {
0154                 if (enabled && !root.loading) {
0155                     touchpad.enabled = checked
0156                     root.changeSignal()
0157                 }
0158             }
0159         }
0160 
0161         QQC2.CheckBox {
0162             id: dwt
0163             text: i18nd("kcm_touchpad", "Disable while typing")
0164 
0165             hoverEnabled: true
0166             QQC2.ToolTip {
0167                 text: i18nd("kcm_touchpad", "Disable touchpad while typing to prevent accidental inputs.")
0168                 visible: parent.hovered
0169                 delay: 1000
0170             }
0171 
0172             function load() {
0173                 if (!formLayout.enabled) {
0174                     checked = false
0175                     return
0176                 }
0177                 enabled = touchpad.supportsDisableWhileTyping
0178                 checked = enabled && touchpad.disableWhileTyping
0179             }
0180 
0181             onCheckedChanged: {
0182                 if (enabled && !root.loading) {
0183                     touchpad.disableWhileTyping = checked
0184                     root.changeSignal()
0185                 }
0186             }
0187         }
0188 
0189         QQC2.CheckBox {
0190             id: leftHanded
0191             text: i18nd("kcm_touchpad", "Left handed mode")
0192 
0193             hoverEnabled: true
0194             QQC2.ToolTip {
0195                 text: i18nd("kcm_touchpad", "Swap left and right buttons.")
0196                 visible: parent.hovered
0197                 delay: 1000
0198             }
0199 
0200             function load() {
0201                 if (!formLayout.enabled) {
0202                     checked = false
0203                     return
0204                 }
0205                 enabled = touchpad.supportsLeftHanded
0206                 checked = enabled && touchpad.leftHanded
0207             }
0208 
0209             onCheckedChanged: {
0210                 if (enabled && !root.loading) {
0211                     touchpad.leftHanded = checked
0212                     root.changeSignal()
0213                 }
0214             }
0215         }
0216 
0217         QQC2.CheckBox {
0218             id: middleEmulation
0219             text: i18nd("kcm_touchpad", "Press left and right buttons for middle click")
0220 
0221             hoverEnabled: true
0222             QQC2.ToolTip {
0223                 text: i18nd("kcm_touchpad", "Clicking left and right button simultaneously sends middle button click.")
0224                 visible: parent.hovered
0225                 delay: 1000
0226             }
0227 
0228             function load() {
0229                 if (!formLayout.enabled) {
0230                     checked = false
0231                     return
0232                 }
0233                 enabled = touchpad.supportsMiddleEmulation
0234                 checked = enabled && touchpad.middleEmulation
0235             }
0236 
0237             onCheckedChanged: {
0238                 if (enabled && !root.loading) {
0239                     touchpad.middleEmulation = checked
0240                     root.changeSignal()
0241                 }
0242                 loading = true
0243                 middleClickMethod.load()
0244                 loading = false
0245             }
0246         }
0247 
0248         Item {
0249             Kirigami.FormData.isSection: false
0250         }
0251 
0252         // Acceleration
0253         RowLayout {
0254             Kirigami.FormData.label: i18nd("kcm_touchpad", "Pointer speed:")
0255             id: accelSpeed
0256             Layout.fillWidth: true
0257 
0258             function onAccelSpeedChanged(val) {
0259                 // check slider
0260                 if (val !== accelSpeedSlider.accelSpeedValue) {
0261                     accelSpeedSlider.accelSpeedValue = val
0262                     accelSpeedSlider.value = Math.round(6 + (val / 100) / 0.2)
0263                 }
0264 
0265                 // check spinbox
0266                 if (val !== accelSpeedSpinbox.value) {
0267                     accelSpeedSpinbox.value = val
0268                 }
0269 
0270                 // check libinput accelspeed
0271                 if ((val / 100) !== touchpad.pointerAcceleration) {
0272                     touchpad.pointerAcceleration = val / 100
0273                     root.changeSignal()
0274                 }
0275             }
0276 
0277             QQC2.Slider {
0278                 id: accelSpeedSlider
0279                 Layout.fillWidth: true
0280 
0281                 from: 1
0282                 to: 11
0283                 stepSize: 1
0284                 property int accelSpeedValue: 0 // [-100, 100]
0285 
0286                 function load() {
0287                     enabled = touchpad.supportsPointerAcceleration
0288                     if (!enabled) {
0289                         return
0290                     }
0291 
0292                     accelSpeedValue = Math.round(touchpad.pointerAcceleration * 100)
0293 
0294                     // convert libinput pointer acceleration range [-1, 1] to slider range [1, 11]
0295                     value = Math.round(6 + touchpad.pointerAcceleration / 0.2)
0296                 }
0297 
0298                 onValueChanged: {
0299                     if (touchpad != undefined && enabled && !root.loading) {
0300                         // convert slider range [1, 11] to accelSpeedValue range [-100, 100]
0301                         accelSpeedValue = Math.round(((value - 6) * 0.2) * 100)
0302 
0303                         accelSpeed.onAccelSpeedChanged(accelSpeedValue)
0304                     }
0305                 }
0306             }
0307 
0308             QQC2.SpinBox {
0309                 id: accelSpeedSpinbox
0310 
0311                 Layout.minimumWidth: Kirigami.Units.gridUnit * 4
0312 
0313                 from: -100
0314                 to: 100
0315                 stepSize: 1
0316                 editable: true
0317 
0318                 validator: DoubleValidator {
0319                     bottom: accelSpeedSpinbox.from
0320                     top: accelSpeedSpinbox.to
0321                 }
0322 
0323                 function load() {
0324                     enabled = touchpad.supportsPointerAcceleration
0325                     if (!enabled) {
0326                         return
0327                     }
0328 
0329                     // if existing configuration or another application set a value with more than 2 decimals
0330                     // we reduce the precision to 2
0331                     value = Math.round(touchpad.pointerAcceleration * 100)
0332                 }
0333 
0334                 onValueChanged: {
0335                     if (touchpad != undefined && enabled && !root.loading) {
0336                         accelSpeed.onAccelSpeedChanged(value)
0337                     }
0338                 }
0339 
0340                 textFromValue: function(val, locale) {
0341                     return Number(val / 100).toLocaleString(locale, "f", 2)
0342                 }
0343 
0344                 valueFromText: function(text, locale) {
0345                     return Number.fromLocaleString(locale, text) * 100
0346                 }
0347             }
0348         }
0349 
0350         ColumnLayout {
0351             id: accelProfile
0352             Kirigami.FormData.label: i18nd("kcm_touchpad", "Pointer acceleration:")
0353             Kirigami.FormData.buddyFor: accelProfileFlat
0354             spacing: Kirigami.Units.smallSpacing
0355 
0356             function load() {
0357                 enabled = touchpad.supportsPointerAccelerationProfileAdaptive
0358 
0359                 if (!enabled) {
0360                     accelProfile.visible = false
0361                     accelProfileFlat.checked = false
0362                     accelProfileAdaptive.checked = false
0363                     return
0364                 }
0365 
0366                 if(touchpad.pointerAccelerationProfileAdaptive) {
0367                     accelProfileAdaptive.checked = true
0368                 } else {
0369                     accelProfileFlat.checked = true
0370                 }
0371             }
0372 
0373             function syncCurrent() {
0374                 if (enabled && !root.loading) {
0375                     touchpad.pointerAccelerationProfileFlat = accelProfileFlat.checked
0376                     touchpad.pointerAccelerationProfileAdaptive = accelProfileAdaptive.checked
0377                     root.changeSignal()
0378                 }
0379             }
0380 
0381             QQC2.RadioButton {
0382                 id: accelProfileFlat
0383                 text: i18nd("kcm_touchpad", "None")
0384 
0385                 hoverEnabled: true
0386                 QQC2.ToolTip {
0387                     text: i18nd("kcm_touchpad", "Cursor moves the same distance as finger.")
0388                     visible: parent.hovered
0389                     delay: 1000
0390                 }
0391                 onCheckedChanged: accelProfile.syncCurrent()
0392             }
0393 
0394             QQC2.RadioButton {
0395                 id: accelProfileAdaptive
0396                 text: i18nd("kcm_touchpad", "Standard")
0397 
0398                 hoverEnabled: true
0399                 QQC2.ToolTip {
0400                     text: i18nd("kcm_touchpad", "Cursor travel distance depends on movement speed of finger.")
0401                     visible: parent.hovered
0402                     delay: 1000
0403                 }
0404                 onCheckedChanged: accelProfile.syncCurrent()
0405             }
0406         }
0407 
0408         Item {
0409             Kirigami.FormData.isSection: false
0410         }
0411 
0412         // Tapping
0413         QQC2.CheckBox {
0414             id: tapToClick
0415             Kirigami.FormData.label: i18nd("kcm_touchpad", "Tapping:")
0416             text: i18nd("kcm_touchpad", "Tap-to-click")
0417 
0418             hoverEnabled: true
0419             QQC2.ToolTip {
0420                 text: i18nd("kcm_touchpad", "Single tap is left button click.")
0421                 visible: parent.hovered
0422                 delay: 1000
0423             }
0424 
0425             function load() {
0426                 enabled = touchpad.tapFingerCount > 0
0427                 checked = enabled && touchpad.tapToClick
0428             }
0429 
0430             function updateDependents() {
0431                 loading = true
0432                 tapAndDrag.load()
0433                 tapAndDragLock.load()
0434                 multiTap.load()
0435                 loading = false
0436             }
0437 
0438             onCheckedChanged: {
0439                 if (enabled && !root.loading) {
0440                     touchpad.tapToClick = checked
0441                     updateDependents()
0442                     root.changeSignal()
0443                 }
0444             }
0445         }
0446 
0447         QQC2.CheckBox {
0448             id: tapAndDrag
0449             text: i18nd("kcm_touchpad", "Tap-and-drag")
0450 
0451             hoverEnabled: true
0452             QQC2.ToolTip {
0453                 text: i18nd("kcm_touchpad", "Sliding over touchpad directly after tap drags.")
0454                 visible: parent.hovered
0455                 delay: 1000
0456             }
0457 
0458             function load() {
0459                 enabled = touchpad.tapFingerCount > 0 && tapToClick.checked
0460                 checked = enabled && touchpad.tapAndDrag
0461             }
0462 
0463             function updateDependents() {
0464                 loading = true
0465                 tapAndDragLock.load()
0466                 loading = false
0467             }
0468 
0469             onCheckedChanged: {
0470                 if (enabled && !root.loading) {
0471                     touchpad.tapAndDrag = checked
0472                     updateDependents()
0473                     root.changeSignal()
0474                 }
0475             }
0476         }
0477 
0478         QQC2.CheckBox {
0479             id: tapAndDragLock
0480             text: i18nd("kcm_touchpad", "Tap-and-drag lock")
0481 
0482             hoverEnabled: true
0483             QQC2.ToolTip {
0484                 text: i18nd("kcm_touchpad", "Dragging continues after a short finger lift.")
0485                 visible: parent.hovered
0486                 delay: 1000
0487             }
0488 
0489             function load() {
0490                 enabled = touchpad.tapFingerCount > 0 && tapAndDrag.checked
0491                 checked = enabled && touchpad.tapDragLock
0492             }
0493 
0494             onCheckedChanged: {
0495                 if (enabled && !root.loading) {
0496                     touchpad.tapDragLock = checked
0497                     root.changeSignal()
0498                 }
0499             }
0500         }
0501 
0502         ColumnLayout {
0503             id: multiTap
0504             Kirigami.FormData.label: i18nd("kcm_touchpad", "Two-finger tap:")
0505             Kirigami.FormData.buddyFor: multiTapRightClick
0506 
0507             spacing: Kirigami.Units.smallSpacing
0508             // hide initially
0509             visible: false
0510 
0511             function load() {
0512                 visible = touchpad.supportsLmrTapButtonMap
0513                 enabled = touchpad.supportsLmrTapButtonMap && tapToClick.checked
0514                 if (touchpad.tapFingerCount > 2) {
0515                     multiTapRightClick.text = i18nd("kcm_touchpad", "Right-click (three-finger tap to middle-click)")
0516                     multiTapRightClickToolTip.text = i18nd("kcm_touchpad", "Tap with two fingers to right-click, tap with three fingers to middle-click.")
0517 
0518                     multiTapMiddleClick.text = i18nd("kcm_touchpad", "Middle-click (three-finger tap right-click)")
0519                     multiTapMiddleClickToolTip.text = i18nd("kcm_touchpad", "Tap with two fingers to middle-click, tap with three fingers to right-click.")
0520                 } else {
0521                     multiTapRightClick.text = i18nd("kcm_touchpad", "Right-click")
0522                     multiTapRightClickToolTip.text = i18nd("kcm_touchpad", "Tap with two fingers to right-click.")
0523 
0524                     multiTapMiddleClick.text = i18nd("kcm_touchpad", "Middle-click")
0525                     multiTapMiddleClickToolTip.text = i18nd("kcm_touchpad", "Tap with two fingers to middle-click.")
0526                 }
0527 
0528                 if (!enabled) {
0529                     multiTapRightClick.checked = false
0530                     multiTapMiddleClick.checked = false
0531                     return
0532                 }
0533 
0534                 if (touchpad.lmrTapButtonMap) {
0535                     multiTapMiddleClick.checked = true
0536                 } else {
0537                     multiTapRightClick.checked = true
0538                 }
0539             }
0540 
0541             function syncCurrent() {
0542                 if (enabled && !root.loading) {
0543                     touchpad.lmrTapButtonMap = multiTapMiddleClick.checked
0544                     root.changeSignal()
0545                 }
0546             }
0547 
0548             QQC2.RadioButton {
0549                 id: multiTapRightClick
0550                 // text: is handled dynamically on load.
0551 
0552                 hoverEnabled: true
0553                 QQC2.ToolTip {
0554                     id: multiTapRightClickToolTip
0555                     visible: parent.hovered
0556                     delay: 1000
0557                     // text: is handled dynamically on load.
0558                 }
0559                 onCheckedChanged: multiTap.syncCurrent()
0560             }
0561 
0562             QQC2.RadioButton {
0563                 id: multiTapMiddleClick
0564                 // text: is handled dynamically on load.
0565 
0566                 hoverEnabled: true
0567                 QQC2.ToolTip {
0568                     id: multiTapMiddleClickToolTip
0569                     visible: parent.hovered
0570                     delay: 1000
0571                     // text: is handled dynamically on load.
0572                 }
0573                 onCheckedChanged: multiTap.syncCurrent()
0574             }
0575         }
0576 
0577         Item {
0578             Kirigami.FormData.isSection: false
0579         }
0580 
0581         // Scrolling
0582         ColumnLayout {
0583             id: scrollMethod
0584             Kirigami.FormData.label: i18nd("kcm_touchpad", "Scrolling:")
0585             Kirigami.FormData.buddyFor: scrollMethodTwoFingers
0586 
0587             spacing: Kirigami.Units.smallSpacing
0588 
0589             function load() {
0590                 scrollMethodTwoFingers.enabled = touchpad.supportsScrollTwoFinger
0591                 scrollMethodTouchpadEdges.enabled = touchpad.supportsScrollEdge
0592 
0593                 if(scrollMethodTouchpadEdges.enabled && touchpad.scrollEdge) {
0594                     scrollMethodTouchpadEdges.checked = formLayout.enabled
0595                 } else {
0596                     scrollMethodTwoFingers.checked = formLayout.enabled
0597                 }
0598             }
0599 
0600             function syncCurrent() {
0601                 if (enabled && !root.loading) {
0602                     touchpad.scrollTwoFinger = scrollMethodTwoFingers.checked
0603                     touchpad.scrollEdge = scrollMethodTouchpadEdges.checked
0604                     root.changeSignal()
0605                 }
0606                 loading = true
0607                 naturalScroll.load()
0608                 loading = false
0609             }
0610 
0611             QQC2.RadioButton {
0612                 id: scrollMethodTwoFingers
0613                 text: i18nd("kcm_touchpad", "Two fingers")
0614 
0615                 hoverEnabled: true
0616                 QQC2.ToolTip {
0617                     text: i18nd("kcm_touchpad", "Slide with two fingers scrolls.")
0618                     visible: parent.hovered
0619                     delay: 1000
0620                 }
0621             }
0622 
0623             QQC2.RadioButton {
0624                 id: scrollMethodTouchpadEdges
0625                 text: i18nd("kcm_touchpad", "Touchpad edges")
0626 
0627                 hoverEnabled: true
0628                 QQC2.ToolTip {
0629                     text: i18nd("kcm_touchpad", "Slide on the touchpad edges scrolls.")
0630                     visible: parent.hovered
0631                     delay: 1000
0632                 }
0633                 onCheckedChanged: scrollMethod.syncCurrent()
0634             }
0635         }
0636 
0637         QQC2.CheckBox {
0638             id: naturalScroll
0639             text: i18nd("kcm_touchpad", "Invert scroll direction (Natural scrolling)")
0640 
0641             function load() {
0642                 enabled = touchpad.supportsNaturalScroll
0643                 checked = enabled && touchpad.naturalScroll
0644             }
0645 
0646             onCheckedChanged: {
0647                 if (enabled && !root.loading) {
0648                     touchpad.naturalScroll = checked
0649                     root.changeSignal()
0650                 }
0651             }
0652 
0653             hoverEnabled: true
0654             QQC2.ToolTip {
0655                 text: i18nd("kcm_touchpad", "Touchscreen like scrolling.")
0656                 visible: parent.hovered
0657                 delay: 1000
0658             }
0659         }
0660 
0661         QQC2.CheckBox {
0662             id: disableHorizontalScrolling
0663             text: i18nd("kcm_touchpad", "Disable horizontal scrolling")
0664 
0665             function load() {
0666                 visible = touchpad.supportsHorizontalScrolling
0667                 enabled = touchpad.supportsHorizontalScrolling
0668                 checked = enabled && !touchpad.horizontalScrolling
0669             }
0670 
0671             onCheckedChanged: {
0672                 if (enabled && !root.loading) {
0673                     touchpad.horizontalScrolling = !checked
0674                     root.changeSignal()
0675                 }
0676             }
0677 
0678             hoverEnabled: true
0679             QQC2.ToolTip {
0680                 text: i18nd("kcm_touchpad", "Disable horizontal scrolling")
0681                 visible: parent.hovered
0682                 delay: 1000
0683             }
0684         }
0685 
0686         // Scroll Speed aka scroll Factor
0687         GridLayout {
0688             Kirigami.FormData.label: i18nd("kcm_touchpad", "Scrolling speed:")
0689             Kirigami.FormData.buddyFor: scrollFactor
0690             Layout.fillWidth: true
0691             visible: touchpad.supportsScrollFactor
0692 
0693             columns: 3
0694 
0695             QQC2.Slider {
0696                 id: scrollFactor
0697                 Layout.fillWidth: true
0698 
0699                 from: 0
0700                 to: 14
0701                 stepSize: 1
0702 
0703                 readonly property list<real> values: [
0704                     0.1,
0705                     0.3,
0706                     0.5,
0707                     0.75,
0708                     1, // default
0709                     1.5,
0710                     2,
0711                     3,
0712                     4,
0713                     5,
0714                     7,
0715                     9,
0716                     12,
0717                     15,
0718                     20
0719                 ]
0720 
0721                 Layout.columnSpan: 3
0722 
0723                 function load() {
0724                     let index = values.indexOf(touchpad.scrollFactor)
0725                     if (index === -1) {
0726                         index = values.indexOf(1);
0727                     }
0728                     value = index
0729                 }
0730 
0731                 onMoved: {
0732                     touchpad.scrollFactor = values[value]
0733                     root.changeSignal()
0734                 }
0735             }
0736 
0737             //row 2
0738             QQC2.Label {
0739                 text: i18ndc("kcm_touchpad", "Slower Scroll", "Slower")
0740                 textFormat: Text.PlainText
0741             }
0742             Item {
0743                 Layout.fillWidth: true
0744             }
0745             QQC2.Label {
0746                 text: i18ndc("kcm_touchpad", "Faster Scroll Speed", "Faster")
0747                 textFormat: Text.PlainText
0748             }
0749         }
0750 
0751         Item {
0752             Kirigami.FormData.isSection: false
0753         }
0754 
0755         ColumnLayout {
0756             id: rightClickMethod
0757             Kirigami.FormData.label: i18nd("kcm_touchpad", "Right-click:")
0758             Kirigami.FormData.buddyFor: rightClickMethodAreas
0759 
0760             spacing: Kirigami.Units.smallSpacing
0761             // hide initially
0762             visible: false
0763 
0764             function load() {
0765                 enabled = touchpad.supportsClickMethodAreas && touchpad.supportsClickMethodClickfinger
0766                 visible = touchpad.supportsClickMethodAreas || touchpad.supportsClickMethodClickfinger
0767 
0768                 rightClickMethodAreas.enabled = touchpad.supportsClickMethodAreas
0769                 rightClickMethodClickfinger.enabled = touchpad.supportsClickMethodClickfinger
0770 
0771                 if (rightClickMethodAreas.enabled && touchpad.clickMethodAreas) {
0772                     rightClickMethodAreas.checked = true
0773                 } else if (rightClickMethodClickfinger.enabled && touchpad.clickMethodClickfinger) {
0774                     rightClickMethodClickfinger.checked = true
0775                 }
0776             }
0777 
0778             function syncCurrent() {
0779                 if (enabled && !root.loading) {
0780                     touchpad.clickMethodAreas = rightClickMethodAreas.checked && rightClickMethodAreas.visible
0781                     touchpad.clickMethodClickfinger = rightClickMethodClickfinger.checked && rightClickMethodClickfinger.visible
0782                     root.changeSignal()
0783                 }
0784                 loading = true
0785                 middleClickMethod.load()
0786                 loading = false
0787             }
0788 
0789             QQC2.RadioButton {
0790                 id: rightClickMethodAreas
0791                 text: i18nd("kcm_touchpad", "Press bottom-right corner")
0792 
0793                 hoverEnabled: true
0794                 QQC2.ToolTip {
0795                     text: i18nd("kcm_touchpad", "Software enabled buttons will be added to bottom portion of your touchpad.")
0796                     visible: parent.hovered
0797                     delay: 1000
0798                 }
0799             }
0800 
0801             QQC2.RadioButton {
0802                 id: rightClickMethodClickfinger
0803                 text: i18nd("kcm_touchpad", "Press anywhere with two fingers")
0804 
0805                 hoverEnabled: true
0806                 QQC2.ToolTip {
0807                     text: i18nd("kcm_touchpad", "Tap with two finger to enable right click.")
0808                     visible: parent.hovered
0809                     delay: 1000
0810                 }
0811                 onCheckedChanged: rightClickMethod.syncCurrent()
0812             }
0813         }
0814 
0815         Item {
0816             Kirigami.FormData.isSection: false
0817         }
0818 
0819         ColumnLayout {
0820             id: middleClickMethod
0821             Kirigami.FormData.label: i18nd("kcm_touchpad", "Middle-click: ")
0822             Kirigami.FormData.buddyFor: middleSoftwareEmulation
0823 
0824             spacing: Kirigami.Units.smallSpacing
0825             visible: noMiddleSoftwareEmulation.visible ||
0826                      middleSoftwareEmulation.visible ||
0827                      clickfingerMiddleInfoBox.visible
0828 
0829             function load() {
0830                 enabled = touchpad.supportsMiddleEmulation
0831                 if (enabled && touchpad.middleEmulation) {
0832                     middleSoftwareEmulation.checked = true
0833                 } else {
0834                     noMiddleSoftwareEmulation.checked = true
0835                 }
0836             }
0837 
0838             function syncCurrent() {
0839                 if (enabled && !root.loading) {
0840                     touchpad.middleEmulation = middleSoftwareEmulation.checked && middleSoftwareEmulation.visible
0841                     root.changeSignal()
0842                 }
0843                 loading = true
0844                 middleEmulation.load()
0845                 loading = false
0846             }
0847 
0848             QQC2.RadioButton {
0849                 id: noMiddleSoftwareEmulation
0850                 text: i18nd("kcm_touchpad", "Press bottom-middle")
0851                 visible: rightClickMethodAreas.checked
0852                 hoverEnabled: true
0853                 QQC2.ToolTip {
0854                     text: i18nd("kcm_touchpad", "Software enabled middle-button will be added to bottom portion of your touchpad.")
0855                     visible: parent.hovered
0856                     delay: 1000
0857                 }
0858             }
0859 
0860             QQC2.RadioButton {
0861                 id: middleSoftwareEmulation
0862                 text: i18nd("kcm_touchpad", "Press bottom left and bottom right corners simultaneously")
0863                 visible: rightClickMethodAreas.checked
0864                 hoverEnabled: true
0865                 QQC2.ToolTip {
0866                     text: i18nd("kcm_touchpad", "Clicking left and right button simultaneously sends middle button click.")
0867                     visible: parent.hovered
0868                     delay: 1000
0869                 }
0870                 onCheckedChanged: middleClickMethod.syncCurrent()
0871             }
0872 
0873             QQC2.CheckBox {
0874                 id: clickfingerMiddleInfoBox
0875                 text: i18nd("kcm_touchpad", "Press anywhere with three fingers")
0876                 checked: true
0877                 enabled: false
0878                 visible: rightClickMethodClickfinger.checked
0879                 hoverEnabled: true
0880                 QQC2.ToolTip {
0881                     text: i18nd("kcm_touchpad", "Press anywhere with three fingers.")
0882                     visible: parent.hovered
0883                     delay: 1000
0884                 }
0885             }
0886         }
0887     }
0888 }