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