]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blobdiff - src/windows/BrowserWindow.cpp
Enable spell checking. https://redmine.stoutner.com/issues/840
[PrivacyBrowserPC.git] / src / windows / BrowserWindow.cpp
index 5960393f1da4b4fb535b4383463ce4ff46f08a3c..efa87ab0ea6fe57d710ea04a6984251a93cec00c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022-2023 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
  *
@@ -20,8 +20,9 @@
 // Application headers.
 #include "BrowserWindow.h"
 #include "Settings.h"
-#include "ui_SettingsPrivacy.h"
 #include "ui_SettingsGeneral.h"
+#include "ui_SettingsPrivacy.h"
+#include "ui_SettingsSpellCheck.h"
 #include "dialogs/CookiesDialog.h"
 #include "dialogs/DomainSettingsDialog.h"
 #include "helpers/SearchEngineHelper.h"
@@ -631,14 +632,17 @@ void BrowserWindow::showSettingsDialog()
     // Create the settings widgets.
     QWidget *privacySettingsWidgetPointer = new QWidget;
     QWidget *generalSettingsWidgetPointer = new QWidget;
+    QWidget *spellCheckSettingsWidgetPointer = new QWidget;
 
     // Instantiate the settings UI.
     Ui::PrivacySettings privacySettingsUi;
     Ui::GeneralSettings generalSettingsUi;
+    Ui::SpellCheckSettings spellCheckSettingsUi;
 
     // Setup the UI to display the settings widgets.
     privacySettingsUi.setupUi(privacySettingsWidgetPointer);
     generalSettingsUi.setupUi(generalSettingsWidgetPointer);
+    spellCheckSettingsUi.setupUi(spellCheckSettingsWidgetPointer);
 
     // Get handles for the widgets.
     QComboBox *userAgentComboBoxPointer = privacySettingsUi.kcfg_userAgent;
@@ -647,6 +651,7 @@ void BrowserWindow::showSettingsDialog()
     searchEngineLabelPointer = generalSettingsUi.searchEngineLabel;
     downloadLocationComboBoxPointer = generalSettingsUi.kcfg_downloadLocation;
     QPushButton *browseButtonPointer = generalSettingsUi.browseButton;
+    QListWidget *spellCheckListWidgetPointer = spellCheckSettingsUi.spellCheckListWidget;
 
     // Populate the combo box labels.
     updateUserAgentLabel(userAgentComboBoxPointer->currentText());
@@ -659,12 +664,51 @@ void BrowserWindow::showSettingsDialog()
     // Connect the download location directory browse button.
     connect(browseButtonPointer, SIGNAL(clicked()), this, SLOT(showDownloadLocationBrowseDialog()));
 
+    // Create a dictionaries QDir from the `QTWEBENGINE_DICTIONARIES_PATH` environment variable.
+    QDir dictionariesDir = QDir(qEnvironmentVariable("QTWEBENGINE_DICTIONARIES_PATH"));
+
+    // Get a dictionaries string list.
+    QStringList dictionariesStringList = dictionariesDir.entryList(QStringList(QLatin1String("*.bdic")), QDir::Files | QDir::NoSymLinks);
+
+    // Remove the `.bdic` file extensions from the dictionaries list.
+    dictionariesStringList.replaceInStrings(QLatin1String(".bdic"), QLatin1String(""));
+
+    // Get a list of the enabled spell check languages.
+    QStringList enabledSpellCheckLanguagesList = Settings::spellCheckLanguages();
+
+    // Add each dictionary to the spell check list widget.
+    foreach(QString dictionaryString, dictionariesStringList)
+    {
+        // Create a new list widget item pointer named after the dictionary string.
+        QListWidgetItem *listWidgetItemPointer = new QListWidgetItem(dictionaryString, spellCheckListWidgetPointer);
+
+        // Set the list widget item pointer to be checkable.
+        listWidgetItemPointer->setFlags(listWidgetItemPointer->flags() | Qt::ItemIsUserCheckable);
+
+        // Check the language if it is currently enabled.
+        if (enabledSpellCheckLanguagesList.contains(dictionaryString))
+            listWidgetItemPointer->setCheckState(Qt::Checked);
+        else
+            listWidgetItemPointer->setCheckState(Qt::Unchecked);
+
+        // Add the list widget item to the widget.
+        spellCheckListWidgetPointer->addItem(listWidgetItemPointer);
+    }
+
+    // Get a handle for the KConfig skeleton.
+    KConfigSkeleton *kConfigSkeletonPointer = Settings::self();
+
     // Instantiate a settings config dialog from the settings.kcfg file.
