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"
24 #include "delegates/ViewAndCopyDelegate.h"
26 // Qt toolkit headers.
28 #include <QTextStream>
30 // Construct the class.
31 FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(parentWidgetPointer)
33 // Set the window title.
34 setWindowTitle(i18nc("The filter lists dialog window title", "Filter Lists"));
36 // Set the window modality.
37 setWindowModality(Qt::WindowModality::ApplicationModal);
39 // Instantiate the filter lists dialog UI.
40 Ui::FilterListsDialog filterListsDialogUi;
43 filterListsDialogUi.setupUi(this);
45 // Get handles for the views.
46 filterListComboBoxPointer = filterListsDialogUi.filterListComboBox;
47 filterListTextEditPointer = filterListsDialogUi.filterListTextEdit;
48 sublistComboBoxPointer = filterListsDialogUi.sublistComboBox;
49 sublistTableWidgetPointer = filterListsDialogUi.sublistTableWidget;
50 QDialogButtonBox *dialogButtonBoxPointer = filterListsDialogUi.dialogButtonBox;
52 // Create a view and copy delegate.
53 ViewAndCopyDelegate *viewAndCopyDelegate = new ViewAndCopyDelegate(this);
55 // Set the sublist table widget allow copying but not editing.
56 sublistTableWidgetPointer->setItemDelegate(viewAndCopyDelegate);
58 // Connect the combo boxes.
59 connect(filterListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(populateFilterListTextEdit(int)));
60 connect(sublistComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(populateTableWidget(int)));
62 // Connect the buttons.
63 connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
65 // Populate the filter list combo box.
66 populateFilterListComboBox(globalFilterListHelperPointer->ultraListStructPointer);
67 populateFilterListComboBox(globalFilterListHelperPointer->ultraPrivacyStructPointer);
68 populateFilterListComboBox(globalFilterListHelperPointer->easyListStructPointer);
69 populateFilterListComboBox(globalFilterListHelperPointer->easyPrivacyStructPointer);
70 populateFilterListComboBox(globalFilterListHelperPointer->fanboyAnnoyanceStructPointer);
73 void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
75 // Populate the filter list combo box.
76 filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
79 void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) const
81 // Create the filter list struct pointer.
82 FilterListStruct *filterListStructPointer;
84 // Get the indicated filter list map.
85 switch (filterListComboBoxInt)
88 filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
91 case 1: // UltraPrivacy.
92 filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
96 filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
99 case 3: // EasyPrivacy.
100 filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
103 case 4: // Fanboy's Annoyance List.
104 filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
108 // Get the filter list file.
109 QFile filterListFile(filterListStructPointer->filePath);
111 // Open the filter list file.
112 filterListFile.open(QIODevice::ReadOnly);
114 // Create a filter list text stream.
115 QTextStream filterListTextStream(&filterListFile);
117 // Populate the text edit.
118 filterListTextEditPointer->setText(filterListTextStream.readAll());
120 // Clear the sublist combo box.
121 sublistComboBoxPointer->clear();
123 // Calculate the size of the filter lists.
124 int mainAllowListSize = distance(filterListStructPointer->mainAllowList.begin(), filterListStructPointer->mainAllowList.end());
125 int mainBlockListSize = distance(filterListStructPointer->mainBlockList.begin(), filterListStructPointer->mainBlockList.end());
126 int initialDomainBlockListSize = distance(filterListStructPointer->initialDomainBlockList.begin(), filterListStructPointer->initialDomainBlockList.end());
128 // Get the translated filter list names.
129 QString mainAllowListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_ALLOWLIST);
130 QString mainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_BLOCKLIST);
131 QString initialDomainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::INITIAL_DOMAIN_BLOCKLIST);
133 // Populate the sublist combo box.
134 sublistComboBoxPointer->addItem(i18nc("The main allow list", "%1 - %2", mainAllowListName, mainAllowListSize));
135 sublistComboBoxPointer->addItem(i18nc("The main block list", "%1 - %2", mainBlockListName, mainBlockListSize));
136 sublistComboBoxPointer->addItem(i18nc("The initial domain block list", "%1 - %2", initialDomainBlockListName, initialDomainBlockListSize));
139 void FilterListsDialog::populateTableWidget(int sublistComboBoxIndex) const
141 // Wipe the current table.
142 sublistTableWidgetPointer->clear();
143 sublistTableWidgetPointer->setColumnCount(0);
144 sublistTableWidgetPointer->setRowCount(0);
146 // Create the filter list struct.
147 FilterListStruct *filterListStructPointer;
149 // Populate the filer list array.
150 switch (filterListComboBoxPointer->currentIndex())
152 case 0: // UltraList.
153 filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
156 case 1: // UltraPrivacy.
157 filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
161 filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
164 case 3: // EasyPrivacy.
165 filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
168 case 4: // Fanboy's Annoyance List.
169 filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
173 // Create a filter list forward list.
174 std::forward_list<EntryStruct *> filterListForwardList;
176 // Populate the filter list forward list.
177 switch (sublistComboBoxIndex)
179 case FilterListHelper::MAIN_ALLOWLIST: // The main allow list.
180 filterListForwardList = filterListStructPointer->mainAllowList;
183 case FilterListHelper::MAIN_BLOCKLIST: // The main block list.
184 filterListForwardList = filterListStructPointer->mainBlockList;
187 case FilterListHelper::INITIAL_DOMAIN_BLOCKLIST: // The initial domain block list.
188 filterListForwardList = filterListStructPointer->initialDomainBlockList;
192 // Create the columns.
193 sublistTableWidgetPointer->setColumnCount(15);
195 // Create the table headers.
196 QTableWidgetItem *appliedEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist applied entry header", "Applied Entry"));
197 QTableWidgetItem *thirdPartyHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist third-party header", "Third-Party"));
198 QTableWidgetItem *fontHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist font header", "Font"));
199 QTableWidgetItem *imageHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist image header", "Image"));
200 QTableWidgetItem *mainFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist main frame header", "Main Frame"));
201 QTableWidgetItem *mediaHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist media header", "Media"));
202 QTableWidgetItem *objectHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Object"));
203 QTableWidgetItem *otherHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Other"));
204 QTableWidgetItem *pingHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist ping header", "Ping"));
205 QTableWidgetItem *scriptHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist script header", "Script"));
206 QTableWidgetItem *styleSheetHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist style sheet header", "Style Sheet"));
207 QTableWidgetItem *subFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist sub frame header", "Sub Frame"));
208 QTableWidgetItem *xmlHttpRequestHeaderItemPointer = new QTableWidgetItem(i18nc("XML HTTP request header", "XML HTTP Request"));
209 QTableWidgetItem *filterOptionsHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist filter options header", "Filter Options"));
210 QTableWidgetItem *originalEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist original entry header", "Original Entry"));
212 // Set the horizontal headers.
213 sublistTableWidgetPointer->setHorizontalHeaderItem(0, appliedEntryHeaderItemPointer);
214 sublistTableWidgetPointer->setHorizontalHeaderItem(1, thirdPartyHeaderItemPointer);
215 sublistTableWidgetPointer->setHorizontalHeaderItem(2, fontHeaderItemPointer);
216 sublistTableWidgetPointer->setHorizontalHeaderItem(3, imageHeaderItemPointer);
217 sublistTableWidgetPointer->setHorizontalHeaderItem(4, mainFrameHeaderItemPointer);
218 sublistTableWidgetPointer->setHorizontalHeaderItem(5, mediaHeaderItemPointer);
219 sublistTableWidgetPointer->setHorizontalHeaderItem(6, objectHeaderItemPointer);
220 sublistTableWidgetPointer->setHorizontalHeaderItem(7, otherHeaderItemPointer);
221 sublistTableWidgetPointer->setHorizontalHeaderItem(8, pingHeaderItemPointer);
222 sublistTableWidgetPointer->setHorizontalHeaderItem(9, scriptHeaderItemPointer);
223 sublistTableWidgetPointer->setHorizontalHeaderItem(10, styleSheetHeaderItemPointer);
224 sublistTableWidgetPointer->setHorizontalHeaderItem(11, subFrameHeaderItemPointer);
225 sublistTableWidgetPointer->setHorizontalHeaderItem(12, xmlHttpRequestHeaderItemPointer);
226 sublistTableWidgetPointer->setHorizontalHeaderItem(13, filterOptionsHeaderItemPointer);
227 sublistTableWidgetPointer->setHorizontalHeaderItem(14, originalEntryHeaderItemPointer);
229 // Initialize the row counter.
232 // Populate the table.
233 for (auto filterListEntry = filterListForwardList.begin(); filterListEntry != filterListForwardList.end(); ++filterListEntry) {
234 // Get the entry struct.
235 EntryStruct *entryStructPointer = *filterListEntry;
238 sublistTableWidgetPointer->insertRow(rowCounter);
240 // Create the entry items.
241 QTableWidgetItem *appliedEntryItemPointer = new QTableWidgetItem(entryStructPointer->appliedEntry);
242 QTableWidgetItem *thirdPartyItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->thirdParty));
243 QTableWidgetItem *fontItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->font));
244 QTableWidgetItem *imageItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->image));
245 QTableWidgetItem *mainFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->mainFrame));
246 QTableWidgetItem *mediaItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->media));
247 QTableWidgetItem *objectItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->object));
248 QTableWidgetItem *otherItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->other));
249 QTableWidgetItem *pingItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->ping));
250 QTableWidgetItem *scriptItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->script));
251 QTableWidgetItem *styleSheetItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->styleSheet));
252 QTableWidgetItem *subFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->subFrame));
253 QTableWidgetItem *xmlHttpRequestItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->xmlHttpRequest));
254 QTableWidgetItem *filterOptionsItemPointer = new QTableWidgetItem(entryStructPointer->filterOptions);
255 QTableWidgetItem *originalEntryItemPointer = new QTableWidgetItem(entryStructPointer->originalEntry);
257 // Add the entries to the table.
258 sublistTableWidgetPointer->setItem(rowCounter, 0, appliedEntryItemPointer);
259 sublistTableWidgetPointer->setItem(rowCounter, 1, thirdPartyItemPointer);
260 sublistTableWidgetPointer->setItem(rowCounter, 2, fontItemPointer);
261 sublistTableWidgetPointer->setItem(rowCounter, 3, imageItemPointer);
262 sublistTableWidgetPointer->setItem(rowCounter, 4, mainFrameItemPointer);
263 sublistTableWidgetPointer->setItem(rowCounter, 5, mediaItemPointer);
264 sublistTableWidgetPointer->setItem(rowCounter, 6, objectItemPointer);
265 sublistTableWidgetPointer->setItem(rowCounter, 7, otherItemPointer);
266 sublistTableWidgetPointer->setItem(rowCounter, 8, pingItemPointer);
267 sublistTableWidgetPointer->setItem(rowCounter, 9, scriptItemPointer);
268 sublistTableWidgetPointer->setItem(rowCounter, 10, styleSheetItemPointer);
269 sublistTableWidgetPointer->setItem(rowCounter, 11, subFrameItemPointer);
270 sublistTableWidgetPointer->setItem(rowCounter, 12, xmlHttpRequestItemPointer);
271 sublistTableWidgetPointer->setItem(rowCounter, 13, filterOptionsItemPointer);
272 sublistTableWidgetPointer->setItem(rowCounter, 14, originalEntryItemPointer);
274 // Increment the row counter.
278 // Get the table header view.
279 QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
281 // Resize the header to fit the contents.
282 headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
284 // Connect changes in the sort order.
285 connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
288 void FilterListsDialog::sortTable(int column, Qt::SortOrder sortOrder) const
291 sublistTableWidgetPointer->sortItems(column, sortOrder);