/*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.kquickcontrols as KQuickControlsimport org.kde.kitemmodels as KItemModelsimport org.kde.kirigami as Kirigamiimport org.kde.plasma.private.kcm_keyboard as KCMKeyboardKirigami.Dialog {id: dialogtitle: i18nc("@title:window", "Add Layout")implicitWidth: Kirigami.Units.gridUnit * 34implicitHeight: Kirigami.Units.gridUnit * 26padding: Kirigami.Units.largeSpacingstandardButtons: QQC2.Dialog.Ok | QQC2.Dialog.CancelComponent.onCompleted: {let button = standardButton(QQC2.Dialog.Ok);button.enabled = Qt.binding(() => variantView.currentIndex >= 0);searchField.forceActiveFocus();}onAccepted: {const layout = variantView.currentItem.shortNameconst variant = variantView.currentItem.variantNameconst shortcut = sequenceItem.keySequence;const displayName = layout === displayNameField.text ? "" : displayNameField.textkcm.userLayoutModel.addLayout(layout, variant, shortcut, displayName)}KCMKeyboard.LayoutSearchModel {id: layoutSearchProxysourceModel: kcm?.layouts ?? undefinedsearchString: ""}KItemModels.KSortFilterProxyModel {id: layoutsProxysourceModel: layoutSearchProxysortRoleName: "searchScore"sortOrder: Qt.DescendingOrderfilterRowCallback: function (row, parent) {const modelIndex = sourceModel.index(row, 0, parent);const currentVariantName = sourceModel.data(modelIndex, KItemModels.KRoleNames.role("variantName"));const description = sourceModel.data(modelIndex, KItemModels.KRoleNames.role("description"));if (currentVariantName !== '') {return false;}if (searchField.text.length > 0) {const score = sourceModel.data(modelIndex, KItemModels.KRoleNames.role("searchScore"));if (score !== 0) {return true;}const shortNameRole = KItemModels.KRoleNames.role("shortName");const currentName = sourceModel.data(modelIndex, shortNameRole);const searchScoreRole = KItemModels.KRoleNames.role("searchScore");for (let i = 0; i < sourceModel.rowCount(); i++) {const index = sourceModel.index(i, 0, parent);const name = sourceModel.data(index, shortNameRole);const variantSearchScore = sourceModel.data(index, searchScoreRole);if (name === currentName && variantSearchScore > 100) {return true;}}return false;}return true;}}KItemModels.KSortFilterProxyModel {id: variantProxysourceModel: layoutSearchProxysortRoleName: "searchScore"sortOrder: Qt.DescendingOrderfilterRowCallback: function (row, parent) {if (!layoutsView.currentItem) {return false;}const modelIndex = sourceModel.index(row, 0, parent);const currentName = sourceModel.data(modelIndex, KItemModels.KRoleNames.role("shortName"));const selectedName = layoutsView.currentItem.shortName;if (currentName !== selectedName) {return false;}if (searchField.text.length > 0) {const searchScore = sourceModel.data(modelIndex, KItemModels.KRoleNames.role("searchScore"));return searchScore > 100;}return true;}}contentItem: ColumnLayout {spacing: Kirigami.Units.smallSpacingKirigami.SearchField {id: searchFieldLayout.fillWidth: trueonAccepted: {layoutSearchProxy.searchString = searchField.text.trim();}}RowLayout {QQC2.ScrollView {clip: trueimplicitWidth: Math.round(dialog.width / 2)Layout.fillWidth: trueLayout.fillHeight: trueComponent.onCompleted: {if (background) {background.visible = true}}contentItem: ListView {id: layoutsViewcurrentIndex: 0model: layoutsProxydelegate: LayoutDelegate {}keyNavigationEnabled: trueactiveFocusOnTab: trueonCurrentItemChanged: variantProxy.invalidateFilter()}}QQC2.ScrollView {clip: trueimplicitWidth: Math.round(dialog.width / 2)Layout.fillWidth: trueLayout.fillHeight: trueComponent.onCompleted: {if (background) {background.visible = true}}contentItem: ListView {id: variantViewmodel: layoutsView.currentItem ? variantProxy : []delegate: LayoutDelegate {}keyNavigationEnabled: trueactiveFocusOnTab: true}}}RowLayout {spacing: Kirigami.Units.smallSpacingQQC2.TextField {id: displayNameFieldmaximumLength: 3placeholderText: i18nc("@label:textbox", "Short layout name")Binding {target: displayNameFieldproperty: "text"value: variantView.currentItem?.shortName ?? ""}}Kirigami.ContextualHelpButton {toolTipText: i18nc("@info", "The abbreviated name of the selected layout, which will be displayed in the system tray. You can change this setting yourself.")}Item {Layout.fillWidth: true}QQC2.Label {text: i18nc("@option:textbox", "Shortcut:")}KQuickControls.KeySequenceItem {id: sequenceItem}}}footerLeadingComponent: QQC2.Button {icon.name: "input-keyboard-virtual-symbolic"text: i18nc("@action:button", "Preview")enabled: variantView.currentIndex >= 0onClicked: kcm.requestPreview(kcm.keyboardModel, variantView.currentItem.shortName, variantView.currentItem.variantName)}component LayoutDelegate: QQC2.ItemDelegate {id: delegatewidth: ListView.view.widthhighlighted: ListView.isCurrentItemrequired property string shortNamerequired property string descriptionrequired property string variantNamerequired property int indexonClicked: ListView.view.currentIndex = indexAccessible.name: delegate.descriptioncontentItem: Kirigami.IconTitleSubtitle {icon.source: KCMKeyboard.Flags.getIcon(delegate.shortName)title: delegate.descriptionQQC2.ToolTip.text: titleQQC2.ToolTip.visible: delegate.hovered && truncated}}}