// SPDX-FileCopyrightText: 2026 Tobias Fella <tobias.fella@kde.org>// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPLimport QtQuickimport QtQuick.Layoutsimport QtQuick.Controls as QQC2import QtQmlimport org.kde.kirigami as Kirigamiimport org.kde.kirigami.delegates as KDimport org.kde.kirigami.dialogsimport org.kde.kcmutils as KCMimport org.kde.kitemmodelsKCM.SimpleKCM {id: rootKirigami.Form {Kirigami.FormGroup {Kirigami.FormEntry {contentItem: QQC2.ComboBox {id: defaultLanguageKirigami.FormData.label: i18nc("@label", "Default Language:")model: kcm.settings.dictionaryModeltextRole: "display"valueRole: "languageCode"onActivated: kcm.settings.defaultLanguage = currentValuecurrentIndex: indexOfValue(kcm.settings.defaultLanguage)Connections {target: kcm.settingsfunction onDefaultLanguageChanged(): void {defaultLanguage.currentIndex = defaultLanguage.indexOfValue(kcm.settings.defaultLanguage)}}}KCM.SettingHighlighter {highlight: kcm.settings.defaultLanguage !== kcm.settings.defaultDefaultLanguage}}}Kirigami.FormGroup {title: i18nc("@title", "Preferred Languages")Kirigami.FormEntry {contentItem: QQC2.Button {text: i18nc("@action:button", "Configure Preferred Languagesβ¦")icon.name: "languages"onClicked: {let dialog = spellCheckingLanguageList.createObject(root) as Kirigami.Dialog;dialog.open();}KCM.SettingHighlighter {highlight: kcm.settings.preferredLanguages.length !== kcm.settings.defaultPreferredLanguages.length || !kcm.settings.preferredLanguages.every(value => kcm.settings.defaultPreferredLanguages.includes(value))}Component {id: spellCheckingLanguageListKirigami.Dialog {id: scrolltitle: i18ndc("kirigami-addons6", "@title:window", "Spell Checking Languages")width: Kirigami.Units.gridUnit * 24onRejected: scroll.close()header: DialogHeader {dialog: scrollcontentItem: ColumnLayout {spacing: Kirigami.Units.smallSpacingKirigami.DialogHeaderTopContent {Layout.fillWidth: truedialog: scroll}Kirigami.SearchField {id: searchFieldLayout.fillWidth: true}}}ListView {id: listViewclip: truemodel: KSortFilterProxyModel {sourceModel: kcm.settings.dictionaryModelfilterRoleName: "display"filterString: searchField.text}delegate: QQC2.CheckDelegate {id: delegatewidth: ListView.view.widthrequired property var modelrequired property bool isDefaulttext: model.displayonClicked: delegate.model.checked = checkedchecked: delegate.model.checkedAccessible.description: delegate.isDefault ? i18nd("kirigami-addons6", "Default Language") : ""}}}}}}}Kirigami.FormGroup {title: i18nc("@title", "Options")Kirigami.FormEntry {contentItem: QQC2.CheckBox {text: i18nc("@option:check", "Enable autodetection of language")checked: kcm.settings.autodetectLanguageonClicked: kcm.settings.autodetectLanguage = checked}KCM.SettingHighlighter {highlight: kcm.settings.autodetectLanguage !== kcm.settings.defaultAutodetectLanguage}}Kirigami.FormEntry {contentItem: QQC2.CheckBox {text: i18nc("@option:check", "Automatic spell checking enabled by default")checked: kcm.settings.checkerEnabledByDefaultonCheckedChanged: kcm.settings.checkerEnabledByDefault = checked}KCM.SettingHighlighter {highlight: kcm.settings.checkerEnabledByDefault !== kcm.settings.defaultCheckerEnabledByDefault}}Kirigami.FormEntry {contentItem: QQC2.CheckBox {text: i18nc("@option:check", "Skip all uppercase words")checked: kcm.settings.skipUppercaseonCheckedChanged: kcm.settings.skipUppercase = checked}KCM.SettingHighlighter {highlight: kcm.settings.skipUppercase !== kcm.settings.defaultSkipUppercase}}Kirigami.FormEntry {contentItem: QQC2.CheckBox {text: i18nc("@option:check", "Skip run-together words")checked: kcm.settings.skipRunTogetheronCheckedChanged: kcm.settings.skipRunTogether = checked}KCM.SettingHighlighter {highlight: kcm.settings.skipRunTogether !== kcm.settings.defaultSkipRunTogether}}}Kirigami.FormGroup {title: i18nc("@title", "Ignored Words")Kirigami.FormEntry {contentItem: QQC2.Button {icon.name: "view-visible-off"text: i18nc("@action:button", "Configure Ignored Wordsβ¦")onClicked: {let dialog = ignoredWordsComponent.createObject(root) as Kirigami.Dialog;dialog.open();}}KCM.SettingHighlighter {highlight: kcm.settings.currentIgnoreList.length !== kcm.settings.defaultIgnoreList.length || !kcm.settings.currentIgnoreList.every(value => kcm.settings.defaultIgnoreList.includes(value))}Component {id: ignoredWordsComponentKirigami.Dialog {id: dialogtitle: i18nc("@title:dialog", "Ignored Words")width: Kirigami.Units.gridUnit * 24onRejected: dialog.close()footerLeadingComponent: Kirigami.ActionTextField {id: newWordplaceholderText: i18nc("@info:placeholder", "Enter a word to ignore")Layout.fillWidth: truerightActions: [Kirigami.Action {enabled: newWord.text.length > 0text: i18nc("@action:button", "Ignore this Word")tooltip: texticon.name: "list-add"onTriggered: {let words = kcm.settings.currentIgnoreList;words.push(newWord.text);kcm.settings.currentIgnoreList = words;}}]}ListView {model: kcm.settings.currentIgnoreListdelegate: QQC2.ItemDelegate {id: delegatewidth: ListView.view.widthrequired property string modelDatacontentItem: Kirigami.TitleSubtitleWithActions {title: delegate.modelDataactions: [Kirigami.Action {text: i18nc("@action:button", "Delete")tooltip: texticon.name: "list-remove"displayHint: Kirigami.DisplayHint.IconOnlyonTriggered: {kcm.settings.currentIgnoreList = kcm.settings.currentIgnoreList.filter((value, _, _) => {return value !== delegate.modelData;});}}]}}}}}}}}}