X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;ds=inline;f=src%2Fdialogs%2FDomainSettingsDialog.cpp;h=0907a18c184550cc73a59722f015456bc6d04fef;hb=refs%2Fheads%2Fmaster;hp=32d61d09e4363401848c19eb39a1851d9cd7268f;hpb=9b6cee96126484925bec4f4ab30c2b880df687fe;p=PrivacyBrowserPC.git diff --git a/src/dialogs/DomainSettingsDialog.cpp b/src/dialogs/DomainSettingsDialog.cpp index 32d61d0..6c5adf5 100644 --- a/src/dialogs/DomainSettingsDialog.cpp +++ b/src/dialogs/DomainSettingsDialog.cpp @@ -1,7 +1,7 @@ /* - * Copyright © 2022 Soren Stoutner . + * Copyright 2022-2024 Soren Stoutner . * - * This file is part of Privacy Browser PC . + * This file is part of Privacy Browser PC . * * Privacy Browser PC is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,26 +21,29 @@ #include "DomainSettingsDialog.h" #include "Settings.h" #include "ui_DomainSettingsDialog.h" -#include "helpers/DomainsDatabaseHelper.h" -#include "helpers/UserAgentHelper.h" +#include "databases/DomainsDatabase.h" // Qt toolkit headers. #include #include #include +#include // Define the public static int constants. const int DomainSettingsDialog::SHOW_ALL_DOMAINS = 0; -const int DomainSettingsDialog::ADD_DOMAIN = 1; -const int DomainSettingsDialog::EDIT_DOMAIN = 2; +const int DomainSettingsDialog::EDIT_DOMAIN = 1; -DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString &domainName) : QDialog(nullptr) +// Construct the class. +DomainSettingsDialog::DomainSettingsDialog(QWidget *parentWidgetPointer, const int &startType, const QString &domainName) : QDialog(parentWidgetPointer) { // Set the window title. setWindowTitle(i18nc("The domain settings dialog window title", "Domain Settings")); // Set the window modality. - setWindowModality(Qt::WindowModality::ApplicationModal);; + setWindowModality(Qt::WindowModality::ApplicationModal); + + // Instantiate the user agent helper. + userAgentHelperPointer = new UserAgentHelper(); // Instantiate the domain settings dialog UI. Ui::DomainSettingsDialog domainSettingsDialogUi; @@ -48,16 +51,38 @@ DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString & // Setup the UI. domainSettingsDialogUi.setupUi(this); - // Get handles for the views. + // Get handles for the widgets. domainsListViewPointer = domainSettingsDialogUi.domainsListView; domainSettingsWidgetPointer = domainSettingsDialogUi.domainSettingsWidget; domainNameLineEditPointer = domainSettingsDialogUi.domainNameLineEdit; + javaScriptWidgetPointer = domainSettingsDialogUi.javaScriptWidget; javaScriptComboBoxPointer = domainSettingsDialogUi.javaScriptComboBox; javaScriptLabelPointer = domainSettingsDialogUi.javaScriptLabel; + localStorageWidgetPointer = domainSettingsDialogUi.localStorageWidget; localStorageComboBoxPointer = domainSettingsDialogUi.localStorageComboBox; localStorageLabelPointer = domainSettingsDialogUi.localStorageLabel; + domStorageWidgetPointer = domainSettingsDialogUi.domStorageWidget; + domStorageComboBoxPointer = domainSettingsDialogUi.domStorageComboBox; + domStorageLabelPointer = domainSettingsDialogUi.domStorageLabel; + userAgentWidgetPointer = domainSettingsDialogUi.userAgentWidget; userAgentComboBoxPointer = domainSettingsDialogUi.userAgentComboBox; userAgentLabelPointer = domainSettingsDialogUi.userAgentLabel; + ultraPrivacyWidgetPointer = domainSettingsDialogUi.ultraPrivacyWidget; + ultraPrivacyComboBoxPointer = domainSettingsDialogUi.ultraPrivacyComboBox; + ultraPrivacyLabelPointer = domainSettingsDialogUi.ultraPrivacyLabel; + ultraListWidgetPointer = domainSettingsDialogUi.ultraListWidget; + ultraListComboBoxPointer = domainSettingsDialogUi.ultraListComboBox; + ultraListLabelPointer = domainSettingsDialogUi.ultraListLabel; + easyPrivacyWidgetPointer = domainSettingsDialogUi.easyPrivacyWidget; + easyPrivacyComboBoxPointer = domainSettingsDialogUi.easyPrivacyComboBox; + easyPrivacyLabelPointer = domainSettingsDialogUi.easyPrivacyLabel; + easyListWidgetPointer = domainSettingsDialogUi.easyListWidget; + easyListComboBoxPointer = domainSettingsDialogUi.easyListComboBox; + easyListLabelPointer = domainSettingsDialogUi.easyListLabel; + fanboysAnnoyanceListWidgetPointer = domainSettingsDialogUi.fanboysAnnoyanceListWidget; + fanboysAnnoyanceListComboBoxPointer = domainSettingsDialogUi.fanboysAnnoyanceListComboBox; + fanboysAnnoyanceListLabelPointer = domainSettingsDialogUi.fanboysAnnoyanceListLabel; + zoomFactorWidgetPointer = domainSettingsDialogUi.zoomFactorWidget; zoomFactorComboBoxPointer = domainSettingsDialogUi.zoomFactorComboBox; customZoomFactorSpinBoxPointer = domainSettingsDialogUi.customZoomFactorSpinBox; QPushButton *addDomainButtonPointer = domainSettingsDialogUi.addDomainButton; @@ -67,10 +92,10 @@ DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString & resetButtonPointer = dialogButtonBoxPointer->button(QDialogButtonBox::StandardButton::Reset); // Create a table model. - domainsTableModelPointer = new QSqlTableModel(nullptr, QSqlDatabase::database(DomainsDatabaseHelper::CONNECTION_NAME)); + domainsTableModelPointer = new QSqlTableModel(nullptr, QSqlDatabase::database(DomainsDatabase::CONNECTION_NAME)); // Set the table for the model. - domainsTableModelPointer->setTable(DomainsDatabaseHelper::DOMAINS_TABLE); + domainsTableModelPointer->setTable(DomainsDatabase::DOMAINS_TABLE); // Set the edit strategy to be manual. domainsTableModelPointer->setEditStrategy(QSqlTableModel::EditStrategy::OnManualSubmit); @@ -84,30 +109,37 @@ DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString & // Set the visible column to be the domain name. domainsListViewPointer->setModelColumn(1); + // Get the domains selection model pointer. + domainsSelectionModelPointer = domainsListViewPointer->selectionModel(); + // Disable editing of the list view. domainsListViewPointer->setEditTriggers(QAbstractItemView::NoEditTriggers); // Read the data from the database and apply it to the table model. domainsTableModelPointer->select(); + // Get the default palette. + defaultPalette = javaScriptWidgetPointer->palette(); + + // Populate the highlighted palette. + highlightedPalette = defaultPalette; + + // Get the default highlight color. + QColor highlightColor = defaultPalette.color(QPalette::Highlight); + + // Set the highlight color to be partially transparent. + highlightColor.setAlpha(64); + + // Set highlighted background color. + highlightedPalette.setColor(QPalette::Window, highlightColor); + // Setup the dialog according to the start type. switch (startType) { case SHOW_ALL_DOMAINS: { // Select the first entry in the list view. - domainsListViewPointer->setCurrentIndex(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::DOMAIN_NAME))); - - // Populate the domain settings. - domainSelected(domainsListViewPointer->selectionModel()->currentIndex()); - - break; - } - - case ADD_DOMAIN: - { - // Add the new domain. - addDomain(domainName); + domainsListViewPointer->setCurrentIndex(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabase::DOMAIN_NAME))); break; } @@ -115,25 +147,33 @@ DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString & case EDIT_DOMAIN: { // Find the index for the new domain. `1` returns the first match. - QModelIndexList newDomainIndex = domainsTableModelPointer->match(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::DOMAIN_NAME)), - Qt::DisplayRole, domainName, 1, Qt::MatchWrap); + QModelIndexList newDomainIndex = domainsTableModelPointer->match(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabase::DOMAIN_NAME)), + Qt::DisplayRole, domainName, 1, Qt::MatchWrap); // Move to the new domain. domainsListViewPointer->setCurrentIndex(newDomainIndex[0]); - // Populate the domain settings. - domainSelected(domainsListViewPointer->selectionModel()->currentIndex()); + break; } } + // Populate the domain settings. + domainSelected(domainsSelectionModelPointer->currentIndex()); + // Handle clicks on the domains. connect(domainsListViewPointer, SIGNAL(activated(QModelIndex)), this, SLOT(domainSelected(QModelIndex))); - // Connect the domain settings. + // Process changes to the domain settings. connect(domainNameLineEditPointer, SIGNAL(textEdited(QString)), this, SLOT(domainNameChanged(QString))); connect(javaScriptComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(javaScriptChanged(int))); connect(localStorageComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(localStorageChanged(int))); + connect(domStorageComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(domStorageChanged(int))); connect(userAgentComboBoxPointer, SIGNAL(currentTextChanged(QString)), this, SLOT(userAgentChanged(QString))); + connect(ultraPrivacyComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(ultraPrivacyChanged(int))); + connect(ultraListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(ultraListChanged(int))); + connect(easyPrivacyComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(easyPrivacyChanged(int))); + connect(easyListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(easyListChanged(int))); + connect(fanboysAnnoyanceListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(fanboysAnnoyanceListChanged(int))); connect(zoomFactorComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(zoomFactorComboBoxChanged(int))); connect(customZoomFactorSpinBoxPointer, SIGNAL(valueChanged(double)), this, SLOT(customZoomFactorChanged(double))); @@ -145,64 +185,33 @@ DomainSettingsDialog::DomainSettingsDialog(const int &startType, const QString & connect(applyButtonPointer, SIGNAL(clicked()), this, SLOT(apply())); connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(cancel())); - // Update the UI. - updateUi(); -} - -void DomainSettingsDialog::addDomain(const QString &domainName) const -{ - // Create a new domain record. - QSqlRecord newDomainRecord = QSqlDatabase::database(DomainsDatabaseHelper::CONNECTION_NAME).record(DomainsDatabaseHelper::DOMAINS_TABLE); - - // Set the values for the new domain. - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::DOMAIN_NAME), domainName); - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::JAVASCRIPT), DomainsDatabaseHelper::SYSTEM_DEFAULT); - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::LOCAL_STORAGE), DomainsDatabaseHelper::SYSTEM_DEFAULT); - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::USER_AGENT), UserAgentHelper::SYSTEM_DEFAULT_DATABASE); - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::ZOOM_FACTOR), DomainsDatabaseHelper::SYSTEM_DEFAULT); - newDomainRecord.setValue(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::CUSTOM_ZOOM_FACTOR), 1.0); - - // Insert the new domain. `-1` appends it to the end. - domainsTableModelPointer->insertRecord(-1, newDomainRecord); + // Update the DOM storage status. + updateDomStorageStatus(); - // Submit all pending changes. - domainsTableModelPointer->submitAll(); - - // Find the index for the new domain. `-1` allows for multiple entries to be returned. - QModelIndexList newDomainIndex = domainsTableModelPointer->match(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::DOMAIN_NAME)), - Qt::DisplayRole, domainName, -1, Qt::MatchWrap); - - // Move to the new domain. If there are multiple domains with the same name, the new one should be the last in the list. - domainsListViewPointer->setCurrentIndex(newDomainIndex[newDomainIndex.size() - 1]); - - // Populate the domain settings. - domainSelected(domainsListViewPointer->selectionModel()->currentIndex()); - - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } - void DomainSettingsDialog::apply() const { // Get the current index. QModelIndex currentIndex = domainsListViewPointer->currentIndex(); // Get the ID of the current index row. - QVariant currentId = currentIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::_ID)).data(); + QVariant currentId = currentIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ID)).data(); // Submit all pending changes. domainsTableModelPointer->submitAll(); // Find the new index for the selected id. The `1` keeps searching after the first match. - QModelIndexList newIndexList = domainsTableModelPointer->match(currentIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::_ID)), Qt::DisplayRole, currentId, + QModelIndexList newIndexList = domainsTableModelPointer->match(currentIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ID)), Qt::DisplayRole, currentId, 1, Qt::MatchWrap); // Select the new index. - domainsListViewPointer->setCurrentIndex(newIndexList[0].siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::DOMAIN_NAME))); + domainsListViewPointer->setCurrentIndex(newIndexList[0].siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::DOMAIN_NAME))); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); // Emit the domain settings updated signal. emit domainSettingsUpdated(); @@ -217,23 +226,34 @@ void DomainSettingsDialog::cancel() reject(); } -void DomainSettingsDialog::customZoomFactorChanged(const double &newValue) const +void DomainSettingsDialog::customZoomFactorChanged(const double newValue) const { // Update the domains table model. - domainsTableModelPointer->setData(domainsListViewPointer->selectionModel()->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::CUSTOM_ZOOM_FACTOR)), - newValue); + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::CUSTOM_ZOOM_FACTOR)), newValue); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::domStorageChanged(const int newIndex) const +{ + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::DOM_STORAGE)), newIndex); + + // Populate the DOM storage label. + populateLabel(DOM_STORAGE); + + // Update the buttons. + updateButtons(); } void DomainSettingsDialog::domainNameChanged(const QString &updatedDomainName) const { // Update the domains table model. - domainsTableModelPointer->setData(domainsListViewPointer->selectionModel()->currentIndex(), updatedDomainName); + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex(), updatedDomainName); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } void DomainSettingsDialog::domainSelected(const QModelIndex &modelIndex) const @@ -242,13 +262,16 @@ void DomainSettingsDialog::domainSelected(const QModelIndex &modelIndex) const domainNameLineEditPointer->setText(modelIndex.data().toString()); // Populate the JavaScript combo box. - javaScriptComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::JAVASCRIPT)).data().toInt()); + javaScriptComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::JAVASCRIPT)).data().toInt()); // Populate the local storage combo box. - localStorageComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::LOCAL_STORAGE)).data().toInt()); + localStorageComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::LOCAL_STORAGE)).data().toInt()); + + // Populate the DOM storage combo box. + domStorageComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::DOM_STORAGE)).data().toInt()); // Get the user agent string. - QString userAgent = modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::USER_AGENT)).data().toString(); + QString userAgent = modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::USER_AGENT)).data().toString(); // Get the user agent index. int userAgentIndex = UserAgentHelper::getDomainSettingsUserAgentIndex(userAgent); @@ -259,8 +282,15 @@ void DomainSettingsDialog::domainSelected(const QModelIndex &modelIndex) const // Set the custom user agent if specified. if (userAgentIndex == -1) userAgentComboBoxPointer->setCurrentText(userAgent); + // Populate the filter lists combo boxes. + ultraPrivacyComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ULTRAPRIVACY)).data().toInt()); + ultraListComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ULTRALIST)).data().toInt()); + easyPrivacyComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::EASYPRIVACY)).data().toInt()); + easyListComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::EASYLIST)).data().toInt()); + fanboysAnnoyanceListComboBoxPointer->setCurrentIndex(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::FANBOYS_ANNOYANCE_LIST)).data().toInt()); + // Get the zoom factor combo box index. - int zoomFactorComboBoxIndex = modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::ZOOM_FACTOR)).data().toInt(); + int zoomFactorComboBoxIndex = modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ZOOM_FACTOR)).data().toInt(); // Populate the zoom factor combo box. zoomFactorComboBoxPointer->setCurrentIndex(zoomFactorComboBoxIndex); @@ -270,49 +300,101 @@ void DomainSettingsDialog::domainSelected(const QModelIndex &modelIndex) const { // Display the default zoom factor. customZoomFactorSpinBoxPointer->setValue(Settings::zoomFactor()); + + // Use the default palette. + zoomFactorWidgetPointer->setPalette(defaultPalette); } else // Custom zoom factor is selected. { // Display the custom zoom factor from the domain settings. - customZoomFactorSpinBoxPointer->setValue(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::CUSTOM_ZOOM_FACTOR)).data().toDouble()); + customZoomFactorSpinBoxPointer->setValue(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::CUSTOM_ZOOM_FACTOR)).data().toDouble()); + + // Use the highlighted palette. + zoomFactorWidgetPointer->setPalette(highlightedPalette); } // Set the initial status of the custom zoom factor spin box. customZoomFactorSpinBoxPointer->setEnabled(zoomFactorComboBoxIndex); // Populate the labels. - populateJavaScriptLabel(); - populateLocalStorageLabel(); + populateLabel(JAVASCRIPT); + populateLabel(LOCAL_STORAGE); + populateLabel(DOM_STORAGE); + populateLabel(ULTRAPRIVACY); + populateLabel(ULTRALIST); + populateLabel(EASYPRIVACY); + populateLabel(EASYLIST); + populateLabel(FANBOYS_ANNOYANCE_LIST); populateUserAgentLabel(userAgentComboBoxPointer->currentText()); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::easyListChanged(const int newIndex) const +{ + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::EASYLIST)), newIndex); + + // Populate the EasyList label. + populateLabel(EASYLIST); + + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::easyPrivacyChanged(const int newIndex) const +{ + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::EASYPRIVACY)), newIndex); + + // Populate the EasyPrivacy label. + populateLabel(EASYPRIVACY); + + // Update the buttons. + updateButtons(); } -void DomainSettingsDialog::javaScriptChanged(const int &newIndex) const +void DomainSettingsDialog::fanboysAnnoyanceListChanged(const int newIndex) const { // Update the domains table model. - domainsTableModelPointer->setData(domainsListViewPointer->selectionModel()->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::JAVASCRIPT)), - newIndex); + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::FANBOYS_ANNOYANCE_LIST)), newIndex); + + // Populate the Fanboy's Annoyance List label. + populateLabel(FANBOYS_ANNOYANCE_LIST); + + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::javaScriptChanged(const int newIndex) const +{ + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::JAVASCRIPT)), newIndex); // Populate the JavaScript label. - populateJavaScriptLabel(); + populateLabel(JAVASCRIPT); + + // Update the DOM storage status. + updateDomStorageStatus(); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } -void DomainSettingsDialog::localStorageChanged(const int &newIndex) const +void DomainSettingsDialog::localStorageChanged(const int newIndex) const { // Update the domains table model. - domainsTableModelPointer->setData(domainsListViewPointer->selectionModel()->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::LOCAL_STORAGE)), - newIndex); + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::LOCAL_STORAGE)), newIndex); // Populate the local storage label. - populateLocalStorageLabel(); + populateLabel(LOCAL_STORAGE); + + // Update the DOM storage status. + updateDomStorageStatus(); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } void DomainSettingsDialog::ok() @@ -321,70 +403,219 @@ void DomainSettingsDialog::ok() domainsTableModelPointer->submitAll(); // Emit the domain settings updated signal. - domainSettingsUpdated(); + emit domainSettingsUpdated(); // Close the dialog. accept(); } -void DomainSettingsDialog::populateJavaScriptLabel() const +void DomainSettingsDialog::populateLabel(const int label) const { - // Populate the label according to the currently selected index. - switch (javaScriptComboBoxPointer->currentIndex()) + // Create the label strings. + QString enabledString; + QString enabledBoldString; + QString disabledString; + QString disabledBoldString; + + // Create the system default bool. + bool systemDefaultEnabled; + + // Create the widget pointers. + QWidget *widgetPointer; + QComboBox *comboBoxPointer; + QLabel *labelPointer; + + // Populate the local variables. + switch (label) { - case (DomainsDatabaseHelper::SYSTEM_DEFAULT): + case (JAVASCRIPT): { - // Set the text according to the system default. - if (Settings::javaScript()) javaScriptLabelPointer->setText(i18nc("Domains settings label", "JavaScript enabled")); - else javaScriptLabelPointer->setText(i18nc("Domain settings label", "JavaScript disabled")); + // Populate the label strings. + enabledString = i18nc("Domain settings JavaScript label.", "JavaScript enabled"); + enabledBoldString = i18nc("Domain settings JavaScript label. The tags should be retained.", "JavaScript enabled"); + disabledString = i18nc("Domain settings JavaScript label.", "JavaScript disabled"); + disabledBoldString = i18nc("Domain settings JavaScript label. The tags should be retained.", "JavaScript disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::javaScriptEnabled(); + + // Populate the widget pointers. + widgetPointer = javaScriptWidgetPointer; + comboBoxPointer = javaScriptComboBoxPointer; + labelPointer = javaScriptLabelPointer; + + break; + } + + case (LOCAL_STORAGE): + { + // Populate the label strings. + enabledString = i18nc("Domain settings local storage label.", "Local storage enabled"); + enabledBoldString = i18nc("Domain settings local storage label. The tags should be retained.", "Local storage enabled"); + disabledString = i18nc("Domain settings local storage label.", "Local storage disabled"); + disabledBoldString = i18nc("Domain settings local storage label. The tags should be retained.", "Local storage disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::localStorageEnabled(); + + // Populate the widget pointers. + widgetPointer = localStorageWidgetPointer; + comboBoxPointer = localStorageComboBoxPointer; + labelPointer = localStorageLabelPointer; + + break; + } + + case (DOM_STORAGE): + { + // Populate the label strings. + enabledString = i18nc("Domain settings DOM storage label.", "DOM storage enabled"); + enabledBoldString = i18nc("Domain settings DOM storage label. The tags should be retained.", "DOM storage enabled"); + disabledString = i18nc("Domain settings DOM storage label.", "DOM storage disabled"); + disabledBoldString = i18nc("Domain settings DOM storage label. The tags should be retained.", "DOM storage disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::domStorageEnabled(); + + // Populate the widget pointers. + widgetPointer = domStorageWidgetPointer; + comboBoxPointer = domStorageComboBoxPointer; + labelPointer = domStorageLabelPointer; + + break; + } + + case (ULTRAPRIVACY): + { + // Populate the label strings. + enabledString = i18nc("Domain settings UltraPrivacy enabled label.", "UltraPrivacy enabled"); + enabledBoldString = i18nc("Domain settings UltraPrivacy enabled bold label. The tags should be retained.", "UltraPrivacy enabled"); + disabledString = i18nc("Domain settings UltraPrivacy disabled label.", "UltraPrivacy disabled"); + disabledBoldString = i18nc("Domain settings UltraPrivacy disabled bold label. The tags should be retained.", "UltraPrivacy disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::ultraPrivacyEnabled(); + + // Populate the widget pointers. + widgetPointer = ultraPrivacyWidgetPointer; + comboBoxPointer = ultraPrivacyComboBoxPointer; + labelPointer = ultraPrivacyLabelPointer; + + break; + } + + case (ULTRALIST): + { + // Populate the label strings. + enabledString = i18nc("Domain settings UltraList enabled label.", "UltraList enabled"); + enabledBoldString = i18nc("Domain settings UltraList enabled bold label. The tags should be retained.", "UltraList enabled"); + disabledString = i18nc("Domain settings UltraList disabled label.", "UltraList disabled"); + disabledBoldString = i18nc("Domain settings UltraList disabled bold label. The tags should be retained.", "UltraList disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::ultraListEnabled(); + + // Populate the widget pointers. + widgetPointer = ultraListWidgetPointer; + comboBoxPointer = ultraListComboBoxPointer; + labelPointer = ultraListLabelPointer; break; } - case (DomainsDatabaseHelper::DISABLED): + case (EASYPRIVACY): { - // Set the label text in bold. - javaScriptLabelPointer->setText(i18nc("Domain settings label. The tags should be retained.", "JavaScript disabled")); + // Populate the label strings. + enabledString = i18nc("Domain settings EasyPrivacy enabled label.", "EasyPrivacy enabled"); + enabledBoldString = i18nc("Domain settings EasyPrivacy enabled bold label. The tags should be retained.", "EasyPrivacy enabled"); + disabledString = i18nc("Domain settings EasyPrivacy disabled label.", "EasyPrivacy disabled"); + disabledBoldString = i18nc("Domain settings EasyPrivacy disabled bold label. The tags should be retained.", "EasyPrivacy disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::easyPrivacyEnabled(); + + // Populate the widget pointers. + widgetPointer = easyPrivacyWidgetPointer; + comboBoxPointer = easyPrivacyComboBoxPointer; + labelPointer = easyPrivacyLabelPointer; break; } - case (DomainsDatabaseHelper::ENABLED): + case (EASYLIST): { - // Set the label text in bold. - javaScriptLabelPointer->setText(i18nc("Domains settings label. The tags should be retained.", "JavaScript enabled")); + // Populate the label strings. + enabledString = i18nc("Domain settings EasyList enabled label.", "EasyList enabled"); + enabledBoldString = i18nc("Domain settings EasyList enabled bold label. The tags should be retained.", "EasyList enabled"); + disabledString = i18nc("Domain settings EasyList disabled label.", "EasyList disabled"); + disabledBoldString = i18nc("Domain settings EasyList disabled bold label. The tags should be retained.", "EasyList disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::easyListEnabled(); + + // Populate the widget pointers. + widgetPointer = easyListWidgetPointer; + comboBoxPointer = easyListComboBoxPointer; + labelPointer = easyListLabelPointer; + + break; + } + + case (FANBOYS_ANNOYANCE_LIST): + { + // Populate the label strings. + enabledString = i18nc("Domain settings Fanboy’s Annoyance List enabled label.", "Fanboy’s Annoyance List enabled"); + enabledBoldString = i18nc("Domain settings Fanboy’s Annoyance List enabled bold label. The tags should be retained.", "Fanboy’s Annoyance List enabled"); + disabledString = i18nc("Domain settings Fanboy’s Annoyance List disabled label.", "Fanboy’s Annoyance List disabled"); + disabledBoldString = i18nc("Domain settings Fanboy’s Annoyance List disabled bold label. The tags should be retained.", "Fanboy’s Annoyance List disabled"); + + // Populate the system default bool. + systemDefaultEnabled = Settings::fanboysAnnoyanceListEnabled(); + + // Populate the widget pointers. + widgetPointer = fanboysAnnoyanceListWidgetPointer; + comboBoxPointer = fanboysAnnoyanceListComboBoxPointer; + labelPointer = fanboysAnnoyanceListLabelPointer; break; } } -} -void DomainSettingsDialog::populateLocalStorageLabel() const -{ - // Populate the label according to the currently selected index. - switch (localStorageComboBoxPointer->currentIndex()) + // Populate the label and widget palette according to the currently selected combo box index. + switch (comboBoxPointer->currentIndex()) { - case (DomainsDatabaseHelper::SYSTEM_DEFAULT): + case (DomainsDatabase::SYSTEM_DEFAULT): { // Set the text according to the system default. - if (Settings::localStorage()) localStorageLabelPointer->setText(i18nc("Local storage label", "Local storage enabled")); - else localStorageLabelPointer->setText(i18nc("Local storage label", "Local storage disabled")); + if (systemDefaultEnabled) + labelPointer->setText(enabledString); + else + labelPointer->setText(disabledString); + + // Reset the palette. + widgetPointer->setPalette(defaultPalette); break; } - case (DomainsDatabaseHelper::DISABLED): + case (DomainsDatabase::ENABLED): { - // Set the label text in bold. - localStorageLabelPointer->setText(i18nc("Local storage label. The tags should be retained.", "Local storage disabled")); + // Set the enabled bold text. + labelPointer->setText(enabledBoldString); + + // Set the palette. + widgetPointer->setPalette(highlightedPalette); break; } - case (DomainsDatabaseHelper::ENABLED): + case (DomainsDatabase::DISABLED): { - // Set the label text in bold. - localStorageLabelPointer->setText(i18nc("Local storage label. The tags should be retained.", "Local storage enabled")); + // Set the disabled bold text. + labelPointer->setText(disabledBoldString); + + // Set the palette. + widgetPointer->setPalette(highlightedPalette); break; } @@ -394,15 +625,21 @@ void DomainSettingsDialog::populateLocalStorageLabel() const void DomainSettingsDialog::populateUserAgentLabel(const QString &userAgentName) const { // Populate the label according to the type. - if (userAgentName == UserAgentHelper::SYSTEM_DEFAULT_TRANSLATED) + if (userAgentName == userAgentHelperPointer->SYSTEM_DEFAULT_TRANSLATED) { // Display the system default user agent name. - userAgentLabelPointer->setText(UserAgentHelper::getTranslatedUserAgentNameFromDatabaseName(Settings::userAgent())); + userAgentLabelPointer->setText(userAgentHelperPointer->getTranslatedUserAgentNameFromDatabaseName(Settings::userAgent())); + + // Reset the palette. + userAgentWidgetPointer->setPalette(defaultPalette); } else { // Display the user agent name in bold. userAgentLabelPointer->setText("" + userAgentName + ""); + + // Set the palette. + userAgentWidgetPointer->setPalette(highlightedPalette); } } @@ -414,8 +651,8 @@ void DomainSettingsDialog::reset() const // Repopulate the domain settings. domainSelected(domainsListViewPointer->currentIndex()); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } void DomainSettingsDialog::showAddMessageBox() @@ -431,7 +668,31 @@ void DomainSettingsDialog::showAddMessageBox() QLineEdit::Normal, QString(), &okClicked); // Add the new domain if the user clicked OK. - if (okClicked) addDomain(newDomainName); + if (okClicked) + { + // Add the new domain. + DomainsDatabase::addDomain(newDomainName); + + // Submit all pending changes. This reloads the model from the database, getting the new domain added above. + domainsTableModelPointer->submitAll(); + + + // Find the index for the new domain. `-1` allows for multiple entries to be returned. + QModelIndexList newDomainIndex = domainsTableModelPointer->match(domainsTableModelPointer->index(0, domainsTableModelPointer->fieldIndex(DomainsDatabase::DOMAIN_NAME)), + Qt::DisplayRole, newDomainName, -1, Qt::MatchWrap); + + // Move to the new domain. If there are multiple domains with the same name, the new one should be the last in the list. + domainsListViewPointer->setCurrentIndex(newDomainIndex[newDomainIndex.size() - 1]); + + // Populate the domain settings. + domainSelected(domainsSelectionModelPointer->currentIndex()); + + // Update the buttons. + updateButtons(); + + // Emit the domain settings updated signal. + emit domainSettingsUpdated(); + } } void DomainSettingsDialog::showDeleteMessageBox() const @@ -467,7 +728,7 @@ void DomainSettingsDialog::showDeleteMessageBox() const QModelIndex currentIndex = domainsListViewPointer->currentIndex(); // Delete the current row. - domainsTableModelPointer->removeRow(domainsListViewPointer->selectionModel()->currentIndex().row()); + domainsTableModelPointer->removeRow(domainsSelectionModelPointer->currentIndex().row()); // Submit all pending changes. domainsTableModelPointer->submitAll(); @@ -491,62 +752,167 @@ void DomainSettingsDialog::showDeleteMessageBox() const domainSelected(domainsListViewPointer->currentIndex()); } - // Update the Ui. - updateUi(); + // Update the buttons. + updateButtons(); + + // Emit the domain settings updated signal. + emit domainSettingsUpdated(); } } -void DomainSettingsDialog::updateUi() const +void DomainSettingsDialog::ultraListChanged(const int newIndex) const { - // Update the delete button status. - deleteDomainButtonPointer->setEnabled(domainsListViewPointer->selectionModel()->hasSelection()); + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ULTRALIST)), newIndex); - // Update the apply button status. - applyButtonPointer->setEnabled(domainsTableModelPointer->isDirty()); + // Populate the UltraList label. + populateLabel(ULTRALIST); + + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::ultraPrivacyChanged(const int newIndex) const +{ + // Update the domains table model. + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ULTRAPRIVACY)), newIndex); + + // Populate the UltraPrivacy label. + populateLabel(ULTRAPRIVACY); + + // Update the buttons. + updateButtons(); +} + +void DomainSettingsDialog::updateButtons() const +{ + // Update the delete button status. + deleteDomainButtonPointer->setEnabled(domainsSelectionModelPointer->hasSelection()); // Update the reset button status. resetButtonPointer->setEnabled(domainsTableModelPointer->isDirty()); + // Update the apply button status. + applyButtonPointer->setEnabled(domainsTableModelPointer->isDirty()); + // Display the domain settings if there is at least one domain. domainSettingsWidgetPointer->setVisible(domainsTableModelPointer->rowCount() > 0); } +void DomainSettingsDialog::updateDomStorageStatus() const +{ + // Instantiate tracking variables. + bool javaScriptEnabled; + bool localStorageEnabled; + + // Populate the JavaScript tracker. + switch (javaScriptComboBoxPointer->currentIndex()) + { + case (DomainsDatabase::SYSTEM_DEFAULT): + { + // Update the tracker according to the system default. + if (Settings::javaScriptEnabled()) + javaScriptEnabled = true; + else + javaScriptEnabled = false; + + break; + } + + case (DomainsDatabase::ENABLED): + { + // Update the tracker. + javaScriptEnabled = true; + + break; + } + + case (DomainsDatabase::DISABLED): + { + // Update the tracker. + javaScriptEnabled = false; + + break; + } + } + + // Populate the local storage tracker. + switch (localStorageComboBoxPointer->currentIndex()) + { + case (DomainsDatabase::SYSTEM_DEFAULT): + { + // Update the tracker according to the system default. + if (Settings::localStorageEnabled()) + localStorageEnabled = true; + else + localStorageEnabled = false; + + break; + } + + case (DomainsDatabase::ENABLED): + { + // Update the tracker. + localStorageEnabled = true; + + break; + } + + case (DomainsDatabase::DISABLED): + { + // Update the tracker. + localStorageEnabled = false; + + break; + } + } + + // Only enable DOM storage if both JavaScript and local storage are enabled. + domStorageComboBoxPointer->setEnabled(javaScriptEnabled && localStorageEnabled); +} + void DomainSettingsDialog::userAgentChanged(const QString &updatedUserAgent) const { // Update the domains table model. - domainsTableModelPointer->setData(domainsListViewPointer->selectionModel()->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::USER_AGENT)), - UserAgentHelper::getDatabaseUserAgentNameFromTranslatedName(updatedUserAgent)); + domainsTableModelPointer->setData(domainsSelectionModelPointer->currentIndex().siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::USER_AGENT)), + userAgentHelperPointer->getDatabaseUserAgentNameFromTranslatedName(updatedUserAgent)); // Populate the user agent label. populateUserAgentLabel(updatedUserAgent); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); } -void DomainSettingsDialog::zoomFactorComboBoxChanged(const int &newIndex) const +void DomainSettingsDialog::zoomFactorComboBoxChanged(const int newIndex) const { // Get the current model index. - QModelIndex modelIndex = domainsListViewPointer->selectionModel()->currentIndex(); + QModelIndex modelIndex = domainsSelectionModelPointer->currentIndex(); // Update the domains table model. - domainsTableModelPointer->setData(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::ZOOM_FACTOR)), newIndex); + domainsTableModelPointer->setData(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::ZOOM_FACTOR)), newIndex); // Populate the custom zoom factor spin box according to the zoom factor combo box. if (newIndex == 0) // System default zoom factor is selected. { // Display the default zoom factor. customZoomFactorSpinBoxPointer->setValue(Settings::zoomFactor()); + + // Reset the palette. + zoomFactorWidgetPointer->setPalette(defaultPalette); } else // Custom zoom factor is selected. { // Display the custom zoom factor from the domain settings. - customZoomFactorSpinBoxPointer->setValue(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabaseHelper::CUSTOM_ZOOM_FACTOR)).data().toDouble()); + customZoomFactorSpinBoxPointer->setValue(modelIndex.siblingAtColumn(domainsTableModelPointer->fieldIndex(DomainsDatabase::CUSTOM_ZOOM_FACTOR)).data().toDouble()); + + // Use the highlighted palette. + zoomFactorWidgetPointer->setPalette(highlightedPalette); } // Update the status of the custom zoom factor spin box. customZoomFactorSpinBoxPointer->setEnabled(newIndex); - // Update the UI. - updateUi(); + // Update the buttons. + updateButtons(); }