File indexing completed on 2024-04-21 04:00:57

0001 /*
0002  * configwidget.cpp
0003  *
0004  * SPDX-FileCopyrightText: 2004 Zack Rusin <zack@kde.org>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-or-later
0007  */
0008 #include "configwidget.h"
0009 #include "ui_configui.h"
0010 
0011 #include "loader_p.h"
0012 #include "settings.h"
0013 #include "settingsimpl_p.h"
0014 
0015 #include "ui_debug.h"
0016 
0017 #include <QCheckBox>
0018 #include <QLineEdit>
0019 #include <QListWidget>
0020 #include <QListWidgetItem>
0021 
0022 using namespace Sonnet;
0023 
0024 class Sonnet::ConfigWidgetPrivate
0025 {
0026 public:
0027     Ui_SonnetConfigUI ui;
0028     Settings *settings = nullptr;
0029     QWidget *wdg = nullptr;
0030 };
0031 
0032 ConfigWidget::ConfigWidget(QWidget *parent)
0033     : QWidget(parent)
0034     , d(new ConfigWidgetPrivate)
0035 {
0036     d->settings = new Settings(this);
0037     QVBoxLayout *layout = new QVBoxLayout(this);
0038     layout->setContentsMargins(0, 0, 0, 0);
0039     layout->setObjectName(QStringLiteral("SonnetConfigUILayout"));
0040     d->wdg = new QWidget(this);
0041     d->ui.setupUi(d->wdg);
0042 
0043     d->ui.m_langCombo->setCurrentByDictionary(d->settings->defaultLanguage());
0044 
0045     QStringList preferredLanguages = d->settings->preferredLanguages();
0046     for (int i = 0; i < d->ui.m_langCombo->count(); i++) {
0047         const QString tag = d->ui.m_langCombo->itemData(i).toString();
0048         if (tag.isEmpty()) { // skip separator
0049             continue;
0050         }
0051 
0052         QListWidgetItem *item = new QListWidgetItem(d->ui.m_langCombo->itemText(i), d->ui.languageList);
0053         item->setData(Qt::UserRole, tag);
0054         if (preferredLanguages.contains(tag)) {
0055             item->setCheckState(Qt::Checked);
0056         } else {
0057             item->setCheckState(Qt::Unchecked);
0058         }
0059     }
0060 
0061     d->ui.kcfg_skipUppercase->setChecked(d->settings->skipUppercase());
0062     d->ui.kcfg_skipRunTogether->setChecked(d->settings->skipRunTogether());
0063     d->ui.kcfg_checkerEnabledByDefault->setChecked(d->settings->checkerEnabledByDefault());
0064     d->ui.kcfg_autodetectLanguage->setChecked(d->settings->autodetectLanguage());
0065     QStringList ignoreList = d->settings->currentIgnoreList();
0066     ignoreList.sort();
0067     d->ui.ignoreListWidget->addItems(ignoreList);
0068     d->ui.kcfg_backgroundCheckerEnabled->setChecked(d->settings->backgroundCheckerEnabled());
0069     d->ui.kcfg_backgroundCheckerEnabled->hide(); // hidden by default
0070     connect(d->ui.addButton, &QAbstractButton::clicked, this, &ConfigWidget::slotIgnoreWordAdded);
0071     connect(d->ui.removeButton, &QAbstractButton::clicked, this, &ConfigWidget::slotIgnoreWordRemoved);
0072 
0073     layout->addWidget(d->wdg);
0074     connect(d->ui.m_langCombo, &DictionaryComboBox::dictionaryChanged, this, &ConfigWidget::configChanged);
0075     connect(d->ui.languageList, &QListWidget::itemChanged, this, &ConfigWidget::configChanged);
0076 
0077     connect(d->ui.kcfg_backgroundCheckerEnabled, &QAbstractButton::clicked, this, &ConfigWidget::configChanged);
0078     connect(d->ui.kcfg_skipUppercase, &QAbstractButton::clicked, this, &ConfigWidget::configChanged);
0079     connect(d->ui.kcfg_skipRunTogether, &QAbstractButton::clicked, this, &ConfigWidget::configChanged);
0080     connect(d->ui.kcfg_checkerEnabledByDefault, &QAbstractButton::clicked, this, &ConfigWidget::configChanged);
0081     connect(d->ui.kcfg_autodetectLanguage, &QAbstractButton::clicked, this, &ConfigWidget::configChanged);
0082     connect(d->ui.newIgnoreEdit, &QLineEdit::textChanged, this, &ConfigWidget::slotUpdateButton);
0083     connect(d->ui.ignoreListWidget, &QListWidget::itemSelectionChanged, this, &ConfigWidget::slotSelectionChanged);
0084     d->ui.nobackendfound->setVisible(d->settings->clients().isEmpty());
0085     d->ui.addButton->setEnabled(false);
0086     d->ui.removeButton->setEnabled(false);
0087 }
0088 
0089 ConfigWidget::~ConfigWidget() = default;
0090 
0091 void ConfigWidget::slotUpdateButton(const QString &text)
0092 {
0093     d->ui.addButton->setEnabled(!text.isEmpty());
0094 }
0095 
0096 void ConfigWidget::slotSelectionChanged()
0097 {
0098     d->ui.removeButton->setEnabled(!d->ui.ignoreListWidget->selectedItems().isEmpty());
0099 }
0100 
0101 void ConfigWidget::save()
0102 {
0103     setFromGui();
0104 }
0105 
0106 void ConfigWidget::setFromGui()
0107 {
0108     if (d->ui.m_langCombo->count()) {
0109         d->settings->setDefaultLanguage(d->ui.m_langCombo->currentDictionary());
0110     }
0111 
0112     QStringList preferredLanguages;
0113     for (int i = 0; i < d->ui.languageList->count(); i++) {
0114         if (d->ui.languageList->item(i)->checkState() == Qt::Unchecked) {
0115             continue;
0116         }
0117         preferredLanguages << d->ui.languageList->item(i)->data(Qt::UserRole).toString();
0118     }
0119     d->settings->setPreferredLanguages(preferredLanguages);
0120 
0121     d->settings->setSkipUppercase(d->ui.kcfg_skipUppercase->isChecked());
0122     d->settings->setSkipRunTogether(d->ui.kcfg_skipRunTogether->isChecked());
0123     d->settings->setBackgroundCheckerEnabled(d->ui.kcfg_backgroundCheckerEnabled->isChecked());
0124     d->settings->setCheckerEnabledByDefault(d->ui.kcfg_checkerEnabledByDefault->isChecked());
0125     d->settings->setAutodetectLanguage(d->ui.kcfg_autodetectLanguage->isChecked());
0126 
0127     if (d->settings->modified()) {
0128         d->settings->save();
0129     }
0130 }
0131 
0132 void ConfigWidget::slotIgnoreWordAdded()
0133 {
0134     QStringList ignoreList = d->settings->currentIgnoreList();
0135     QString newWord = d->ui.newIgnoreEdit->text();
0136     d->ui.newIgnoreEdit->clear();
0137     if (newWord.isEmpty() || ignoreList.contains(newWord)) {
0138         return;
0139     }
0140     ignoreList.append(newWord);
0141     d->settings->setCurrentIgnoreList(ignoreList);
0142 
0143     d->ui.ignoreListWidget->clear();
0144     d->ui.ignoreListWidget->addItems(ignoreList);
0145 
0146     Q_EMIT configChanged();
0147 }
0148 
0149 void ConfigWidget::slotIgnoreWordRemoved()
0150 {
0151     QStringList ignoreList = d->settings->currentIgnoreList();
0152     const QList<QListWidgetItem *> selectedItems = d->ui.ignoreListWidget->selectedItems();
0153     for (const QListWidgetItem *item : selectedItems) {
0154         ignoreList.removeAll(item->text());
0155     }
0156     d->settings->setCurrentIgnoreList(ignoreList);
0157 
0158     d->ui.ignoreListWidget->clear();
0159     d->ui.ignoreListWidget->addItems(ignoreList);
0160 
0161     Q_EMIT configChanged();
0162 }
0163 
0164 void ConfigWidget::setBackgroundCheckingButtonShown(bool b)
0165 {
0166     d->ui.kcfg_backgroundCheckerEnabled->setVisible(b);
0167 }
0168 
0169 bool ConfigWidget::backgroundCheckingButtonShown() const
0170 {
0171     return !d->ui.kcfg_backgroundCheckerEnabled->isHidden();
0172 }
0173 
0174 void ConfigWidget::slotDefault()
0175 {
0176     d->ui.kcfg_autodetectLanguage->setChecked(Settings::defaultAutodetectLanguage());
0177     d->ui.kcfg_skipUppercase->setChecked(Settings::defaultSkipUppercase());
0178     d->ui.kcfg_skipRunTogether->setChecked(Settings::defauktSkipRunTogether());
0179     d->ui.kcfg_checkerEnabledByDefault->setChecked(Settings::defaultCheckerEnabledByDefault());
0180     d->ui.kcfg_backgroundCheckerEnabled->setChecked(Settings::defaultBackgroundCheckerEnabled());
0181     d->ui.ignoreListWidget->clear();
0182     d->ui.m_langCombo->setCurrentByDictionary(d->settings->defaultLanguage());
0183 }
0184 
0185 void ConfigWidget::setLanguage(const QString &language)
0186 {
0187     d->ui.m_langCombo->setCurrentByDictionary(language);
0188 }
0189 
0190 QString ConfigWidget::language() const
0191 {
0192     if (d->ui.m_langCombo->count()) {
0193         return d->ui.m_langCombo->currentDictionary();
0194     } else {
0195         return QString();
0196     }
0197 }
0198 
0199 #include "moc_configwidget.cpp"