2 * Copyright 2024 Soren Stoutner <soren@stoutner.com>.
4 * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc/>.
6 * Privacy Browser PC is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * Privacy Browser PC is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Privacy Browser PC. If not, see <http://www.gnu.org/licenses/>.
20 // Application headers.
21 #include "FilterListsDialog.h"
22 #include "GlobalVariables.h"
23 #include "ui_FilterListsDialog.h"
25 // Qt toolkit headers.
27 #include <QTextStream>
29 // Construct the class.
30 FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(parentWidgetPointer)
32 // Set the window title.
33 setWindowTitle(i18nc("The filter lists dialog window title", "Filter Lists"));
35 // Set the window modality.
36 setWindowModality(Qt::WindowModality::ApplicationModal);
38 // Instantiate the filter lists dialog UI.
39 Ui::FilterListsDialog filterListsDialogUi;
42 filterListsDialogUi.setupUi(this);
44 // Get handles for the views.
45 filterListComboBoxPointer = filterListsDialogUi.filterListComboBox;
46 filterListTextEditPointer = filterListsDialogUi.filterListTextEdit;
47 sublistComboBoxPointer = filterListsDialogUi.sublistComboBox;
48 sublistTableWidgetPointer = filterListsDialogUi.sublistTableWidget;
49 QDialogButtonBox *dialogButtonBoxPointer = filterListsDialogUi.dialogButtonBox;
51 // Connect the combo boxes.
52 connect(filterListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(populateFilterListTextEdit(int)));
53 connect(sublistComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(populateTableWidget(int)));
55 // Connect the buttons.
56 connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
58 // Populate the filter list combo box.
59 populateFilterListComboBox(globalFilterListHelperPointer->ultraListStructPointer);
60 populateFilterListComboBox(globalFilterListHelperPointer->ultraPrivacyStructPointer);
61 populateFilterListComboBox(globalFilterListHelperPointer->easyListStructPointer);
62 populateFilterListComboBox(globalFilterListHelperPointer->easyPrivacyStructPointer);
63 populateFilterListComboBox(globalFilterListHelperPointer->fanboyAnnoyanceStructPointer);
66 void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
68 // Populate the filter list combo box.
69 filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
72 void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) const
74 // Create the filter list struct pointer.
75 FilterListStruct *filterListStructPointer;
77 // Get the indicated filter list map.
78 switch (filterListComboBoxInt)
81 filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
84 case 1: // UltraPrivacy.
85 filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
89 filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
92 case 3: // EasyPrivacy.
93 filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
96 case 4: // Fanboy's Annoyance List.
97 filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
101 // Get the filter list file.
102 QFile filterListFile(filterListStructPointer->filePath);
104 // Open the filter list file.
105 filterListFile.open(QIODevice::ReadOnly);
107 // Create a filter list text stream.
108 QTextStream filterListTextStream(&filterListFile);
110 // Populate the text edit.
111 filterListTextEditPointer->setText(filterListTextStream.readAll());
113 // Clear the sublist combo box.
114 sublistComboBoxPointer->clear();
116 // Calculate the size of the main filter list.
117 int mainBlockListSize = distance(filterListStructPointer->mainBlockList.begin(), filterListStructPointer->mainBlockList.end());
119 // Get the translated filter list names.
120 QString mainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_BLOCKLIST);
122 // Populate the sublist combo box.
123 sublistComboBoxPointer->addItem(i18nc("The main block list", "%1 - %2", mainBlockListName, mainBlockListSize));
126 void FilterListsDialog::populateTableWidget(int sublistComboBoxIndex) const
128 // Wipe the current table.
129 sublistTableWidgetPointer->clear();
130 sublistTableWidgetPointer->setColumnCount(0);
131 sublistTableWidgetPointer->setRowCount(0);
133 // Create the filter list struct.
134 FilterListStruct *filterListStructPointer;
136 // Populate the filer list array.
137 switch (filterListComboBoxPointer->currentIndex())
139 case 0: // UltraList.
140 filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
143 case 1: // UltraPrivacy.
144 filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
148 filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
151 case 3: // EasyPrivacy.
152 filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
155 case 4: // Fanboy's Annoyance List.
156 filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
160 // Create a filter list forward list.
161 std::forward_list<EntryStruct *> filterListForwardList;
163 // Populate the filter list forward list.
164 switch (sublistComboBoxIndex)
166 case 0: // Main block list.
167 filterListForwardList = filterListStructPointer->mainBlockList;
171 // Create the columns.
172 sublistTableWidgetPointer->setColumnCount(2);
174 // Create the table headers.
175 QTableWidgetItem *appliedEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist applied entry header", "Applied Entry"));
176 QTableWidgetItem *originalEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist original entry header", "Original Entry"));
178 // Set the horizontal headers.
179 sublistTableWidgetPointer->setHorizontalHeaderItem(0, appliedEntryHeaderItemPointer);
180 sublistTableWidgetPointer->setHorizontalHeaderItem(1, originalEntryHeaderItemPointer);
182 // Initialize the row counter.
185 // Populate the table.
186 for (auto filterListEntry = filterListForwardList.begin(); filterListEntry != filterListForwardList.end(); ++filterListEntry) {
187 // Get the entry struct.
188 EntryStruct *entryStructPointer = *filterListEntry;
191 sublistTableWidgetPointer->insertRow(rowCounter);
193 // Create the entry items.
194 QTableWidgetItem *appliedEntryItemPointer = new QTableWidgetItem(entryStructPointer->appliedEntry);
195 QTableWidgetItem *originalEntryItemPointer = new QTableWidgetItem(entryStructPointer->originalEntry);
197 // Add the entries to the table.
198 sublistTableWidgetPointer->setItem(rowCounter, 0, appliedEntryItemPointer);
199 sublistTableWidgetPointer->setItem(rowCounter, 1, originalEntryItemPointer);
201 // Increment the row counter.
205 // Get the table header view.
206 QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
208 // Resize the header to fit the contents.
209 headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
211 // Connect changes in the sort order.
212 connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
215 void FilterListsDialog::sortTable(int column, Qt::SortOrder sortOrder) const
218 sublistTableWidgetPointer->sortItems(column, sortOrder);