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