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

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() = default;
0052 
0053 bool SettingsImpl::setDefaultLanguage(const QString &lang)
0054 {
0055     const QStringList cs = d->loader->languages();
0056     if (cs.indexOf(lang) != -1 && d->defaultLanguage != lang) {
0057         d->defaultLanguage = lang;
0058         d->modified = true;
0059         d->loader->changed();
0060         return true;
0061     }
0062     return false;
0063 }
0064 
0065 QString SettingsImpl::defaultLanguage() const
0066 {
0067     return d->defaultLanguage;
0068 }
0069 
0070 bool SettingsImpl::setPreferredLanguages(const QStringList &lang)
0071 {
0072     if (d->preferredLanguages != lang) {
0073         d->modified = true;
0074         d->preferredLanguages = lang;
0075         return true;
0076     }
0077 
0078     return false;
0079 }
0080 
0081 QStringList SettingsImpl::preferredLanguages() const
0082 {
0083     return d->preferredLanguages;
0084 }
0085 
0086 bool SettingsImpl::setDefaultClient(const QString &client)
0087 {
0088     // Different from setDefaultLanguage because
0089     // the number of clients can't be even close
0090     // as big as the number of languages
0091     if (d->loader->clients().contains(client)) {
0092         d->defaultClient = client;
0093         d->modified = true;
0094         d->loader->changed();
0095         return true;
0096     }
0097     return false;
0098 }
0099 
0100 QString SettingsImpl::defaultClient() const
0101 {
0102     return d->defaultClient;
0103 }
0104 
0105 bool SettingsImpl::setCheckUppercase(bool check)
0106 {
0107     if (d->checkUppercase != check) {
0108         d->modified = true;
0109         d->checkUppercase = check;
0110         return true;
0111     }
0112     return false;
0113 }
0114 
0115 bool SettingsImpl::checkUppercase() const
0116 {
0117     return d->checkUppercase;
0118 }
0119 
0120 bool SettingsImpl::setAutodetectLanguage(bool detect)
0121 {
0122     if (d->autodetectLanguage != detect) {
0123         d->modified = true;
0124         d->autodetectLanguage = detect;
0125         return true;
0126     }
0127     return false;
0128 }
0129 
0130 bool SettingsImpl::autodetectLanguage() const
0131 {
0132     return d->autodetectLanguage;
0133 }
0134 
0135 bool SettingsImpl::setSkipRunTogether(bool skip)
0136 {
0137     if (d->skipRunTogether != skip) {
0138         d->modified = true;
0139         d->skipRunTogether = skip;
0140         return true;
0141     }
0142     return false;
0143 }
0144 
0145 bool SettingsImpl::skipRunTogether() const
0146 {
0147     return d->skipRunTogether;
0148 }
0149 
0150 bool SettingsImpl::setCheckerEnabledByDefault(bool check)
0151 {
0152     if (d->checkerEnabledByDefault != check) {
0153         d->modified = true;
0154         d->checkerEnabledByDefault = check;
0155         return true;
0156     }
0157     return false;
0158 }
0159 
0160 bool SettingsImpl::checkerEnabledByDefault() const
0161 {
0162     return d->checkerEnabledByDefault;
0163 }
0164 
0165 bool SettingsImpl::setBackgroundCheckerEnabled(bool enable)
0166 {
0167     if (d->backgroundCheckerEnabled != enable) {
0168         d->modified = true;
0169         d->backgroundCheckerEnabled = enable;
0170         return true;
0171     }
0172     return false;
0173 }
0174 
0175 bool SettingsImpl::backgroundCheckerEnabled() const
0176 {
0177     return d->backgroundCheckerEnabled;
0178 }
0179 
0180 bool SettingsImpl::setCurrentIgnoreList(const QStringList &ignores)
0181 {
0182     bool changed = setQuietIgnoreList(ignores);
0183     d->modified = true;
0184     return changed;
0185 }
0186 
0187 bool SettingsImpl::setQuietIgnoreList(const QStringList &ignores)
0188 {
0189     bool changed = false;
0190     d->ignore = QMap<QString, bool>(); // clear out
0191     for (QStringList::const_iterator itr = ignores.begin(); itr != ignores.end(); ++itr) {
0192         d->ignore.insert(*itr, true);
0193         changed = true;
0194     }
0195     return changed;
0196 }
0197 
0198 QStringList SettingsImpl::currentIgnoreList() const
0199 {
0200     return d->ignore.keys();
0201 }
0202 
0203 bool SettingsImpl::addWordToIgnore(const QString &word)
0204 {
0205     if (!d->ignore.contains(word)) {
0206         d->modified = true;
0207         d->ignore.insert(word, true);
0208         return true;
0209     }
0210     return false;
0211 }
0212 
0213 bool SettingsImpl::ignore(const QString &word)
0214 {
0215     return d->ignore.contains(word);
0216 }
0217 
0218 int SettingsImpl::disablePercentageWordError() const
0219 {
0220     return d->disablePercentage;
0221 }
0222 
0223 int SettingsImpl::disableWordErrorCount() const
0224 {
0225     return d->disableWordCount;
0226 }
0227 
0228 void SettingsImpl::save()
0229 {
0230     QSettings settings(QStringLiteral("KDE"), QStringLiteral("Sonnet"));
0231     settings.setValue(QStringLiteral("defaultClient"), d->defaultClient);
0232     settings.setValue(QStringLiteral("defaultLanguage"), d->defaultLanguage);
0233     settings.setValue(QStringLiteral("preferredLanguages"), d->preferredLanguages);
0234     settings.setValue(QStringLiteral("checkUppercase"), d->checkUppercase);
0235     settings.setValue(QStringLiteral("skipRunTogether"), d->skipRunTogether);
0236     settings.setValue(QStringLiteral("backgroundCheckerEnabled"), d->backgroundCheckerEnabled);
0237     settings.setValue(QStringLiteral("checkerEnabledByDefault"), d->checkerEnabledByDefault);
0238     settings.setValue(QStringLiteral("autodetectLanguage"), d->autodetectLanguage);
0239     QString defaultLanguage = QStringLiteral("ignore_%1").arg(d->defaultLanguage);
0240     if (settings.contains(defaultLanguage) && d->ignore.isEmpty()) {
0241         settings.remove(defaultLanguage);
0242     } else if (!d->ignore.isEmpty()) {
0243         settings.setValue(defaultLanguage, QStringList(d->ignore.keys()));
0244     }
0245     d->modified = false;
0246 }
0247 
0248 void SettingsImpl::restore()
0249 {
0250     QSettings settings(QStringLiteral("KDE"), QStringLiteral("Sonnet"));
0251     d->defaultClient = settings.value(QStringLiteral("defaultClient"), QString()).toString();
0252     d->defaultLanguage = settings.value(QStringLiteral("defaultLanguage"), Settings::defaultDefaultLanguage()).toString();
0253     d->preferredLanguages = settings.value(QStringLiteral("preferredLanguages"), Settings::defaultPreferredLanguages()).toStringList();
0254 
0255     // same defaults are in the default filter (filter.cpp)
0256     d->checkUppercase = settings.value(QStringLiteral("checkUppercase"), !Settings::defaultSkipUppercase()).toBool();
0257     d->skipRunTogether = settings.value(QStringLiteral("skipRunTogether"), Settings::defauktSkipRunTogether()).toBool();
0258     d->backgroundCheckerEnabled = settings.value(QStringLiteral("backgroundCheckerEnabled"), Settings::defaultBackgroundCheckerEnabled()).toBool();
0259     d->checkerEnabledByDefault = settings.value(QStringLiteral("checkerEnabledByDefault"), Settings::defaultCheckerEnabledByDefault()).toBool();
0260     d->disablePercentage = settings.value(QStringLiteral("Sonnet_AsYouTypeDisablePercentage"), 90).toInt();
0261     d->disableWordCount = settings.value(QStringLiteral("Sonnet_AsYouTypeDisableWordCount"), 100).toInt();
0262     d->autodetectLanguage = settings.value(QStringLiteral("autodetectLanguage"), Settings::defaultAutodetectLanguage()).toBool();
0263 
0264     const QString ignoreEntry = QStringLiteral("ignore_%1").arg(d->defaultLanguage);
0265     const QStringList ignores = settings.value(ignoreEntry, Settings::defaultIgnoreList()).toStringList();
0266     setQuietIgnoreList(ignores);
0267 }
0268 
0269 bool SettingsImpl::modified() const
0270 {
0271     return d->modified;
0272 }
0273 
0274 void SettingsImpl::setModified(bool modified)
0275 {
0276     d->modified = modified;
0277 }
0278 } // namespace Sonnet