]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blob - src/dialogs/FilterListsDialog.cpp
Partial filter list 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
25 // Qt toolkit headers.
26 #include <QFile>
27 #include <QTextStream>
28
29 // Construct the class.
30 FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(parentWidgetPointer)
31 {
32     // Set the window title.
33     setWindowTitle(i18nc("The filter lists dialog window title", "Filter Lists"));
34
35     // Set the window modality.
36     setWindowModality(Qt::WindowModality::ApplicationModal);
37
38     // Instantiate the filter lists dialog UI.
39     Ui::FilterListsDialog filterListsDialogUi;
40
41     // Setup the UI.
42     filterListsDialogUi.setupUi(this);
43
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;
50
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)));
54
55     // Connect the buttons.
56     connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
57
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);
64 }
65
66 void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
67 {
68     // Populate the filter list combo box.
69     filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
70 }
71
72 void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) const
73 {
74     // Create the filter list struct pointer.
75     FilterListStruct *filterListStructPointer;
76
77     // Get the indicated filter list map.
78     switch (filterListComboBoxInt)
79     {
80         case 0:  // UltraList.
81             filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
82             break;
83
84         case 1:  // UltraPrivacy.
85             filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
86             break;
87
88         case 2:  // EasyList.
89             filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
90             break;
91
92         case 3:  // EasyPrivacy.
93             filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
94             break;
95
96         case 4:  // Fanboy's Annoyance List.
97             filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
98             break;
99     }
100
101     // Get the filter list file.
102     QFile filterListFile(filterListStructPointer->filePath);
103
104     // Open the filter list file.
105     filterListFile.open(QIODevice::ReadOnly);
106
107     // Create a filter list text stream.
108     QTextStream filterListTextStream(&filterListFile);
109
110     // Populate the text edit.
111     filterListTextEditPointer->setText(filterListTextStream.readAll());
112
113     // Clear the sublist combo box.
114     sublistComboBoxPointer->clear();
115
116     // Calculate the size of the main filter list.
117     int mainBlockListSize = distance(filterListStructPointer->mainBlockList.begin(), filterListStructPointer->mainBlockList.end());
118
119     // Get the translated filter list names.
120     QString mainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_BLOCKLIST);
121
122     // Populate the sublist combo box.
123     sublistComboBoxPointer->addItem(i18nc("The main block list", "%1 - %2", mainBlockListName, mainBlockListSize));
124 }
125
126 void FilterListsDialog::populateTableWidget(int sublistComboBoxIndex) const
127 {
128     // Wipe the current table.
129     sublistTableWidgetPointer->clear();
130     sublistTableWidgetPointer->setColumnCount(0);
131     sublistTableWidgetPointer->setRowCount(0);
132
133     // Create the filter list struct.
134     FilterListStruct *filterListStructPointer;
135
136     // Populate the filer list array.
137     switch (filterListComboBoxPointer->currentIndex())
138     {
139         case 0:  // UltraList.
140             filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
141             break;
142
143         case 1:  // UltraPrivacy.
144             filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
145             break;
146
147         case 2:  // EasyList.
148             filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
149             break;
150
151         case 3:  // EasyPrivacy.
152             filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
153             break;
154
155         case 4:  // Fanboy's Annoyance List.
156             filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
157             break;
158     }
159
160     // Create a filter list forward list.
161     std::forward_list<EntryStruct *> filterListForwardList;
162
163     // Populate the filter list forward list.
164     switch (sublistComboBoxIndex)
165     {
166         case 0:  // Main block list.
167             filterListForwardList = filterListStructPointer->mainBlockList;
168             break;
169     }
170
171     // Create the columns.
172     sublistTableWidgetPointer->setColumnCount(2);
173
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"));
177
178     // Set the horizontal headers.
179     sublistTableWidgetPointer->setHorizontalHeaderItem(0, appliedEntryHeaderItemPointer);
180     sublistTableWidgetPointer->setHorizontalHeaderItem(1, originalEntryHeaderItemPointer);
181
182     // Initialize the row counter.
183     int rowCounter = 0;
184
185     // Populate the table.
186     for (auto filterListEntry = filterListForwardList.begin(); filterListEntry != filterListForwardList.end(); ++filterListEntry) {
187         // Get the entry struct.
188         EntryStruct *entryStructPointer = *filterListEntry;
189
190         // Add a new row.
191         sublistTableWidgetPointer->insertRow(rowCounter);
192
193         // Create the entry items.
194         QTableWidgetItem *appliedEntryItemPointer = new QTableWidgetItem(entryStructPointer->appliedEntry);
195         QTableWidgetItem *originalEntryItemPointer = new QTableWidgetItem(entryStructPointer->originalEntry);
196
197         // Add the entries to the table.
198         sublistTableWidgetPointer->setItem(rowCounter, 0, appliedEntryItemPointer);
199         sublistTableWidgetPointer->setItem(rowCounter, 1, originalEntryItemPointer);
200
201         // Increment the row counter.
202         ++rowCounter;
203     }
204
205     // Get the table header view.
206     QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
207
208     // Resize the header to fit the contents.
209     headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
210
211     // Connect changes in the sort order.
212     connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
213 }
214
215 void FilterListsDialog::sortTable(int column, Qt::SortOrder sortOrder) const
216 {
217     // Sort the table.
218     sublistTableWidgetPointer->sortItems(column, sortOrder);
219 }