File indexing completed on 2024-04-21 15:07:22

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