🏑 index : quine-global-labs/mirror-kde-plasma-desktop.git

// 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-GPL

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls as QQC2
import QtQml

import org.kde.kirigami as Kirigami
import org.kde.kirigami.delegates as KD
import org.kde.kirigami.dialogs
import org.kde.kcmutils as KCM
import org.kde.kitemmodels

KCM.SimpleKCM {
    id: root

    Kirigami.Form {
        Kirigami.FormGroup {
            Kirigami.FormEntry {
                contentItem: QQC2.ComboBox {
                    id: defaultLanguage
                    Kirigami.FormData.label: i18nc("@label", "Default Language:")
                    model: kcm.settings.dictionaryModel
                    textRole: "display"
                    valueRole: "languageCode"

                    onActivated: kcm.settings.defaultLanguage = currentValue

                    currentIndex: indexOfValue(kcm.settings.defaultLanguage)

                    Connections {
                        target: kcm.settings
                        function 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: spellCheckingLanguageList
                        Kirigami.Dialog {
                            id: scroll
                            title: i18ndc("kirigami-addons6", "@title:window", "Spell Checking Languages")

                            width: Kirigami.Units.gridUnit * 24

                            onRejected: scroll.close()

                            header: DialogHeader {
                                dialog: scroll

                                contentItem: ColumnLayout {
                                    spacing: Kirigami.Units.smallSpacing

                                    Kirigami.DialogHeaderTopContent {
                                        Layout.fillWidth: true
                                        dialog: scroll
                                    }

                                    Kirigami.SearchField {
                                        id: searchField
                                        Layout.fillWidth: true
                                    }
                                }
                            }

                            ListView {
                                id: listView
                                clip: true
                                model: KSortFilterProxyModel {
                                    sourceModel: kcm.settings.dictionaryModel
                                    filterRoleName: "display"
                                    filterString: searchField.text
                                }

                                delegate: QQC2.CheckDelegate {
                                    id: delegate
                                    width: ListView.view.width

                                    required property var model
                                    required property bool isDefault

                                    text: model.display
                                    onClicked: delegate.model.checked = checked
                                    checked: delegate.model.checked
                                    Accessible.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.autodetectLanguage
                    onClicked: 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.checkerEnabledByDefault
                    onCheckedChanged: 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.skipUppercase
                    onCheckedChanged: 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.skipRunTogether
                    onCheckedChanged: 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: ignoredWordsComponent
                    Kirigami.Dialog {
                        id: dialog
                        title: i18nc("@title:dialog", "Ignored Words")

                        width: Kirigami.Units.gridUnit * 24

                        onRejected: dialog.close()

                        footerLeadingComponent: Kirigami.ActionTextField {
                            id: newWord
                            placeholderText: i18nc("@info:placeholder", "Enter a word to ignore")
                            Layout.fillWidth: true
                            rightActions: [
                                Kirigami.Action {
                                    enabled:  newWord.text.length > 0
                                    text: i18nc("@action:button", "Ignore this Word")
                                    tooltip: text
                                    icon.name: "list-add"
                                    onTriggered: {
                                        let words = kcm.settings.currentIgnoreList;
                                        words.push(newWord.text);
                                        kcm.settings.currentIgnoreList = words;
                                    }
                                }
                            ]
                        }

                        ListView {
                            model: kcm.settings.currentIgnoreList
                            delegate: QQC2.ItemDelegate {
                                id: delegate
                                width: ListView.view.width

                                required property string modelData

                                contentItem: Kirigami.TitleSubtitleWithActions  {
                                    title: delegate.modelData
                                    actions: [
                                        Kirigami.Action {
                                            text: i18nc("@action:button", "Delete")
                                            tooltip: text
                                            icon.name: "list-remove"
                                            displayHint: Kirigami.DisplayHint.IconOnly
                                            onTriggered: {
                                                kcm.settings.currentIgnoreList = kcm.settings.currentIgnoreList.filter((value, _, _) => {
                                                    return value !== delegate.modelData;
                                                });
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}