diff --git a/src/core/settings.cpp b/src/core/settings.cpp --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -36,6 +36,7 @@ bool modified = false; QString defaultLanguage; + QStringList preferredLanguages; QString defaultClient; bool checkUppercase = false; @@ -83,6 +84,22 @@ return d->defaultLanguage; } +bool Settings::setPreferredLanguages(const QStringList &lang) +{ + if (d->preferredLanguages != lang) { + d->modified = true; + d->preferredLanguages = lang; + return true; + } + + return false; +} + +QStringList Settings::preferredLanguages() const +{ + return d->preferredLanguages; +} + bool Settings::setDefaultClient(const QString &client) { //Different from setDefaultLanguage because @@ -231,6 +248,7 @@ QSettings settings(QStringLiteral("KDE"), QStringLiteral("Sonnet")); settings.setValue(QStringLiteral("defaultClient"), d->defaultClient); settings.setValue(QStringLiteral("defaultLanguage"), d->defaultLanguage); + settings.setValue(QStringLiteral("preferredLanguages"), d->preferredLanguages); settings.setValue(QStringLiteral("checkUppercase"), d->checkUppercase); settings.setValue(QStringLiteral("skipRunTogether"), d->skipRunTogether); settings.setValue(QStringLiteral("backgroundCheckerEnabled"), d->backgroundCheckerEnabled); @@ -272,6 +290,7 @@ d->defaultClient = settings.value(QStringLiteral("defaultClient"), QString()).toString(); d->defaultLanguage = settings.value(QStringLiteral("defaultLanguage"), QLocale::system().name()).toString(); + d->preferredLanguages = settings.value(QStringLiteral("preferredLanguages")).toStringList(); //same defaults are in the default filter (filter.cpp) d->checkUppercase = settings.value(QStringLiteral("checkUppercase"), true).toBool(); @@ -300,4 +319,5 @@ { d->modified = modified; } -} + +} // namespace Sonnet diff --git a/src/core/settings_p.h b/src/core/settings_p.h --- a/src/core/settings_p.h +++ b/src/core/settings_p.h @@ -41,6 +41,9 @@ bool setDefaultLanguage(const QString &lang); QString defaultLanguage() const; + bool setPreferredLanguages(const QStringList &lang); + QStringList preferredLanguages() const; + bool setDefaultClient(const QString &client); QString defaultClient() const; diff --git a/src/core/speller.h b/src/core/speller.h --- a/src/core/speller.h +++ b/src/core/speller.h @@ -128,10 +128,15 @@ QStringList availableLanguageNames() const; /** - * Returns a map of all available language descriptions and their - * codes + * Returns a map of all available dictionaies with language descriptions and + * their codes. The key is the description, the code the value. */ QMap availableDictionaries() const; + /** + * Returns a map of user preferred dictionaies with language descriptions and + * their codes. The key is the description, the code the value. + */ + QMap preferredDictionaries() const; void setDefaultLanguage(const QString &lang); QString defaultLanguage() const; diff --git a/src/core/speller.cpp b/src/core/speller.cpp --- a/src/core/speller.cpp +++ b/src/core/speller.cpp @@ -277,4 +277,17 @@ return langs; } + +QMap Speller::preferredDictionaries() const +{ + Loader *l = Loader::openLoader(); + QMap langs; + + for (const QString &tag : l->settings()->preferredLanguages()) { + langs.insert(l->languageNameForCode(tag), tag); + } + + return langs; } + +} // namespace Sonnet diff --git a/src/ui/configui.ui b/src/ui/configui.ui --- a/src/ui/configui.ui +++ b/src/ui/configui.ui @@ -8,75 +8,26 @@ 0 0 - 577 - 441 + 700 + 833 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - + + + + + + 75 + true + true + - - - - - - Options + + No backend found for spell checking + + + Qt::AlignCenter - - - - - Enable autodetection of &language - - - - - - - Enable &background spellchecking - - - - - - - &Automatic spell checking enabled by default - - - - - - - Skip all &uppercase words - - - - - - - S&kip run-together words - - - - @@ -89,79 +40,135 @@ - - - - Ignored Words: + + + + + 0 + 0 + - - - - - - - - - - - - - &Add - - - - .. - - - - - - - + + + + + + Qt::Vertical + + + true + + + + Choose your preferred languages + + + + + + + + Options + + + + - &Remove + Enable autodetection of &language - - - .. + + + + + + Enable &background spellchecking - - - - Qt::Vertical + + + + &Automatic spell checking enabled by default - - - 20 - 40 - + + + + + + Skip all &uppercase words - + + + + + + S&kip run-together words + + - - - - - - - - - - - 75 - true - true - - - - No backend found for spell checking - - - Qt::AlignCenter - + + + + + + Ignored Words: + + + + + + + + + + + + + + &Add + + + + .. + + + + + + + + + &Remove + + + + .. + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + diff --git a/src/ui/configwidget.cpp b/src/ui/configwidget.cpp --- a/src/ui/configwidget.cpp +++ b/src/ui/configwidget.cpp @@ -53,6 +53,23 @@ d->ui.setupUi(d->wdg); d->ui.m_langCombo->setCurrentByDictionary(d->loader->settings()->defaultLanguage()); + + QStringList preferredLanguages = d->loader->settings()->preferredLanguages(); + for (int i = 0; i < d->ui.m_langCombo->count(); i++) { + const QString tag = d->ui.m_langCombo->itemData(i).toString(); + if (tag.isEmpty()) { // skip separator + continue; + } + + QListWidgetItem *item = new QListWidgetItem(d->ui.m_langCombo->itemText(i), d->ui.languageList); + item->setData(Qt::UserRole, tag); + if (preferredLanguages.contains(tag)) { + item->setCheckState(Qt::Checked); + } else { + item->setCheckState(Qt::Unchecked); + } + } + d->ui.m_skipUpperCB->setChecked(!d->loader->settings()->checkUppercase()); d->ui.m_skipRunTogetherCB->setChecked(d->loader->settings()->skipRunTogether()); d->ui.m_checkerEnabledByDefaultCB->setChecked(d->loader->settings()->checkerEnabledByDefault()); @@ -69,6 +86,8 @@ layout->addWidget(d->wdg); connect(d->ui.m_langCombo, &DictionaryComboBox::dictionaryChanged, this, &ConfigWidget::configChanged); + connect(d->ui.languageList, &QListWidget::itemChanged, this, &ConfigWidget::configChanged); + connect(d->ui.m_bgSpellCB, &QAbstractButton::clicked, this, &ConfigWidget::configChanged); connect(d->ui.m_skipUpperCB, &QAbstractButton::clicked, this, &ConfigWidget::configChanged); connect(d->ui.m_skipRunTogetherCB, &QAbstractButton::clicked, this, @@ -111,6 +130,15 @@ settings->setDefaultLanguage(d->ui.m_langCombo->currentDictionary()); } + QStringList preferredLanguages; + for (int i = 0; i < d->ui.languageList->count(); i++) { + if (d->ui.languageList->item(i)->checkState() == Qt::Unchecked) { + continue; + } + preferredLanguages << d->ui.languageList->item(i)->data(Qt::UserRole).toString(); + } + settings->setPreferredLanguages(preferredLanguages); + settings->setCheckUppercase(!d->ui.m_skipUpperCB->isChecked()); settings->setSkipRunTogether(d->ui.m_skipRunTogetherCB->isChecked()); settings->setBackgroundCheckerEnabled(d->ui.m_bgSpellCB->isChecked()); diff --git a/src/ui/dictionarycombobox.cpp b/src/ui/dictionarycombobox.cpp --- a/src/ui/dictionarycombobox.cpp +++ b/src/ui/dictionarycombobox.cpp @@ -118,15 +118,28 @@ void DictionaryComboBox::reloadCombo() { clear(); - Sonnet::Speller *speller = new Sonnet::Speller(); - QMap dictionaries = speller->availableDictionaries(); - QMapIterator i(dictionaries); + Sonnet::Speller speller; + QMap preferredDictionaries = speller.preferredDictionaries(); + QMapIterator i(preferredDictionaries); while (i.hasNext()) { i.next(); addItem(i.key(), i.value()); } - delete speller; -} + if (count()) { + insertSeparator(count()); + } + + QMap dictionaries = speller.availableDictionaries(); + i = dictionaries; + while (i.hasNext()) { + i.next(); + if (preferredDictionaries.contains(i.key())) { + continue; + } + addItem(i.key(), i.value()); + } } +} // namespace Sonnet + #include "moc_dictionarycombobox.cpp"