/*SPDX-FileCopyrightText: 2024 Evgeny Chesnokov <echesnokov@astralinux.ru>SPDX-License-Identifier: GPL-2.0-or-later*/import QtQuickimport QtQuick.Layoutsimport QtQuick.Controls as QQC2import org.kde.kirigami as Kirigamiimport org.kde.kitemmodels as KItemModelsimport org.kde.kcmutils as KCMimport Qt.labs.qmlmodelsKCM.ScrollViewKCM {title: i18nc("@title", "Key Bindings")Connections {target: kcm.xkbOptionsModelfunction onNavigateTo(index): void {let modelIndex = xkbOptionsProxy.mapFromSource(index)treeView.expand(modelIndex.row)treeView.positionViewAtIndex(modelIndex, Qt.AlignCenter)treeView.forceActiveFocus()}}KItemModels.KSortFilterProxyModel {id: xkbOptionsProxysourceModel: kcm?.xkbOptionsModel ?? undefinedsortRoleName: "display"sortOrder: Qt.AscendingOrderrecursiveFilteringEnabled: trueautoAcceptChildRows: truefilterRoleName: "display"filterRegularExpression: {function escapeRegex(string) {// https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascriptreturn string.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&');}return new RegExp(searchField.text.split(/\s+/).map(escapeRegex).join(".*"), "i");}onCountChanged: {if (searchField.text.length > 0) {treeView.expandRecursively();} else {treeView.collapseRecursively();}}}header: ColumnLayout {spacing: Kirigami.Units.smallSpacingQQC2.CheckBox {text: i18nc("@label:checkbox", "Configure keyboard options")checked: kcm.keyboardSettings.resetOldXkbOptionsonToggled: kcm.keyboardSettings.resetOldXkbOptions = checkedKCM.SettingStateBinding {configObject: kcm.keyboardSettingssettingName: "resetOldXkbOptions"}}Kirigami.SearchField {id: searchFieldLayout.fillWidth: true}}view: TreeView {id: treeViewactiveFocusOnTab: truealternatingRows: falseclip: trueenabled: kcm.keyboardSettings.resetOldXkbOptionsreuseItems: falseonEnabledChanged: {if (!enabled) {for (let i in rows) {collapse(i)}}}columnWidthProvider: column => {switch (column) {case 0:return width;default:return 0;}}model: xkbOptionsProxydelegate: chooser}DelegateChooser {id: chooserrole: "type"DelegateChoice {roleValue: "parentNode"QQC2.TreeViewDelegate {activeFocusOnTab: trueonClicked: treeView.toggleExpanded(row)contentItem: RowLayout {spacing: Kirigami.Units.smallSpacingQQC2.Label {text: model.displayLayout.fillWidth: truefont.bold: model.checkedpadding: Kirigami.Units.smallSpacing}QQC2.ToolButton {Layout.maximumHeight: parent.implicitHeightLayout.rightMargin: Kirigami.Units.largeSpacingicon.name: "edit-reset-symbolic"icon.width: Kirigami.Units.iconSizes.smallicon.height: Kirigami.Units.iconSizes.smalltext: i18nc("@action:button", "Reset")visible: model.checkedonClicked: kcm.xkbOptionsModel.clearXkbGroup(model.name)Accessible.description: i18nc("@info accessible", "Reset selected options for this group")QQC2.ToolTip.text: i18nc("@info:tooltip", "Reset selected options for this group")QQC2.ToolTip.visible: hovered}}}}DelegateChoice {roleValue: "radio"QQC2.TreeViewDelegate {activeFocusOnTab: falsecontentItem: QQC2.RadioButton {activeFocusOnTab: truechecked: model.checkedonToggled: model.checked = !model.checkedtext: model.display// Checked state controlled via xkbOptionsModelautoExclusive: falseKCM.SettingHighlighter {highlight: model.checked}}onClicked: model.checked = !model.checked}}DelegateChoice {roleValue: "check"QQC2.TreeViewDelegate {activeFocusOnTab: falsecontentItem: QQC2.CheckBox {activeFocusOnTab: truechecked: model.checkedonToggled: model.checked = !model.checkedtext: model.displayKCM.SettingHighlighter {highlight: model.checked}}onClicked: model.checked = !model.checked}}}}