/*SPDX-FileCopyrightText: 2018 Furkan Tokac <furkantokac34@gmail.com>SPDX-FileCopyrightText: 2019 Nate Graham <nate@kde.org>SPDX-License-Identifier: GPL-2.0-or-later*/import QtQuickimport QtQuick.Controls as QQC2import QtQuick.Layoutsimport org.kde.kirigami as Kirigamiimport org.kde.kcmutils as KCMimport org.kde.kwindowsystemKCM.SimpleKCM {implicitWidth: Kirigami.Units.gridUnit * 40headerPaddingEnabled: false // Let the InlineMessage touch the edgesheader: Kirigami.InlineMessage {id: primarySelectionRebootMessageposition: Kirigami.InlineMessage.Position.Headertype: Kirigami.MessageType.Informationtext: i18n("The system must be restarted before changes to the middle-click paste setting can take effect.")visible: falseshowCloseButton: trueactions: [Kirigami.Action {icon.name: "system-reboot"text: i18n("Restart")onTriggered: kcm.requestReboot();}]Connections {target: kcmfunction onPrimarySelectionOptionSaved() {primarySelectionRebootMessage.visible = true;}}}Kirigami.FormLayout {// Visual behavior settingsQQC2.CheckBox {Kirigami.FormData.label: i18n("Visual behavior:")text: i18n("Display informational tooltips on mouse hover")checked: kcm.plasmaSettings.delay > 0onCheckedChanged: kcm.plasmaSettings.delay = (checked ? 0.7 : -1)KCM.SettingStateBinding {configObject: kcm.plasmaSettingssettingName: "delay"}}QQC2.CheckBox {text: i18n("Display visual feedback for status changes")checked: kcm.plasmaSettings.osdEnabledonCheckedChanged: kcm.plasmaSettings.osdEnabled = checkedKCM.SettingStateBinding {configObject: kcm.plasmaSettingssettingName: "osdEnabled"}}Item {Kirigami.FormData.isSection: false}// We want to show the slider in a logarithmic way. ie// move from 4x, 3x, 2x, 1x, 0.5x, 0.25x, 0.125x// 0 is a special case, which means "instant speed / no animations"ColumnLayout {Kirigami.FormData.label: i18n("Animation speed:")Kirigami.FormData.buddyFor: sliderLayout.fillWidth: truespacing: Kirigami.Units.smallSpacingQQC2.Slider {id: sliderLayout.fillWidth: truefrom: -4to: 4stepSize: 0.5snapMode: QQC2.Slider.SnapAlwaysonMoved: kcm.globalsSettings.animationDurationFactor =(value === to) ? 0 : (1.0 / Math.pow(2, value))value: (kcm.globalsSettings.animationDurationFactor === 0)? slider.to: -(Math.log(kcm.globalsSettings.animationDurationFactor) / Math.log(2))KCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "animationDurationFactor"}}RowLayout {spacing: 0QQC2.Label {text: i18nc("Animation speed", "Slow")textFormat: Text.PlainText}Item {Layout.fillWidth: true}QQC2.Label {text: i18nc("Animation speed", "Instant")textFormat: Text.PlainText}}}Item {Kirigami.FormData.isSection: false}RowLayout {Kirigami.FormData.label: i18nc("@label", "Scrolling:")spacing: 0QQC2.CheckBox {text: i18nc("@option:check", "Prefer smooth scrolling")checked: kcm.globalsSettings.smoothScrollonToggled: kcm.globalsSettings.smoothScroll = checkedKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "smoothScroll"}}Kirigami.ContextualHelpButton {toolTipText: i18nc("@info:tooltip", "This setting enables or disables animated transitions when scrolling with a mouse wheel or the keyboard. Some applications may not honor this setting because they either do not support smooth scrolling, or have their own setting for enabling and disabling it.")}}Item {Kirigami.FormData.isSection: true}// Click behavior settingsQQC2.ButtonGroup { id: singleClickGroup }ColumnLayout {Kirigami.FormData.label: i18nc("part of a sentence: 'Clicking files or folders [opens them/selects them]'", "Clicking files or folders:")Kirigami.FormData.buddyFor: doubleClickspacing: 0QQC2.RadioButton {id: doubleClicktext: i18nc("part of a sentence: 'Clicking files or folders selects them'", "Selects them")Accessible.description: doubleClickHelperText.textchecked: !kcm.globalsSettings.singleClickonToggled: kcm.globalsSettings.singleClick = falseQQC2.ButtonGroup.group: singleClickGroupKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "singleClick"extraEnabledConditions: singleClick.enabled}}QQC2.Label {id: doubleClickHelperTextLayout.fillWidth: trueleftPadding: Application.layoutDirection === Qt.LeftToRight ?doubleClick.indicator.width + doubleClick.spacing : doubleClickHelperText.paddingrightPadding: Application.layoutDirection === Qt.RightToLeft ?doubleClick.indicator.width + doubleClick.spacing : doubleClickHelperText.paddingtext: i18n("Open by double-clicking instead")textFormat: Text.PlainTextelide: Text.ElideRightfont: Kirigami.Theme.smallFont}}ColumnLayout {Layout.fillWidth: truespacing: 0QQC2.RadioButton {id: singleClicktext: i18nc("part of a sentence: 'Clicking files or folders opens them'", "Opens them")Accessible.description: singleClickHelperText.textchecked: kcm.globalsSettings.singleClickonToggled: kcm.globalsSettings.singleClick = trueQQC2.ButtonGroup.group: singleClickGroupKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "singleClick"}}QQC2.Label {id: singleClickHelperTextLayout.fillWidth: trueleftPadding: Application.layoutDirection === Qt.LeftToRight ?singleClick.indicator.width + singleClick.spacing : singleClickHelperText.paddingrightPadding: Application.layoutDirection === Qt.RightToLeft ?singleClick.indicator.width + singleClick.spacing : singleClickHelperText.paddingtext: i18n("Select by clicking on item's selection marker")textFormat: Text.PlainTextelide: Text.ElideRightfont: Kirigami.Theme.smallFont}}Item {Kirigami.FormData.isSection: false}// scroll handle settingsQQC2.ButtonGroup { id: scrollHandleBehaviorGroup }QQC2.RadioButton {Kirigami.FormData.label: i18n("Clicking in scrollbar track:")text: i18nc("@radio part of a complete sentence: 'Clicking in scrollbar track scrolls to the clicked location'", "Scrolls to the clicked location")checked: !kcm.globalsSettings.scrollbarLeftClickNavigatesByPageonToggled: kcm.globalsSettings.scrollbarLeftClickNavigatesByPage = falseQQC2.ButtonGroup.group: scrollHandleBehaviorGroupKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "scrollbarLeftClickNavigatesByPage"extraEnabledConditions: scrollbarLeftClickNavigatesByPage.enabled}}ColumnLayout {Layout.fillWidth: truespacing: 0QQC2.RadioButton {id: scrollbarLeftClickNavigatesByPagetext: i18nc("@radio part of a complete sentence: 'Clicking in scrollbar track scrolls one page up or down'", "Scrolls one page up or down")Accessible.description: scrollbarLeftClickNavigatesByPageHelperText.textchecked: kcm.globalsSettings.scrollbarLeftClickNavigatesByPageonToggled: kcm.globalsSettings.scrollbarLeftClickNavigatesByPage = trueQQC2.ButtonGroup.group: scrollHandleBehaviorGroupKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "scrollbarLeftClickNavigatesByPage"}}QQC2.Label {id: scrollbarLeftClickNavigatesByPageHelperTextLayout.fillWidth: trueleftPadding: Application.layoutDirection === Qt.LeftToRight ?scrollbarLeftClickNavigatesByPage.indicator.width + scrollbarLeftClickNavigatesByPage.spacing : scrollbarLeftClickNavigatesByPageHelperText.paddingrightPadding: Application.layoutDirection === Qt.RightToLeft ?scrollbarLeftClickNavigatesByPage.indicator.width + scrollbarLeftClickNavigatesByPage.spacing : scrollbarLeftClickNavigatesByPageHelperText.paddingtext: i18n("Middle-click to scroll to clicked location")textFormat: Text.PlainTextelide: Text.ElideRightfont: Kirigami.Theme.smallFont}}Item {Kirigami.FormData.isSection: truevisible: primarySelectionRadio.visible}QQC2.CheckBox {id: primarySelectionRadioKirigami.FormData.label: i18nc("@label for checkbox, part of a complete sentence: 'Middle-click pastes selected text'", "Middle-click:")visible: KWindowSystem.isPlatformWaylandtext: i18nc("@option:check part of a complete sentence: 'Middle click pastes selected text'", "Pastes selected text")checked: kcm.kwinSettings.primarySelectiononToggled: kcm.kwinSettings.primarySelection = checkedKCM.SettingStateBinding {configObject: kcm.kwinSettingssettingName: "primarySelection"}}Item {Kirigami.FormData.isSection: true}QQC2.ButtonGroup { id: tabletModeBehaviorGroup }RowLayout {Kirigami.FormData.label: i18n("Touch Mode:")QQC2.RadioButton {text: KWindowSystem.isPlatformWayland ? i18nc("As in: 'Touch Mode is automatically enabled as needed'", "Automatically enable as needed") : i18nc("As in: 'Touch Mode is never enabled'", "Never enabled")Accessible.description: touchModeAlwaysOffRadioButtonHelperText.textchecked: kcm.kwinSettings.tabletMode === "auto"onToggled: {if (checked) {kcm.kwinSettings.tabletMode = "auto"}}QQC2.ButtonGroup.group: tabletModeBehaviorGroupKCM.SettingStateBinding {configObject: kcm.kwinSettingssettingName: "tabletMode"}}Kirigami.ContextualHelpButton {visible: KWindowSystem.isPlatformWaylandtoolTipText: i18n("Touch Mode will be automatically activated whenever the system detects a touchscreen but no mouse or touchpad. For example: when a transformable laptop's keyboard is flipped around or detached.")}}QQC2.RadioButton {text: i18nc("As in: 'Touch Mode is always enabled'", "Always enabled")Accessible.description: touchModeAlwaysOffRadioButtonHelperText.textchecked: kcm.kwinSettings.tabletMode === "on"onToggled: {if (checked) {kcm.kwinSettings.tabletMode = "on"}}QQC2.ButtonGroup.group: tabletModeBehaviorGroupKCM.SettingStateBinding {configObject: kcm.kwinSettingssettingName: "tabletMode"}}ColumnLayout {Layout.fillWidth: truespacing: 0QQC2.RadioButton {id: touchModeAlwaysOffRadioButtonvisible: KWindowSystem.isPlatformWaylandtext: i18nc("As in: 'Touch Mode is never enabled'", "Never enabled")Accessible.description: touchModeAlwaysOffRadioButtonHelperText.textchecked: kcm.kwinSettings.tabletMode === "off"onToggled: {if (checked) {kcm.kwinSettings.tabletMode = "off"}}QQC2.ButtonGroup.group: tabletModeBehaviorGroupKCM.SettingStateBinding {configObject: kcm.kwinSettingssettingName: "tabletMode"}}QQC2.Label {id: touchModeAlwaysOffRadioButtonHelperTextLayout.fillWidth: trueLayout.preferredWidth: Kirigami.Units.gridUnit * 20leftPadding: Application.layoutDirection === Qt.LeftToRight ?touchModeAlwaysOffRadioButton.indicator.width + touchModeAlwaysOffRadioButton.spacing : touchModeAlwaysOffRadioButton.paddingrightPadding: Application.layoutDirection === Qt.RightToLeft ?touchModeAlwaysOffRadioButton.indicator.width + touchModeAlwaysOffRadioButton.spacing : touchModeAlwaysOffRadioButtonHelperText.paddingtext: i18n("In Touch Mode, many elements of the user interface will become larger to more easily accommodate touch interaction.")textFormat: Text.PlainTextelide: Text.ElideRightfont: Kirigami.Theme.smallFontwrapMode: Text.WordWrap}}// There is no label for what middle-clicking does when using the// "click to zoom the handle" behavior because Qt doesn't invert the// middle-click functionality when using this; see// https://bugreports.qt.io/browse/QTBUG-80728Item {Kirigami.FormData.isSection: true}RowLayout {Kirigami.FormData.label: i18n("Double-click interval:")spacing: Kirigami.Units.smallSpacingQQC2.SpinBox {id: spinboxfrom: 100to: 2000stepSize: 100validator: IntValidator {bottom: Math.min(spinbox.from, spinbox.to)top: Math.max(spinbox.from, spinbox.to)}textFromValue: (value, locale) => {return i18ncp("short for millisecond(s)", "%1 ms", "%1 ms", value)}valueFromText: (text, locale) => {return Number.fromLocaleString(locale, text.replace(i18nc("short for millisecond(s)", "ms"), ""))}onValueModified: kcm.globalsSettings.doubleClickInterval = valuevalue: kcm.globalsSettings.doubleClickIntervalKCM.SettingStateBinding {configObject: kcm.globalsSettingssettingName: "doubleClickInterval"}}Kirigami.ContextualHelpButton {toolTipText: i18n("Two clicks within this duration are considered a double-click. Some applications may not honor this setting.")}}}}