Warning, /network/neochat/src/qml/SonnetConfigPage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2021 Carl Schwan <carlschwan@kde.org>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 import QtQml
0005 import QtQuick
0006 import QtQuick.Controls as QQC2
0007 import QtQuick.Layouts
0008 import org.kde.kirigami as Kirigami
0009 import org.kde.sonnet as Sonnet
0010 import org.kde.kirigamiaddons.formcard as FormCard
0011 import org.kde.kirigamiaddons.delegates as Delegates
0012 
0013 Kirigami.ScrollablePage {
0014     id: root
0015 
0016     FormCard.FormHeader {
0017         title: i18nc("@title", "Spellchecking")
0018     }
0019     FormCard.FormCard {
0020         id: card
0021         property Sonnet.Settings settings: Sonnet.Settings {
0022             id: settings
0023         }
0024         FormCard.FormCheckDelegate {
0025             id: enable
0026             checked: settings.checkerEnabledByDefault
0027             text: i18n("Enable automatic spell checking")
0028             onCheckedChanged: {
0029                 settings.checkerEnabledByDefault = checked;
0030                 settings.save();
0031             }
0032         }
0033 
0034         FormCard.FormDelegateSeparator { below: enable; above: skipUppercase }
0035 
0036         FormCard.FormCheckDelegate {
0037             id: skipUppercase
0038             checked: settings.skipUppercase
0039             text: i18n("Ignore uppercase words")
0040             onCheckedChanged: {
0041                 settings.skipUppercase = checked;
0042                 settings.save();
0043             }
0044         }
0045 
0046         FormCard.FormDelegateSeparator { below: skipUppercase; above: skipRunTogether }
0047 
0048         FormCard.FormCheckDelegate {
0049             id: skipRunTogether
0050             checked: settings.skipRunTogether
0051             text: i18n("Ignore hyphenated words")
0052             onCheckedChanged: {
0053                 settings.skipRunTogether = checked;
0054                 settings.save();
0055             }
0056         }
0057 
0058         FormCard.FormDelegateSeparator { below: skipRunTogether; above: autodetectLanguageCheckbox }
0059 
0060         FormCard.FormCheckDelegate {
0061             id: autodetectLanguageCheckbox
0062             checked: settings.autodetectLanguage
0063             text: i18n("Detect language automatically")
0064             onCheckedChanged: {
0065                 settings.autodetectLanguage = checked;
0066                 settings.save();
0067             }
0068         }
0069 
0070         FormCard.FormDelegateSeparator { below: autodetectLanguageCheckbox; above: selectedDefaultLanguage }
0071 
0072         FormCard.FormComboBoxDelegate {
0073             id: selectedDefaultLanguage
0074             text: i18n("Selected default language:")
0075             model: isEmpty ? [{"display": i18n("None")}] : settings.dictionaryModel
0076             textRole: "display"
0077             displayMode: Kirigami.Settings.isMobile ? FormCard.FormComboBoxDelegate.Dialog : FormCard.FormComboBoxDelegate.Page
0078             valueRole: "languageCode"
0079             property bool isEmpty: false
0080             Component.onCompleted: {
0081                 if (settings.dictionaryModel.rowCount() === 0) {
0082                     isEmpty = true;
0083                 } else {
0084                     currentIndex = indexOfValue(settings.defaultLanguage);
0085                 }
0086             }
0087             onActivated: settings.defaultLanguage = currentValue;
0088         }
0089 
0090         FormCard.FormDelegateSeparator { below: selectedDefaultLanguage; above: spellCheckingLanguage }
0091 
0092         FormCard.FormButtonDelegate {
0093             id: spellCheckingLanguage
0094             text: i18n("Additional spell checking languages")
0095             description: i18n("%1 will provide spell checking and suggestions for the languages listed here when autodetection is enabled.", Qt.application.displayName)
0096             enabled: autodetectLanguageCheckbox.checked
0097             onClicked: pageStack.pushDialogLayer(spellCheckingLanguageList, {}, {
0098                 width: pageStack.width - Kirigami.Units.gridUnit * 5,
0099                 height: pageStack.height - Kirigami.Units.gridUnit * 5,
0100             })
0101         }
0102 
0103         FormCard.FormDelegateSeparator { below: spellCheckingLanguageList; above: personalDictionary }
0104 
0105         FormCard.FormButtonDelegate {
0106             id: personalDictionary
0107             text: i18n("Open Personal Dictionary")
0108             onClicked: pageStack.pushDialogLayer(dictionaryPage, {}, {
0109                 width: pageStack.width - Kirigami.Units.gridUnit * 5,
0110                 height: pageStack.height - Kirigami.Units.gridUnit * 5,
0111             })
0112         }
0113 
0114         property Component spellCheckingLanguageList: Component {
0115             id: spellCheckingLanguageList
0116             Kirigami.ScrollablePage {
0117                 id: scroll
0118                 title: i18nc("@title:window", "Spell checking languages")
0119                 ListView {
0120                     clip: true
0121                     model: settings.dictionaryModel
0122                     delegate: QQC2.CheckDelegate {
0123                         onClicked: model.checked = checked
0124                         Accessible.description: model.isDefault ? i18n("Default Language") : ''
0125                         checked: model.checked
0126                         width: scroll.width
0127                         contentItem: RowLayout {
0128                             QQC2.Label {
0129                                 Layout.fillWidth: true
0130                                 id: label
0131                                 text: model.display
0132                             }
0133                             Kirigami.Icon {
0134                                 source: "favorite"
0135                                 Layout.rightMargin: Kirigami.Units.largeSpacing * 2
0136                                 visible: model.isDefault
0137                                 HoverHandler {
0138                                     id: hover
0139                                 }
0140                                 QQC2.ToolTip {
0141                                     visible: hover.hovered
0142                                     text: i18n("Default Language")
0143                                 }
0144                             }
0145                         }
0146                     }
0147                 }
0148             }
0149         }
0150     }
0151 
0152     Component {
0153         id: dictionaryPage
0154         Kirigami.ScrollablePage {
0155             title: i18n("Spell checking dictionary")
0156             footer: QQC2.ToolBar {
0157                 contentItem: RowLayout {
0158                     QQC2.TextField {
0159                         id: dictionaryField
0160                         Layout.fillWidth: true
0161                         Accessible.name: placeholderText
0162                         placeholderText: i18n("Add a new word to your personal dictionary…")
0163                     }
0164                     QQC2.Button {
0165                         text: i18nc("@action:button", "Add word")
0166                         icon.name: "list-add"
0167                         enabled: dictionaryField.text.length > 0
0168                         onClicked: {
0169                             add(dictionaryField.text);
0170                             dictionaryField.clear();
0171                             if (instantApply) {
0172                                 settings.save();
0173                             }
0174                         }
0175                         Layout.rightMargin: Kirigami.Units.largeSpacing
0176                     }
0177                 }
0178             }
0179             ListView {
0180                 topMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0181                 bottomMargin: Math.round(Kirigami.Units.smallSpacing / 2)
0182 
0183                 model: settings.currentIgnoreList
0184                 delegate: Delegates.RoundedItemDelegate {
0185                     id: wordDelegate
0186 
0187                     required property var modelData
0188 
0189                     text: modelData
0190 
0191                     contentItem: RowLayout {
0192                         spacing: Kirigami.Units.smallSpacing
0193 
0194                         Delegates.DefaultContentItem {
0195                             itemDelegate: wordDelegate
0196                             Layout.fillWidth: true
0197                         }
0198 
0199                         QQC2.ToolButton {
0200                             text: i18nc("@action:button", "Delete word")
0201                             icon.name: "delete"
0202                             display: QQC2.ToolButton.IconOnly
0203                             onClicked: {
0204                                 remove(wordDelegate.modelData);
0205                                 if (instantApply) {
0206                                     settings.save();
0207                                 }
0208                             }
0209 
0210                             QQC2.ToolTip.text: text
0211                             QQC2.ToolTip.visible: hovered
0212                             QQC2.ToolTip.delay: Kirigami.ToolTip.toolTipDelay
0213                         }
0214                     }
0215                 }
0216             }
0217         }
0218     }
0219 
0220     function add(word: string) {
0221         const dictionary = settings.currentIgnoreList;
0222         dictionary.push(word);
0223         settings.currentIgnoreList = dictionary;
0224     }
0225 
0226     function remove(word: string) {
0227         settings.currentIgnoreList = settings.currentIgnoreList.filter((value, _, _) => {
0228             return value !== word;
0229         });
0230     }
0231 }