19#include "ui_siteinfo.h"
35#include <QNetworkDiskCache>
38#include <QGraphicsPixmapItem>
40#include <QListWidgetItem>
45 , m_certWidget(nullptr)
47 , m_imageReply(nullptr)
48 , m_baseUrl(view->url())
50 setAttribute(Qt::WA_DeleteOnClose);
52 ui->treeTags->setLayoutDirection(Qt::LeftToRight);
56 delegate->setUpdateParentHeight(
true);
57 delegate->setUniformItemSizes(
true);
58 ui->listWidget->setItemDelegate(delegate);
60 ui->listWidget->item(0)->setIcon(QIcon::fromTheme(
QSL(
"document-properties"), QIcon(
QSL(
":/icons/preferences/document-properties.png"))));
61 ui->listWidget->item(1)->setIcon(QIcon::fromTheme(
QSL(
"applications-graphics"), QIcon(
QSL(
":/icons/preferences/applications-graphics.png"))));
62 ui->listWidget->item(2)->setIcon(QIcon(QStringLiteral(
":/icons/preferences/privacy.svg")));
63 ui->listWidget->item(0)->setSelected(
true);
66 ui->heading->setText(
QSL(
"<b>%1</b>:").arg(m_view->
title()));
67 ui->siteAddress->setText(m_view->url().toString());
69 if (m_view->url().scheme() ==
QL1S(
"https"))
70 ui->securityLabel->setText(tr(
"<b>Connection is Encrypted.</b>"));
72 ui->securityLabel->setText(tr(
"<b>Connection Not Encrypted.</b>"));
75 ui->encodingLabel->setText(res.toString());
80 const QVariantList &list = res.toList();
81 for (
const QVariant &val : list) {
82 const QVariantMap &meta = val.toMap();
83 QString content = meta.value(
QSL(
"content")).toString();
84 QString name = meta.value(
QSL(
"name")).toString();
87 name = meta.value(
QSL(
"httpequiv")).toString();
89 if (content.isEmpty() || name.isEmpty())
92 auto* item =
new QTreeWidgetItem(ui->treeTags);
93 item->setText(0, name);
94 item->setText(1, content);
95 ui->treeTags->addTopLevelItem(item);
101 const QVariantList &list = res.toList();
102 for (
const QVariant &val : list) {
103 const QVariantMap &img = val.toMap();
104 QString src = img.value(
QSL(
"src")).toString();
105 QString alt = img.value(
QSL(
"alt")).toString();
107 if (src.indexOf(QLatin1Char(
'/')) == -1) {
111 int pos = src.lastIndexOf(QLatin1Char(
'/'));
113 alt.remove(QLatin1Char(
'/'));
117 if (src.isEmpty() || alt.isEmpty())
120 auto* item =
new QTreeWidgetItem(ui->treeImages);
121 item->setText(0, alt);
122 item->setText(1, src);
123 ui->treeImages->addTopLevelItem(item);
130 connect(ui->saveButton, SIGNAL(clicked(QAbstractButton*)),
this, SLOT(saveImage()));
131 connect(ui->listWidget, SIGNAL(currentRowChanged(
int)), ui->stackedWidget, SLOT(setCurrentIndex(
int)));
132 connect(ui->treeImages, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
this, SLOT(showImagePreview(QTreeWidgetItem*)));
133 connect(ui->treeImages, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(imagesCustomContextMenuRequested(QPoint)));
134 connect(ui->treeTags, SIGNAL(customContextMenuRequested(QPoint)),
this, SLOT(tagsCustomContextMenuRequested(QPoint)));
135 connect(
this, &QDialog::accepted,
this, &SiteInfo::saveSiteSettings);
137 auto *shortcutTagsCopyAll =
new QShortcut(QKeySequence(
QSL(
"Ctrl+C")), ui->treeTags);
138 shortcutTagsCopyAll->setContext(Qt::WidgetShortcut);
139 connect(shortcutTagsCopyAll, &QShortcut::activated,
this, [=]{copySelectedItems(ui->treeTags,
false);});
141 auto *shortcutTagsCopyValues =
new QShortcut(QKeySequence(
QSL(
"Ctrl+Shift+C")), ui->treeTags);
142 shortcutTagsCopyValues->setContext(Qt::WidgetShortcut);
143 connect(shortcutTagsCopyValues, &QShortcut::activated,
this, [=]{copySelectedItems(ui->treeTags,
true);});
145 auto *shortcutImagesCopyAll =
new QShortcut(QKeySequence(
QSL(
"Ctrl+C")), ui->treeImages);
146 shortcutImagesCopyAll->setContext(Qt::WidgetShortcut);
147 connect(shortcutImagesCopyAll, &QShortcut::activated,
this, [=]{copySelectedItems(ui->treeImages,
false);});
149 auto *shortcutImagesCopyValues =
new QShortcut(QKeySequence(
QSL(
"Ctrl+Shift+C")), ui->treeImages);
150 shortcutImagesCopyValues->setContext(Qt::WidgetShortcut);
151 connect(shortcutImagesCopyValues, &QShortcut::activated,
this, [=]{copySelectedItems(ui->treeImages,
true);});
153 ui->treeImages->setContextMenuPolicy(Qt::CustomContextMenu);
154 ui->treeImages->sortByColumn(-1, Qt::AscendingOrder);
156 ui->treeTags->setContextMenuPolicy(Qt::CustomContextMenu);
157 ui->treeTags->sortByColumn(-1, Qt::AscendingOrder);
167 if (url.scheme() ==
QL1S(
"falkon") || url.scheme() ==
QL1S(
"view-source") || url.scheme() ==
QL1S(
"extension"))
173void SiteInfo::imagesCustomContextMenuRequested(
const QPoint &p)
175 QTreeWidgetItem* item = ui->treeImages->itemAt(p);
181 menu.addAction(QIcon::fromTheme(
QSL(
"edit-copy")), tr(
"Copy Image Location"), QKeySequence(
QSL(
"Ctrl+C")),
this, [=]{copySelectedItems(ui->treeImages,
false);});
182 menu.addAction(tr(
"Copy Image Name"), QKeySequence(
QSL(
"Ctrl+Shift+C")),
this, [=]{copySelectedItems(ui->treeImages,
true);});
184 menu.addAction(QIcon::fromTheme(
QSL(
"document-save")), tr(
"Save Image to Disk"),
this, SLOT(saveImage()));
185 menu.exec(ui->treeImages->viewport()->mapToGlobal(p));
188void SiteInfo::tagsCustomContextMenuRequested(
const QPoint &p)
190 QTreeWidgetItem* item = ui->treeTags->itemAt(p);
196 menu.addAction(tr(
"Copy Values"), QKeySequence(
QSL(
"Ctrl+C")),
this, [=]{copySelectedItems(ui->treeTags,
false);});
197 menu.addAction(tr(
"Copy Tags and Values"), QKeySequence(
QSL(
"Ctrl+Shift+C")),
this, [=]{copySelectedItems(ui->treeTags,
true);});
198 menu.exec(ui->treeTags->viewport()->mapToGlobal(p));
201void SiteInfo::copySelectedItems(
const QTreeWidget* treeWidget,
const bool both)
203 QList<QTreeWidgetItem*> itemList = treeWidget->selectedItems();
204 QString tmpText =
QSL(
"");
206 for (
int i = 0;
i < itemList.size(); ++
i) {
208 tmpText.append(
QSL(
"\n"));
211 tmpText.append((itemList[
i])->text(0));
212 tmpText.append(
QSL(
"\t"));
214 tmpText.append((itemList[
i])->text(1));
216 qApp->clipboard()->setText(tmpText);
219void SiteInfo::saveImage()
221 QTreeWidgetItem* item = ui->treeImages->currentItem();
226 if (!ui->mediaPreview->scene() || ui->mediaPreview->scene()->items().isEmpty())
229 QGraphicsItem *graphicsItem = ui->mediaPreview->scene()->items().at(0);
230 auto *pixmapItem =
static_cast<QGraphicsPixmapItem*
>(graphicsItem);
231 if (graphicsItem->type() != QGraphicsPixmapItem::Type || !pixmapItem)
234 if (!pixmapItem || pixmapItem->pixmap().isNull()) {
235 QMessageBox::warning(
this, tr(
"Error!"), tr(
"This preview is not available!"));
240 int index = imageFileName.lastIndexOf(QLatin1Char(
'.'));
242 imageFileName.truncate(index);
243 imageFileName.append(
QL1S(
".png"));
247 QDir::homePath() + QDir::separator() + imageFileName,
249 if (filePath.isEmpty()) {
253 if (!pixmapItem->pixmap().save(filePath,
"PNG")) {
254 QMessageBox::critical(
this, tr(
"Error!"), tr(
"Cannot write to file!"));
259void SiteInfo::showLoadingText()
261 delete ui->mediaPreview->scene();
262 auto* scene =
new QGraphicsScene(ui->mediaPreview);
264 scene->addText(tr(
"Loading..."));
266 ui->mediaPreview->setScene(scene);
269void SiteInfo::showPixmap(QPixmap pixmap)
271 pixmap.setDevicePixelRatio(devicePixelRatioF());
273 delete ui->mediaPreview->scene();
274 auto* scene =
new QGraphicsScene(ui->mediaPreview);
277 scene->addText(tr(
"Preview not available"));
279 scene->addPixmap(pixmap);
281 ui->mediaPreview->setScene(scene);
284void SiteInfo::showImagePreview(QTreeWidgetItem *item)
286 if ((!item) || (item->treeWidget()->selectedItems().length() > 1)) {
289 QUrl imageUrl = QUrl::fromEncoded(item->text(1).toUtf8());
290 if (imageUrl.isRelative()) {
291 imageUrl = m_baseUrl.resolved(imageUrl);
295 bool loading =
false;
297 if (imageUrl.scheme() == QLatin1String(
"data")) {
298 QByteArray encodedUrl = item->text(1).toUtf8();
299 QByteArray imageData = encodedUrl.mid(encodedUrl.indexOf(
',') + 1);
302 else if (imageUrl.scheme() == QLatin1String(
"file")) {
303 pixmap = QPixmap(imageUrl.toLocalFile());
305 else if (imageUrl.scheme() == QLatin1String(
"qrc")) {
306 pixmap = QPixmap(imageUrl.toString().mid(3));
310 m_imageReply =
mApp->networkManager()->get(QNetworkRequest(imageUrl));
311 connect(m_imageReply, &QNetworkReply::finished,
this, [
this]() {
312 if (m_imageReply->error() != QNetworkReply::NoError)
315 const QByteArray &data = m_imageReply->readAll();
316 showPixmap(QPixmap::fromImage(QImage::fromData(data)));
335 auto* listItem =
new QListWidgetItem(ui->listPermissions);
338 ui->listPermissions->setItemWidget(listItem, optionItem);
339 listItem->setSizeHint(optionItem->sizeHint());
344void SiteInfo::addSiteSettings()
346 auto siteSettings =
mApp->siteSettingsManager()->getSiteSettings(m_baseUrl);
361void SiteInfo::saveSiteSettings()
369 auto* item =
static_cast<SiteInfoPermissionItem*
>(ui->listPermissions->itemWidget(ui->listPermissions->item(index)));
373 auto* item =
static_cast<SiteInfoPermissionItem*
>(ui->listPermissions->itemWidget(ui->listPermissions->item(index)));
376 auto* item =
static_cast<SiteInfoPermissionItem*
>(ui->listPermissions->itemWidget(ui->listPermissions->item(index++)));
380 siteSettings.
server = m_baseUrl.host();
382 auto storedSiteSettings =
mApp->siteSettingsManager()->getSiteSettings(m_baseUrl);
384 if (!(siteSettings == storedSiteSettings)) {
385 mApp->siteSettingsManager()->setSiteSettings(siteSettings);
387#if QTWEBENGINECORE_VERSION >= QT_VERSION_CHECK(6, 7, 0)
388 if (siteSettings.
attributes[QWebEngineSettings::ForceDarkMode] != storedSiteSettings.attributes[QWebEngineSettings::ForceDarkMode]) {
389 bool enableForceDarkMode =
false;
397 m_view->
page()->settings()->setAttribute(
398 QWebEngineSettings::ForceDarkMode,
static QString convertUrlToText(const QUrl &url)
static QString getAllMetaAttributes()
static QString getAllImages()
static bool canShowSiteInfo(const QUrl &url)
SiteSettingsManager::Permission permission() const
void setOption(const SiteSettingsManager::PageOptions &option)
void setFeature(const QWebEnginePage::Feature &feature)
void setAttribute(const QWebEngineSettings::WebAttribute &attribute)
QString title(bool allowEmpty=false) const
const QList< QWebEngineSettings::WebAttribute > supportedAttribute
const QList< QWebEnginePage::Feature > supportedFeatures
QMap< QWebEnginePage::Feature, Permission > features
QMap< QWebEngineSettings::WebAttribute, Permission > attributes