File indexing completed on 2024-04-28 15:34:19

0001 /*
0002  * SPDX-FileCopyrightText: 2003 Zack Rusin <zack@kde.org>
0003  * SPDX-FileCopyrightText: 2006 Laurent Montel <montel@kde.org>
0004  * SPDX-FileCopyrightText: 2013 Martin Sandsmark <martin.sandsmark@kde.org>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-or-later
0007  */
0008 #include "settingsimpl_p.h"
0009 
0010 #include "loader_p.h"
0011 
0012 #include <QMap>
0013 #include <QSettings>
0014 
0015 #include "settings.h"
0016 
0017 namespace Sonnet
0018 {
0019 class SettingsImplPrivate
0020 {
0021 public:
0022     Loader *loader = nullptr; // can't be a Ptr since we don't want to hold a ref on it
0023     bool modified = false;
0024 
0025     QString defaultLanguage;
0026     QStringList preferredLanguages;
0027     QString defaultClient;
0028 
0029     bool checkUppercase = false;
0030     bool skipRunTogether = false;
0031     bool backgroundCheckerEnabled = false;
0032     bool checkerEnabledByDefault = false;
0033     bool autodetectLanguage = false;
0034 
0035     int disablePercentage;
0036     int disableWordCount;
0037 
0038     QMap<QString, bool> ignore;
0039 };
0040 
0041 SettingsImpl::SettingsImpl(Loader *loader)
0042     : d(new SettingsImplPrivate)
0043 {
0044     d->loader = loader;
0045 
0046     d->modified = false;
0047     d->checkerEnabledByDefault = false;
0048     restore();
0049 }
0050 
0051 SettingsImpl::~SettingsImpl()
0052 {
0053     delete d;
0054 }
0055 
0056 bool SettingsImpl::setDefaultLanguage(const QString &lang)
0057 {
0058     const QStringList cs = d->loader->languages();
0059     if (cs.indexOf(lang) != -1 && d->defaultLanguage != lang) {
0060         d->defaultLanguage = lang;
0061         d->modified = true;
0062         d->loader->changed();
0063         return true;
0064     }
0065     return false;
0066 }
0067 
0068 QString SettingsImpl::defaultLanguage() const
0069 {
0070     return d->defaultLanguage;
0071 }
0072 
0073 bool SettingsImpl::setPreferredLanguages(const QStringList &lang)
0074 {
0075     if (d->preferredLanguages != lang) {
0076         d->modified = true;
0077         d->preferredLanguages = lang;
0078         return true;
0079     }
0080 
0081     return false;
0082 }
0083 
0084 QStringList SettingsImpl::preferredLanguages() const
0085 {
0086     return d->preferredLanguages;
0087 }
0088 
0089 bool SettingsImpl::setDefaultClient(const QString &client)
0090 {
0091     // Different from setDefaultLanguage because
0092     // the number of clients can't be even close
0093     // as big as the number of languages
0094     if (d->loader->clients().contains(client)) {
0095         d->defaultClient = client;
0096         d->modified = true;
0097         d->loader->changed();
0098         return true;
0099     }
0100     return false;
0101 }
0102 
0103 QString SettingsImpl::defaultClient() const
0104 {
0105     return d->defaultClient;
0106 }
0107 
0108 bool SettingsImpl::setCheckUppercase(bool check)
0109 {
0110     if (d->checkUppercase != check) {
0111         d->modified = true;
0112         d->checkUppercase = check;
0113         return true;
0114     }
0115     return false;
0116 }
0117 
0118 bool SettingsImpl::checkUppercase() const
0119 {
0120     return d->checkUppercase;
0121 }
0122 
0123 bool SettingsImpl::setAutodetectLanguage(bool detect)
0124 {
0125     if (d->autodetectLanguage != detect) {
0126         d->modified = true;
0127         d->autodetectLanguage = detect;
0128         return true;
0129     }
0130     return false;
0131 }
0132 
0133 bool SettingsImpl::autodetectLanguage() const
0134 {
0135     return d->autodetectLanguage;
0136 }
0137 
0138 bool SettingsImpl::setSkipRunTogether(bool skip)
0139 {
0140     if (d->skipRunTogether != skip) {
0141         d->modified = true;
0142         d->skipRunTogether = skip;
0143         return true;
0144     }
0145     return false;
0146 }
0147 
0148 bool SettingsImpl::skipRunTogether() const
0149 {
0150     return d->skipRunTogether;
0151 }
0152 
0153 bool SettingsImpl::setCheckerEnabledByDefault(bool check)
0154 {
0155     if (d->checkerEnabledByDefault != check) {
0156         d->modified = true;
0157         d->checkerEnabledByDefault = check;
0158         return true;
0159     }
0160     return false;
0161 }
0162 
0163 bool SettingsImpl::checkerEnabledByDefault() const
0164 {
0165     return d->checkerEnabledByDefault;
0166 }
0167 
0168 bool SettingsImpl::setBackgroundCheckerEnabled(bool enable)
0169 {
0170     if (d->backgroundCheckerEnabled != enable) {
0171         d->modified = true;
0172         d->backgroundCheckerEnabled = enable;
0173         return true;
0174     }
0175     return false;
0176 }
0177 
0178 bool SettingsImpl::backgroundCheckerEnabled() const
0179 {
0180     return d->backgroundCheckerEnabled;
0181 }
0182 
0183 bool SettingsImpl::setCurrentIgnoreList(const QStringList &ignores)
0184 {
0185     bool changed = setQuietIgnoreList(ignores);
0186     d->modified = true;
0187     return changed;
0188 }
0189 
0190 bool SettingsImpl::setQuietIgnoreList(const QStringList &ignores)
0191 {
0192     bool changed = false;
0193     d->ignore = QMap<QString, bool>(); // clear out
0194     for (QStringList::const_iterator itr = ignores.begin(); itr != ignores.end(); ++itr) {
0195         d->ignore.insert(*itr, true);
0196         changed = true;
0197     }
0198     return changed;
0199 }
0200 
0201 QStringList SettingsImpl::currentIgnoreList() const
0202 {
0203     return d->ignore.keys();
0204 }
0205 
0206 bool SettingsImpl::addWordToIgnore(const QString &word)
0207 {
0208     if (!d->ignore.contains(word)) {
0209         d->modified = true;
0210         d->ignore.insert(word, true);
0211         return true;
0212     }
0213     return false;
0214 }
0215 
0216 bool SettingsImpl::ignore(const QString &word)
0217 {
0218     return d->ignore.contains(word);
0219 }
0220 
0221 int SettingsImpl::disablePercentageWordError() const
0222 {
0223     return d->disablePercentage;
0224 }
0225 
0226 int SettingsImpl::disableWordErrorCount() const
0227 {
0228     return d->disableWordCount;
0229 }
0230 
0231 void SettingsImpl::save()
0232 {
0233     QSettings settings(QStringLiteral("KDE"), QStringLiteral("Sonnet"));
0234     settings.setValue(QStringLiteral("defaultClient"), d->defaultClient);
0235     settings.setValue(QStringLiteral("defaultLanguage"), d->defaultLanguage);
0236     settings.setValue(QStringLiteral("preferredLanguages"), d->preferredLanguages);
0237     settings.setValue(QStringLiteral("checkUppercase"), d->checkUppercase);
0238     settings.setValue(QStringLiteral("skipRunTogether"), d->skipRunTogether);
0239     settings.setValue(QStringLiteral("backgroundCheckerEnabled"), d->backgroundCheckerEnabled);
0240     settings.setValue(QStringLiteral("checkerEnabledByDefault"), d->checkerEnabledByDefault);
0241     settings.setValue(QStringLiteral("autodetectLanguage"), d->autodetectLanguage);
0242     QString defaultLanguage = QStringLiteral("ignore_%1").arg(d->defaultLanguage);
0243     if (settings.contains(defaultLanguage) && d->ignore.isEmpty()) {
0244         settings.remove(defaultLanguage);
0245     } else if (!d->ignore.isEmpty()) {
0246         settings.setValue(defaultLanguage, QStringList(d->ignore.keys()));
0247     }
0248     d->modified = false;
0249 }
0250 
0251 void SettingsImpl::restore()
0252 {
0253     QSettings settings(QStringLiteral("KDE"), QStringLiteral("Sonnet"));
0254     d->defaultClient = settings.value(QStringLiteral("defaultClient"), QString()).toString();
0255     d->defaultLanguage = settings.value(QStringLiteral("defaultLanguage"), Settings::defaultDefaultLanguage()).toString();
0256     d->preferredLanguages = settings.value(QStringLiteral("preferredLanguages"), Settings::defaultPreferredLanguages()).toStringList();
0257 
0258     // same defaults are in the default filter (filter.cpp)
0259     d->checkUppercase = settings.value(QStringLiteral("checkUppercase"), !Settings::defaultSkipUppercase()).toBool();
0260     d->skipRunTogether = settings.value(QStringLiteral("skipRunTogether"), Settings::defauktSkipRunTogether()).toBool();
0261     d->backgroundCheckerEnabled = settings.value(QStringLiteral("backgroundCheckerEnabled"), Settings::defaultBackgroundCheckerEnabled()).toBool();
0262     d->checkerEnabledByDefault = settings.value(QStringLiteral("checkerEnabledByDefault"), Settings::defaultCheckerEnabledByDefault()).toBool();
0263     d->disablePercentage = settings.value(QStringLiteral("Sonnet_AsYouTypeDisablePercentage"), 90).toInt();
0264     d->disableWordCount = settings.value(QStringLiteral("Sonnet_AsYouTypeDisableWordCount"), 100).toInt();
0265     d->autodetectLanguage = settings.value(QStringLiteral("autodetectLanguage"), Settings::defaultAutodetectLanguage()).toBool();
0266 
0267     const QString ignoreEntry = QStringLiteral("ignore_%1").arg(d->defaultLanguage);
0268     const QStringList ignores = settings.value(ignoreEntry, Settings::defaultIgnoreList()).toStringList();
0269     setQuietIgnoreList(ignores);
0270 }
0271 
0272 bool SettingsImpl::modified() const
0273 {
0274     return d->modified;
0275 }
0276 
0277 void SettingsImpl::setModified(bool modified)
0278 {
0279     d->modified = modified;
0280 }
0281 } // namespace Sonnet