X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=src%2Fdialogs%2FFilterEntryDialog.cpp;fp=src%2Fdialogs%2FFilterEntryDialog.cpp;h=703ca0417daa2f41300aa4894c73cba365c81061;hb=be625d0fcb1f4e8184ed62a28d23629f8c246d8e;hp=0000000000000000000000000000000000000000;hpb=f8f8d907d0caa128abf73696f812f8e92db812b7;p=PrivacyBrowserPC.git diff --git a/src/dialogs/FilterEntryDialog.cpp b/src/dialogs/FilterEntryDialog.cpp new file mode 100644 index 0000000..703ca04 --- /dev/null +++ b/src/dialogs/FilterEntryDialog.cpp @@ -0,0 +1,245 @@ +/* + * Copyright 2024 Soren Stoutner . + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Privacy Browser PC is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Privacy Browser PC. If not, see . + */ + +// Application headers. +#include "FilterEntryDialog.h" +#include "GlobalVariables.h" +#include "ui_FilterEntryDialog.h" + +// KDE Framework headers. +#include + +// Qt toolkit headers. +#include + +// Construct the class. +FilterEntryDialog::FilterEntryDialog(QWidget *parentWidgetPointer, QTableWidget *tableWidgetPointer, const int initialRow, const QString &filterListTitle, const QString &sublistTitle) : + QDialog(parentWidgetPointer), currentRow(initialRow), tableWidgetPointer(tableWidgetPointer) +{ + // Set the window modality. + setWindowModality(Qt::WindowModality::ApplicationModal); + + // Instantiate the filter entry dialog UI. + Ui::FilterEntryDialog filterEntryDialogUi; + + // Setup the UI. + filterEntryDialogUi.setupUi(this); + + // Get handles for the views. + QLineEdit *filterListLineEditPointer = filterEntryDialogUi.filterListLineEdit; + QLineEdit *sublistLineEditPointer = filterEntryDialogUi.sublistListLineEdit; + appliedEntryListLineEditPointer = filterEntryDialogUi.appliedEntryListLineEdit; + initialMatchLineEditPointer = filterEntryDialogUi.initialMatchLineEdit; + finalMatchLineEditPointer = filterEntryDialogUi.finalMatchLineEdit; + domainLineEditPointer = filterEntryDialogUi.domainLineEdit; + domainListLineEditPointer = filterEntryDialogUi.domainListLineEdit; + thirdPartyLineEditPointer = filterEntryDialogUi.thirdPartyLineEdit; + hasRequestOptionsCheckBoxPointer = filterEntryDialogUi.hasRequestOptionsCheckBox; + fontLineEditPointer = filterEntryDialogUi.fontLineEdit; + imageLineEditPointer = filterEntryDialogUi.imageLineEdit; + mainFrameLineEditPointer = filterEntryDialogUi.mainFrameLineEdit; + mediaLineEditPointer = filterEntryDialogUi.mediaLineEdit; + objectLineEditPointer = filterEntryDialogUi.objectLineEdit; + otherLineEditPointer = filterEntryDialogUi.otherLineEdit; + pingLineEditPointer = filterEntryDialogUi.pingLineEdit; + scriptLineEditPointer = filterEntryDialogUi.scriptLineEdit; + styleSheetLineEditPointer = filterEntryDialogUi.styleSheetLineEdit; + subFrameLineEditPointer = filterEntryDialogUi.subFrameLineEdit; + xmlHttpRequestLineEditPointer = filterEntryDialogUi.xmlHttpRequestLineEdit; + appliedFilterOptionsLineEditPointer = filterEntryDialogUi.appliedFilterOptionsLineEdit; + originalFilterOptionsLineEditPointer = filterEntryDialogUi.originalFilterOptionsLineEdit; + originalEntryLineEditPointer = filterEntryDialogUi.originalEntryLineEdit; + previousButtonPointer = filterEntryDialogUi.previousButton; + nextButtonPointer = filterEntryDialogUi.nextButton; + QDialogButtonBox *dialogButtonBoxPointer = filterEntryDialogUi.dialogButtonBox; + QPushButton *closeButtonPointer = dialogButtonBoxPointer->button(QDialogButtonBox::StandardButton::Close); + + // Populate the views. + filterListLineEditPointer->setText(filterListTitle); + sublistLineEditPointer->setText(sublistTitle); + + // Disable changing the checkbox checked status. + hasRequestOptionsCheckBoxPointer->setAttribute(Qt::WA_TransparentForMouseEvents); + + // Make the close button the default. + closeButtonPointer->setDefault(true); + + // Get the disposition line edit palettes. + normalBackgroundPalette = appliedEntryListLineEditPointer->palette(); + negativeBackgroundPalette = normalBackgroundPalette; + positiveBackgroundPalette = normalBackgroundPalette; + + // Modify the palettes. + KColorScheme::adjustBackground(negativeBackgroundPalette, KColorScheme::NegativeBackground); + KColorScheme::adjustBackground(positiveBackgroundPalette, KColorScheme::PositiveBackground); + + // Set the sublist background palette. TODO Add logic for allow lists. + sublistLineEditPointer->setPalette(negativeBackgroundPalette); + + // Set the applied entry background palette to be the same as the sublist. + appliedEntryListLineEditPointer->setPalette(sublistLineEditPointer->palette()); + + // Connect the buttons. + connect(previousButtonPointer, SIGNAL(clicked()), this, SLOT(previous())); + connect(nextButtonPointer, SIGNAL(clicked()), this, SLOT(next())); + connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close())); + + // Create the keyboard shortcuts. + QShortcut *previousShortcutPointer = new QShortcut(Qt::Key_Left, this); + QShortcut *nextShortcutPointer = new QShortcut(Qt::Key_Right, this); + + // Connect the keyboard shortcuts to the buttons. + connect(previousShortcutPointer, SIGNAL(activated()), previousButtonPointer, SLOT(click())); + connect(nextShortcutPointer, SIGNAL(activated()), nextButtonPointer, SLOT(click())); + + // Populate the dialog. + populateDialog(currentRow); +} + +void FilterEntryDialog::populateDialog(const int row) +{ + // Set the window title. + setWindowTitle(i18nc("The filter entry dialog window title", "Filter Entry %1 Detail", row + 1)); + + // Select the row in the table widget (this displays the correct row highlighted in the background of the dialog). + tableWidgetPointer->selectRow(row); + + // Determine if previous should be enabled. + bool previousEnabled = (row > 0); + + // Determine if next should be enabled. + bool nextEnabled = (row < (tableWidgetPointer->rowCount() - 1)); + + // Populate the line edits. + appliedEntryListLineEditPointer->setText(tableWidgetPointer->item(row, 0)->text()); + initialMatchLineEditPointer->setText(tableWidgetPointer->item(row, 1)->text()); + finalMatchLineEditPointer->setText(tableWidgetPointer->item(row, 2)->text()); + domainLineEditPointer->setText(tableWidgetPointer->item(row, 3)->text()); + domainListLineEditPointer->setText(tableWidgetPointer->item(row, 4)->text()); + thirdPartyLineEditPointer->setText(tableWidgetPointer->item(row, 5)->text()); + fontLineEditPointer->setText(tableWidgetPointer->item(row, 7)->text()); + imageLineEditPointer->setText(tableWidgetPointer->item(row, 8)->text()); + mainFrameLineEditPointer->setText(tableWidgetPointer->item(row, 9)->text()); + mediaLineEditPointer->setText(tableWidgetPointer->item(row, 10)->text()); + objectLineEditPointer->setText(tableWidgetPointer->item(row, 11)->text()); + otherLineEditPointer->setText(tableWidgetPointer->item(row, 12)->text()); + pingLineEditPointer->setText(tableWidgetPointer->item(row, 13)->text()); + scriptLineEditPointer->setText(tableWidgetPointer->item(row, 14)->text()); + styleSheetLineEditPointer->setText(tableWidgetPointer->item(row, 15)->text()); + subFrameLineEditPointer->setText(tableWidgetPointer->item(row, 16)->text()); + xmlHttpRequestLineEditPointer->setText(tableWidgetPointer->item(row, 17)->text()); + appliedFilterOptionsLineEditPointer->setText(tableWidgetPointer->item(row, 18)->text()); + originalFilterOptionsLineEditPointer->setText(tableWidgetPointer->item(row, 19)->text()); + originalEntryLineEditPointer->setText(tableWidgetPointer->item(row, 20)->text()); + + // Populate the check boxes. + hasRequestOptionsCheckBoxPointer->setChecked(tableWidgetPointer->item(row, 6)->text() == i18n("Yes")); + + // Set the initial and final match background palettes. + setInitialAndFinalMatchBackgroundPalette(initialMatchLineEditPointer); + setInitialAndFinalMatchBackgroundPalette(finalMatchLineEditPointer); + + // Set the request option background palettes and status. + setFilterOptionBackgroundPalette(domainLineEditPointer); + setFilterOptionBackgroundPalette(thirdPartyLineEditPointer); + setFilterOptionBackgroundPalette(fontLineEditPointer); + setFilterOptionBackgroundPalette(imageLineEditPointer); + setFilterOptionBackgroundPalette(mainFrameLineEditPointer); + setFilterOptionBackgroundPalette(mediaLineEditPointer); + setFilterOptionBackgroundPalette(objectLineEditPointer); + setFilterOptionBackgroundPalette(otherLineEditPointer); + setFilterOptionBackgroundPalette(pingLineEditPointer); + setFilterOptionBackgroundPalette(scriptLineEditPointer); + setFilterOptionBackgroundPalette(styleSheetLineEditPointer); + setFilterOptionBackgroundPalette(subFrameLineEditPointer); + setFilterOptionBackgroundPalette(xmlHttpRequestLineEditPointer); + + // Set the request option status. + fontLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + imageLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + mainFrameLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + mediaLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + objectLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + otherLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + pingLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + scriptLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + styleSheetLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + subFrameLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + xmlHttpRequestLineEditPointer->setEnabled(hasRequestOptionsCheckBoxPointer->isChecked()); + + // Set the domain list line edit to have the same palette as the domain line edit. + domainListLineEditPointer->setPalette(domainLineEditPointer->palette()); + + // Set the button status. + previousButtonPointer->setEnabled(previousEnabled); + nextButtonPointer->setEnabled(nextEnabled); +} + +void FilterEntryDialog::previous() +{ + // Update the current row. + --currentRow; + + // Populate the dialog. + populateDialog(currentRow); +} + +void FilterEntryDialog::next() +{ + // Update the current row. + ++currentRow; + + // Populate the dialog. + populateDialog(currentRow); +} + +void FilterEntryDialog::setFilterOptionBackgroundPalette(QLineEdit *lineEditPointer) +{ + // Set the background palette according to the text. + if (lineEditPointer->text() == globalFilterListHelperPointer->getRequestOptionDispositionString(FilterOptionEnum::Disposition::Null)) // Not text is displayed. + { + // Set the normal background palette. + lineEditPointer->setPalette(normalBackgroundPalette); + } + else if (lineEditPointer->text() == globalFilterListHelperPointer->getRequestOptionDispositionString(FilterOptionEnum::Disposition::Apply)) // `Apply` is displayed. + { + // Set the negative (red) background palette. + lineEditPointer->setPalette(negativeBackgroundPalette); + } + else // `Override` is displayed. + { + // Set the positive (green) background palette. + lineEditPointer->setPalette(positiveBackgroundPalette); + } +} + +void FilterEntryDialog::setInitialAndFinalMatchBackgroundPalette(QLineEdit *lineEditPointer) +{ + // Set the background palette according to the text. + if (lineEditPointer->text() == i18n("Yes")) // `Yes` is displayed. + { + // Set the negative (red) background palette. + lineEditPointer->setPalette(negativeBackgroundPalette); + } + else // No text is displayed. + { + // Set the normal background palette. + lineEditPointer->setPalette(normalBackgroundPalette); + } +}