]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blob - src/dialogs/FilterListsDialog.cpp
Filter options implementation.
[PrivacyBrowserPC.git] / src / dialogs / FilterListsDialog.cpp
1 /*
2  * Copyright 2024 Soren Stoutner <soren@stoutner.com>.
3  *
4  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc/>.
5  *
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.
10  *
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.
15  *
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/>.
18  */
19
20 // Application headers.
21 #include "FilterListsDialog.h"
22 #include "GlobalVariables.h"
23 #include "ui_FilterListsDialog.h"
24 #include "delegates/ViewAndCopyDelegate.h"
25
26 // Qt toolkit headers.
27 #include <QFile>
28 #include <QTextStream>
29
30 // Construct the class.
31 FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(parentWidgetPointer)
32 {
33     // Set the window title.
34     setWindowTitle(i18nc("The filter lists dialog window title", "Filter Lists"));
35
36     // Set the window modality.
37     setWindowModality(Qt::WindowModality::ApplicationModal);
38
39     // Instantiate the filter lists dialog UI.
40     Ui::FilterListsDialog filterListsDialogUi;
41
42     // Setup the UI.
43     filterListsDialogUi.setupUi(this);
44
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;
51
52     // Create a view and copy delegate.
53     ViewAndCopyDelegate *viewAndCopyDelegate = new ViewAndCopyDelegate(this);
54
55     // Set the sublist table widget allow copying but not editing.
56     sublistTableWidgetPointer->setItemDelegate(viewAndCopyDelegate);
57
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)));
61
62     // Connect the buttons.
63     connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
64
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);
71 }
72
73 void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
74 {
75     // Populate the filter list combo box.
76     filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
77 }
78
79 void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) const
80 {
81     // Create the filter list struct pointer.
82     FilterListStruct *filterListStructPointer;
83
84     // Get the indicated filter list map.
85     switch (filterListComboBoxInt)
86     {
87         case 0:  // UltraList.
88             filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
89             break;
90
91         case 1:  // UltraPrivacy.
92             filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
93             break;
94
95         case 2:  // EasyList.
96             filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
97             break;
98
99         case 3:  // EasyPrivacy.
100             filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
101             break;
102
103         case 4:  // Fanboy's Annoyance List.
104             filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
105             break;
106     }
107
108     // Get the filter list file.
109     QFile filterListFile(filterListStructPointer->filePath);
110
111     // Open the filter list file.
112     filterListFile.open(QIODevice::ReadOnly);
113
114     // Create a filter list text stream.
115     QTextStream filterListTextStream(&filterListFile);
116
117     // Populate the text edit.
118     filterListTextEditPointer->setText(filterListTextStream.readAll());
119
120     // Clear the sublist combo box.
121     sublistComboBoxPointer->clear();
122
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());
127
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);
132
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));
137 }
138
139 void FilterListsDialog::populateTableWidget(int sublistComboBoxIndex) const
140 {
141     // Wipe the current table.
142     sublistTableWidgetPointer->clear();
143     sublistTableWidgetPointer->setColumnCount(0);
144     sublistTableWidgetPointer->setRowCount(0);
145
146     // Create the filter list struct.
147     FilterListStruct *filterListStructPointer;
148
149     // Populate the filer list array.
150     switch (filterListComboBoxPointer->currentIndex())
151     {
152         case 0:  // UltraList.
153             filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
154             break;
155
156         case 1:  // UltraPrivacy.
157             filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
158             break;
159
160         case 2:  // EasyList.
161             filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
162             break;
163
164         case 3:  // EasyPrivacy.
165             filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
166             break;
167
168         case 4:  // Fanboy's Annoyance List.
169             filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
170             break;
171     }
172
173     // Create a filter list forward list.
174     std::forward_list<EntryStruct *> filterListForwardList;
175
176     // Populate the filter list forward list.
177     switch (sublistComboBoxIndex)
178     {
179         case FilterListHelper::MAIN_ALLOWLIST:  // The main allow list.
180             filterListForwardList = filterListStructPointer->mainAllowList;
181             break;
182
183         case FilterListHelper::MAIN_BLOCKLIST:  // The main block list.
184             filterListForwardList = filterListStructPointer->mainBlockList;
185             break;
186
187         case FilterListHelper::INITIAL_DOMAIN_BLOCKLIST:  // The initial domain block list.
188             filterListForwardList = filterListStructPointer->initialDomainBlockList;
189             break;
190     }
191
192     // Create the columns.
193     sublistTableWidgetPointer->setColumnCount(15);
194
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"));
211
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);
228
229     // Initialize the row counter.
230     int rowCounter = 0;
231
232     // Populate the table.
233     for (auto filterListEntry = filterListForwardList.begin(); filterListEntry != filterListForwardList.end(); ++filterListEntry) {
234         // Get the entry struct.
235         EntryStruct *entryStructPointer = *filterListEntry;
236
237         // Add a new row.
238         sublistTableWidgetPointer->insertRow(rowCounter);
239
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);
256
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);
273
274         // Increment the row counter.
275         ++rowCounter;
276     }
277
278     // Get the table header view.
279     QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
280
281     // Resize the header to fit the contents.
282     headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
283
284     // Connect changes in the sort order.
285     connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
286 }
287
288 void FilterListsDialog::sortTable(int column, Qt::SortOrder sortOrder) const
289 {
290     // Sort the table.
291     sublistTableWidgetPointer->sortItems(column, sortOrder);
292 }