Falkon Develop
Cross-platform Qt-based web browser
sitesettingsview_widget.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2024 Juraj Oravec <jurajoravec@mailo.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18
20
21#include "tabwidget.h"
22#include "browserwindow.h"
23#include "mainapplication.h"
24#include "sitesettingsmanager.h"
25#include "tabbedwebview.h"
26#include "webpage.h"
27#include "qzsettings.h"
28
29#include <QTreeWidget>
30#include <QHeaderView>
31#include <QWebEngineProfile>
32#include <QSpacerItem>
33
35{
36 m_window = window;
37
38 m_brushGreen = QBrush(QColorConstants::Green);
39 m_brushYellow = QBrush(QColorConstants::Yellow);
40 m_brushOrange = QBrush(QColorConstants::Svg::orange);
41 m_brushRed = QBrush(QColorConstants::Red);
42 m_brushBlue = QBrush(QColorConstants::Blue);
43
44 m_availableOptions = {
47 };
48
49 QSpacerItem *horizontalSpacer_1 = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
50 QSpacerItem *horizontalSpacer_2 = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
51 auto *layoutTitle = new QHBoxLayout();
52 auto *modeNameLabel = new QLabel(this);
53 QString nameLabelText = QSL("<b>%1</b> <font color='%2'>%3</font>").arg(tr("Mode:"));
54 if (mApp->isPrivate()) {
55 modeNameLabel->setText(nameLabelText.arg(QSL("red"), tr("Private")));
56 }
57 else {
58 modeNameLabel->setText(nameLabelText.arg(QSL("lightgreen"), tr("Normal")));
59 }
60 auto *isWebLabel = new QLabel(QSL("<b>%1</b> ").arg(tr("isWeb:")), this);
61 m_isWebValue = new QLabel(this);
62 auto *buttonRefresh = new QToolButton(this);
63 buttonRefresh->setIcon(QIcon::fromTheme(QSL("view-refresh")));
64 buttonRefresh->setToolTip(tr("Refresh"));
65
66 layoutTitle->addWidget(modeNameLabel);
67 layoutTitle->addItem(horizontalSpacer_1);
68 layoutTitle->addWidget(isWebLabel);
69 layoutTitle->addWidget(m_isWebValue);
70 layoutTitle->addItem(horizontalSpacer_2);
71 layoutTitle->addWidget(buttonRefresh);
72
73 m_attributes = new QTreeWidget(this);
74 m_attributes->setColumnCount(4);
75 m_attributes->setHeaderLabels({tr("Real"), tr("Local"), tr("Default"), tr("Attributes")});
76 m_attributes->setSortingEnabled(true);
77 m_attributes->sortByColumn(3, Qt::AscendingOrder);
78 m_attributes->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
79 m_attributes->header()->setSectionsMovable(false);
80 m_attributes->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
81 m_attributes->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
82
83 auto attributes = mApp->siteSettingsManager()->getSupportedAttribute();
84 for (auto &attr : attributes) {
85 auto *item = new QTreeWidgetItem(m_attributes, {QSL(""), QSL(""), QSL(""), mApp->siteSettingsManager()->getOptionName(attr)});
86 item->setToolTip(3, mApp->siteSettingsManager()->getOptionName(attr));
87 m_attributeItems.insert(attr, item);
88 }
89
90 m_features = new QTreeWidget(this);
91 m_features->setColumnCount(3);
92 m_features->setHeaderLabels({tr("Local"), tr("Default"), tr("Feature")});
93 m_features->setSortingEnabled(true);
94 m_features->sortByColumn(2, Qt::AscendingOrder);
95 m_features->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
96 m_features->header()->setSectionsMovable(false);
97 m_features->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
98 m_features->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
99
100 auto features = mApp->siteSettingsManager()->getSupportedFeatures();
101 for (auto &feature : features) {
102 auto *item = new QTreeWidgetItem(m_features, {QSL(""), QSL(""), mApp->siteSettingsManager()->getOptionName(feature)});
103 item->setToolTip(2, mApp->siteSettingsManager()->getOptionName(feature));
104 m_featureItems.insert(feature, item);
105 }
106
107 m_options = new QTreeWidget(this);
108 m_options->setColumnCount(3);
109 m_options->setHeaderLabels({tr("Real"), tr("Local"), tr("Default"), tr("Option")});
110 m_options->setSortingEnabled(true);
111 m_options->sortByColumn(3, Qt::AscendingOrder);
112 m_options->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
113 m_options->header()->setSectionsMovable(false);
114 m_options->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
115 m_options->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
116
117 for (auto &option : m_availableOptions) {
118 auto *item = new QTreeWidgetItem(m_options, {QSL(""), QSL(""), QSL(""), mApp->siteSettingsManager()->getOptionName(option)});
119 item->setToolTip(3, mApp->siteSettingsManager()->getOptionName(option));
120 m_optionsItems.insert(option, item);
121 }
122
123 QSpacerItem *verticalSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
124
125 auto *l = new QVBoxLayout(this);
126 l->addItem(layoutTitle);
127 l->addWidget(m_attributes);
128 l->addWidget(m_features);
129 l->addWidget(m_options);
130 l->addItem(verticalSpacer);
131 this->setLayout(l);
132
133 connect(m_window->tabWidget(), &TabWidget::currentChanged, this, &SiteSettingsView_Widget::updateData);
134 connect(buttonRefresh, &QToolButton::clicked, this, &SiteSettingsView_Widget::updateData);
135
136 updateData();
137}
138
139void SiteSettingsView_Widget::updateData(int index)
140{
141 Q_UNUSED(index)
142
143 auto *tab = m_window->tabWidget()->webTab();
144 if (tab == nullptr) {
145 return;
146 }
147
148 auto url = tab->url();
149 /* This condition is copied from webpage.cpp function acceptNavigationRequest()
150 * Falkon has hardcoded properties / attributes for non Web pages*/
151 const bool isWeb = url.scheme() == QL1S("http") || url.scheme() == QL1S("https") || url.scheme() == QL1S("file");
152 const auto siteSettings = mApp->siteSettingsManager()->getSiteSettings(url);
153
154 if (isWeb) {
155 m_isWebValue->setText(QSL("<font color='lightgreen'>%1</font>").arg(tr("True")));
156 }
157 else {
158 m_isWebValue->setText(QSL("<font color='red'>%1</font>").arg(tr("False")));
159 }
160
161 QHash<QWebEngineSettings::WebAttribute, QTreeWidgetItem*>::iterator it_attr;
162 for (it_attr = m_attributeItems.begin(); it_attr != m_attributeItems.end(); ++it_attr) {
163 auto attr = it_attr.key();
164 auto attrReal = tab->webView()->page()->settings()->testAttribute(attr) ? SiteSettingsManager::Allow : SiteSettingsManager::Deny;
165 auto attrDefault = mApp->webProfile()->settings()->testAttribute(attr) ? SiteSettingsManager::Allow : SiteSettingsManager::Deny;
166 auto attrLocal = SiteSettingsManager::Default;
167
168 if (!siteSettings.attributes.empty() && siteSettings.attributes.contains(attr)) {
169 attrLocal = siteSettings.attributes[attr];
170 }
171 auto *item = it_attr.value();
172 item->setText(0, mApp->siteSettingsManager()->getPermissionName(attrReal));
173 item->setForeground(0, permissionColor(attrReal));
174 item->setText(1, mApp->siteSettingsManager()->getPermissionName(attrLocal));
175 item->setForeground(1, permissionColor(attrLocal));
176 item->setText(2, mApp->siteSettingsManager()->getPermissionName(attrDefault));
177 item->setForeground(2, permissionColor(attrDefault));
178 }
179
180 QHash<QWebEnginePage::Feature, QTreeWidgetItem*>::iterator it_ftr;
181 for (it_ftr = m_featureItems.begin(); it_ftr != m_featureItems.end(); ++it_ftr) {
182 auto ftr = it_ftr.key();
183 auto ftrDefault = mApp->siteSettingsManager()->getDefaultPermission(ftr);
184 auto ftrLocal = siteSettings.features[ftr];
185
186 auto *item = it_ftr.value();
187 item->setText(0, mApp->siteSettingsManager()->getPermissionName(ftrLocal));
188 item->setForeground(0, permissionColor(ftrLocal));
189 item->setText(1, mApp->siteSettingsManager()->getPermissionName(ftrDefault));
190 item->setForeground(1, permissionColor(ftrDefault));
191 }
192
193 QHash<SiteSettingsManager::PageOptions, QTreeWidgetItem*>::iterator it_opt;
194 for (it_opt = m_optionsItems.begin(); it_opt != m_optionsItems.end(); ++it_opt) {
195 QString optRealText, optLocalText, optDefaultText;
196 QBrush optRealColor, optLocalColor, optDefaultColor;
197 const auto option = it_opt.key();
198 auto *item = it_opt.value();
199
200 switch (option) {
203
204 optLocalText = mApp->siteSettingsManager()->getPermissionName(siteSettings.AllowCookies);
205 optLocalColor = permissionColor(siteSettings.AllowCookies);
206
207 permission = mApp->siteSettingsManager()->getDefaultPermission(option);
208 optDefaultText = mApp->siteSettingsManager()->getPermissionName(permission);
209 optDefaultColor = permissionColor(permission);
210 }
211 break;
212
214 auto zoomLevels = WebView::zoomLevels();
215 const int realZoomLevel = tab->webView()->zoomLevel();
216 const int defualZoomLevel = qzSettings->defaultZoomLevel;
217 const int storedZoomLevel = siteSettings.ZoomLevel;
218
219 optRealText = tr("%1 (%2%)").arg(realZoomLevel).arg(zoomLevels[realZoomLevel]);
220 optRealColor = m_brushGreen;
221
222 if (storedZoomLevel == -1) {
223 optLocalText = tr("Default");
224 optLocalColor = m_brushYellow;
225 }
226 else {
227 optLocalText = tr("%1 (%2%)").arg(storedZoomLevel).arg(zoomLevels[storedZoomLevel]);
228 optLocalColor = m_brushGreen;
229 }
230
231 optDefaultText = tr("%1 (%2%)").arg(defualZoomLevel).arg(zoomLevels[defualZoomLevel]);
232 optDefaultColor = m_brushGreen;
233 }
234 break;
235
236 default:
237 qDebug() << "Unknown option: " << option;
238 continue;
239 }
240
241 item->setText(0, optRealText);
242 item->setForeground(0, optRealColor);
243 item->setText(1, optLocalText);
244 item->setForeground(1, optLocalColor);
245 item->setText(2, optDefaultText);
246 item->setForeground(2, optDefaultColor);
247 }
248}
249
250QBrush SiteSettingsView_Widget::permissionColor(SiteSettingsManager::Permission permission)
251{
252 switch (permission) {
254 return m_brushYellow;
256 return m_brushGreen;
258 return m_brushRed;
260 return m_brushOrange;
261 default:
262 return m_brushBlue;
263 }
264}
265
267{
268 auto *tab = m_window->tabWidget()->webTab();
269 if (tab == nullptr) {
270 return;
271 }
272
273 if (page == tab->webView()->page()) {
274 updateData();
275 }
276}
TabWidget * tabWidget() const
SiteSettingsView_Widget(BrowserWindow *window)
void currentChanged(int index)
WebTab * webTab(int index=-1) const
Definition: tabwidget.cpp:570
QUrl url() const
Definition: webtab.cpp:263
static QList< int > zoomLevels()
Definition: webview.cpp:264
#define mApp
#define QL1S(x)
Definition: qzcommon.h:44
#define QSL(x)
Definition: qzcommon.h:40
#define qzSettings
Definition: qzsettings.h:69