-    configDialogPointer = new KConfigDialog(this, QStringLiteral("settings"), Settings::self());
+    configDialogPointer = new KConfigDialog(this, QLatin1String("settings"), kConfigSkeletonPointer);
 
     // Add the settings widgets as config dialog pages.
-    configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("@title:tab", "Privacy"), QStringLiteral("privacy-browser"));
-    configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("@title:tab", "General"), QStringLiteral("breeze-settings"));
+    configDialogPointer->addPage(privacySettingsWidgetPointer, i18nc("Settings tab title", "Privacy"), QLatin1String("privacy-browser"));
+    configDialogPointer->addPage(generalSettingsWidgetPointer, i18nc("Settings tab title", "General"), QLatin1String("breeze-settings"));
+    configDialogPointer->addPage(spellCheckSettingsWidgetPointer, i18nc("Settings tab title", "Spell Check"), QLatin1String("tools-check-spelling"));
+
+    // Get handles for the buttons.
+    QPushButton *applyButtonPointer = configDialogPointer->button(QDialogButtonBox::Apply);
+    QPushButton *okButtonPointer = configDialogPointer->button(QDialogButtonBox::Ok);
 
     // Prevent interaction with the parent window while the dialog is open.
     configDialogPointer->setWindowModality(Qt::WindowModal);
@@ -681,7 +725,44 @@ void BrowserWindow::showSettingsDialog()
     // Expand the config dialog.
     configDialogPointer->resize(1000, 500);
 
-    // Apply the settings when they are updated.
+    // Create a save spell check languages lambda.
+    auto saveSpellCheckLanguages = [spellCheckListWidgetPointer, kConfigSkeletonPointer, this] ()
+    {
+        // Create a list of enabled languages.
+        QStringList newSpellCheckLanguages = QStringList();
+
+        // Get a count of all the languages.
+        int allLanguagesCount = spellCheckListWidgetPointer->count();
+
+        // Get a list of all the checked languages.
+        for (int i = 0; i < allLanguagesCount; ++i) {
+            // Get the language item.
+            QListWidgetItem *languageItemPointer = spellCheckListWidgetPointer->item(i);
+
+            // Add the item to the enabled languages if it is checked.
+            if (languageItemPointer->checkState() == Qt::Checked)
+                newSpellCheckLanguages.append(languageItemPointer->text());
+        }
+
+        // Update the spell check languages.
+        if (Settings::spellCheckLanguages() != newSpellCheckLanguages)
+        {
+            // Update the spell check languages.
+            Settings::setSpellCheckLanguages(newSpellCheckLanguages);
+
+            // Write the settings to disk.
+            kConfigSkeletonPointer->save();
+        }
+
+        // Apply the spell check languages.
+        tabWidgetPointer->applySpellCheckLanguages();
+    };
+
+    // Process
+    connect(applyButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages);
+    connect(okButtonPointer, &QPushButton::clicked, this, saveSpellCheckLanguages);
+
+    // Apply the settings handled by KConfig.
     connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyApplicationSettings()));
     connect(configDialogPointer, SIGNAL(settingsChanged(QString)), tabWidgetPointer, SLOT(applyDomainSettingsAndReload()));
 }