/*SPDX-FileCopyrightText: 2024 Joshua Goins <joshua.goins@kdab.com>SPDX-License-Identifier: GPL-2.0-or-later*/import QtQuickimport QtQuick.Layoutsimport QtQuick.Controls as QQC2import org.kde.kirigami as Kirigamiimport org.kde.plasma.tablet.kcm as KCMimport org.kde.kcmutilsimport org.kde.kquickcontrolsKirigami.Dialog {id: actionDialogproperty KCM.inputSequence inputSequenceproperty string nameproperty bool supportsPenButtonproperty bool supportsRelativeEventssignal gotInputSequence(sequence: KCM.inputSequence)title: supportsRelativeEvents ?i18ndc("kcm_tablet", "@title Select the action for the tablet dial", "Select Dial/Ring Action"): i18ndc("kcm_tablet", "@title Select the action for the tablet button", "Select Button Action")modal: truemaximumWidth: Kirigami.Units.gridUnit * 20padding: Kirigami.Units.largeSpacingstandardButtons: QQC2.Dialog.Ok | QQC2.Dialog.CancelshowCloseButton: falseonAccepted: gotInputSequence(inputSequence)function refreshDialogData(): void {switch (inputSequence.type) {case KCM.InputSequence.Disabled:disabledRadio.checked = true;break;case KCM.InputSequence.Keyboard:keyboardRadio.checked = true;seq.keySequence = inputSequence.keySequence();break;case KCM.InputSequence.RelativeKeyboard:relativeKeyboardRadio.checked = true;upSeq.keySequence = inputSequence.upKeySequence();downSeq.keySequence = inputSequence.downKeySequence();thresholdSlider.value = inputSequence.threshold();break;case KCM.InputSequence.Mouse:mouseRadio.checked = true;clickCombo.currentIndex = clickCombo.indexOfValue(inputSequence.mouseButton());const modifiers = actionDialog.inputSequence.keyboardModifiers();const checkFlag = (flag) => (modifiers & flag) === flag;ctrlCheckbox.checked = checkFlag(Qt.ControlModifier);altCheckbox.checked = checkFlag(Qt.AltModifier);metaCheckbox.checked = checkFlag(Qt.MetaModifier);shiftCheckbox.checked = checkFlag(Qt.ShiftModifier);break;case KCM.InputSequence.Pen:penRadio.checked = true;break;case KCM.InputSequence.Scroll:scrollRadio.checked = true;break;case KCM.InputSequence.ApplicationDefined:applicationRadio.checked = true;break;}}ColumnLayout {spacing: Kirigami.Units.smallSpacingQQC2.Label {text: actionDialog.supportsRelativeEvents ?i18ndc("kcm_tablet", "@info %1 is the 'pad button %1' or 'pen button 1/2/3' strings", "Choose what action will be taken when rotating %1:", actionDialog.name): i18ndc("kcm_tablet", "@info %1 is the 'pad button %1' or 'pen button 1/2/3' strings", "Choose what action will be taken when pressing %1:", actionDialog.name)wrapMode: Text.WordWrapLayout.fillWidth: true}QQC2.ButtonGroup { id: radioGroup }QQC2.RadioButton {id: applicationRadioreadonly property int index: 0icon.name: "applications-all-symbolic"text: i18ndc("kcm_tablet", "@option:radio Set this action to an application-defined type", "Defer to application")QQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.ApplicationDefined;refreshDialogData();}}QQC2.RadioButton {id: keyboardRadioreadonly property int index: 1icon.name: "input-keyboard-symbolic"text: i18ndc("kcm_tablet", "@option:radio Set this action to a keyboard type", "Send keyboard key")visible: !actionDialog.supportsRelativeEventsQQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.Keyboard;refreshDialogData();}}QQC2.RadioButton {id: relativeKeyboardRadioreadonly property int index: 2icon.name: "input-keyboard-symbolic"text: i18ndc("kcm_tablet", "@option:radio Set this action to a up/down keyboard type", "Send keyboard keys")visible: actionDialog.supportsRelativeEventsQQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.RelativeKeyboard;refreshDialogData();}}QQC2.RadioButton {id: mouseRadioreadonly property int index: 3text: i18ndc("kcm_tablet", "@option:radio Set this action to a mouse type", "Send mouse button click")icon.name: "input-mouse-symbolic"visible: !actionDialog.supportsRelativeEventsQQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.Mouse;refreshDialogData();}}QQC2.RadioButton {id: penRadioreadonly property int index: 4text: i18ndc("kcm_tablet", "@option:radio Set this action to a pen button type", "Send pen button")icon.name: "tool_pen-symbolic"visible: actionDialog.supportsPenButtonenabled: visibleQQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.Pen;refreshDialogData();}}QQC2.RadioButton {id: scrollRadioreadonly property int index: 5text: i18ndc("kcm_tablet", "@option:radio Set this action to a scroll wheel type type", "Act as scroll wheel")icon.name: "input-mouse-click-middle"visible: actionDialog.supportsRelativeEventsenabled: visibleQQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.Scroll;refreshDialogData();}}QQC2.RadioButton {id: disabledRadioreadonly property int index: 6icon.name: "action-unavailable-symbolic"text: i18ndc("kcm_tablet", "@option:radio Disable this action", "Do nothing")QQC2.ButtonGroup.group: radioGrouponToggled: {inputSequence.type = KCM.InputSequence.Disabled;refreshDialogData();}}QQC2.MenuSeparator {Layout.fillWidth: true}StackLayout {currentIndex: radioGroup.checkedButton?.index ?? 0QQC2.Label {id: applicationViewtext: i18ndc("kcm_tablet", "@info", "This tablet button is forwarded to the focused application, which can decide how to handle it." )wrapMode: Text.WordWrapLayout.fillWidth: true}KeySequenceItem {id: seqshowCancelButton: truepatterns: ShortcutPattern.Modifier | ShortcutPattern.Key | ShortcutPattern.ModifierAndKeymultiKeyShortcutsAllowed: falsecheckForConflictsAgainst: ShortcutType.NoneonCaptureFinished: actionDialog.inputSequence.setKeySequence(keySequence)}Kirigami.FormLayout {id: relativeKeyboardViewKeySequenceItem {id: upSeqshowCancelButton: truepatterns: ShortcutPattern.Modifier | ShortcutPattern.Key | ShortcutPattern.ModifierAndKeymultiKeyShortcutsAllowed: falsecheckForConflictsAgainst: ShortcutType.NoneonCaptureFinished: actionDialog.inputSequence.setUpKeySequence(keySequence)Kirigami.FormData.label: i18ndc("kcm_tablet", "@label prefix for configuring Keybind to send when dial/ring is turned upwards", "Clockwise:")}KeySequenceItem {id: downSeqshowCancelButton: truepatterns: ShortcutPattern.Modifier | ShortcutPattern.Key | ShortcutPattern.ModifierAndKeymultiKeyShortcutsAllowed: falsecheckForConflictsAgainst: ShortcutType.NoneonCaptureFinished: actionDialog.inputSequence.setDownKeySequence(keySequence)Kirigami.FormData.label: i18ndc("kcm_tablet", "@label prefix for configuring Keybind to send when dial/ring is turned downwards", "Counterclockwise:")}QQC2.Slider {id: thresholdSliderfrom: 5400 // or about 45 degreesto: 120 // or about 1 degreesstepSize: 120Kirigami.StyleHints.tickMarkStepSize: 120snapMode: QQC2.Slider.SnapOnReleaseonMoved: actionDialog.inputSequence.setThreshold(value)Kirigami.FormData.label: i18ndc("kcm_tablet", "@label:slider Speed for how often this dial/ring should emit key events", "Speed:")Layout.fillWidth: true}}ColumnLayout {id: mouseViewspacing: Kirigami.Units.smallSpacingQQC2.ComboBox {id: clickCombotextRole: "text"valueRole: "value"model: [{ value: Qt.LeftButton, text: i18ndc("kcm_tablet", "@action:inmenu Left mouse click", "Left-click") },{ value: Qt.MiddleButton, text: i18ndc("kcm_tablet", "@action:inmenu Middle mouse click", "Middle-click") },{ value: Qt.RightButton, text: i18ndc("kcm_tablet", "@action:inmenu Right mouse click", "Right-click") }]onActivated: actionDialog.inputSequence.setMouseButton(currentValue)}RowLayout {spacing: Kirigami.Units.largeSpacingcomponent ModifierCheckBox: QQC2.CheckBox {required property /*Qt::KeyboardModifier*/ int modifieronToggled: {let modifiers = actionDialog.inputSequence.keyboardModifiers();if (checked) {modifiers |= modifier;} else {modifiers &= ~modifier;}actionDialog.inputSequence.setKeyboardModifiers(modifiers);}}ModifierCheckBox {id: ctrlCheckboxtext: i18ndc("kcm_tablet", "@option:check The ctrl modifier on the keyboard", "Ctrl")modifier: Qt.ControlModifier}ModifierCheckBox {id: altCheckboxtext: i18ndc("kcm_tablet", "@option:check The alt modifier on the keyboard", "Alt")modifier: Qt.AltModifier}ModifierCheckBox {id: metaCheckboxtext: i18ndc("kcm_tablet", "@option:check The meta modifier on the keyboard", "Meta")modifier: Qt.MetaModifier}ModifierCheckBox {id: shiftCheckboxtext: i18ndc("kcm_tablet", "@option:check The shift modifier on the keyboard", "Shift")modifier: Qt.ShiftModifier}}}ColumnLayout {id: penButtonViewspacing: Kirigami.Units.smallSpacingQQC2.ComboBox {id: penButtonCombotextRole: "text"valueRole: "value"model: [{ value: 0, text: i18ndc("kcm_tablet", "@action:inmenu Stylus button", "Button 1") },{ value: 1, text: i18ndc("kcm_tablet", "@action:inmenu Stylus button", "Button 2") },{ value: 2, text: i18ndc("kcm_tablet", "@action:inmenu Stylus button", "Button 3") }]onActivated: actionDialog.inputSequence.setPenButton(currentValue)}}QQC2.Label {id: scrollViewtext: i18ndc("kcm_tablet", "@info", "Act like a scroll wheel on a mouse.")wrapMode: Text.WordWrapLayout.fillWidth: true}QQC2.Label {id: disabledViewtext: i18ndc("kcm_tablet", "@info", "This button is disabled and will not do anything.")wrapMode: Text.WordWrapLayout.fillWidth: true}}}}