actually show plain images, work on proper simple article layout aka old nonwebengine
This commit is contained in:
parent
3f402b1861
commit
d3ec7ac4b3
2 changed files with 73 additions and 4 deletions
|
@ -24,7 +24,7 @@
|
|||
#include <QWheelEvent>
|
||||
|
||||
LiteHtmlViewer::LiteHtmlViewer(QWidget* parent) : QLiteHtmlWidget(parent), m_downloader(new Downloader(this)),
|
||||
m_reloadingWithImages(false) {
|
||||
m_reloadingWithImages(false), m_useSimpleArticleLayout(false) {
|
||||
setResourceHandler([this](const QUrl& url) {
|
||||
emit loadProgress(-1);
|
||||
return m_reloadingWithImages ? handleResource(url) : QByteArray{};
|
||||
|
@ -94,8 +94,8 @@ void LiteHtmlViewer::setUrl(const QUrl& url) {
|
|||
}
|
||||
else {
|
||||
if (content_type.startsWith(QSL("image/"))) {
|
||||
html_str =
|
||||
"<img src=\"data:image/gif;base64,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\">";
|
||||
html_str = QSL("<img src=\"data:%1;base64,%2\">").arg(content_type,
|
||||
QString::fromLocal8Bit(m_downloader->lastOutputData().toBase64()));
|
||||
}
|
||||
else {
|
||||
html_str = QString::fromUtf8(m_downloader->lastOutputData());
|
||||
|
@ -128,8 +128,62 @@ void LiteHtmlViewer::clear() {
|
|||
setHtml({});
|
||||
}
|
||||
|
||||
QPair<QString, QUrl> LiteHtmlViewer::prepareHtmlForMessage(const QList<Message>& messages, RootItem* selected_item) const {
|
||||
QString html;
|
||||
|
||||
for (const Message& message : messages) {
|
||||
html += QString("<h2 align=\"center\">%1</h2>").arg(message.m_title);
|
||||
|
||||
if (!message.m_url.isEmpty()) {
|
||||
html += QString("[url] <a href=\"%1\">%1</a><br/>").arg(message.m_url);
|
||||
}
|
||||
|
||||
for (const Enclosure& enc : message.m_enclosures) {
|
||||
html += QString("[%2] <a href=\"%1\">%1</a><br/>").arg(enc.m_url, enc.m_mimeType);
|
||||
}
|
||||
|
||||
QRegularExpression imgTagRegex("\\<img[^\\>]*src\\s*=\\s*[\"\']([^\"\']*)[\"\'][^\\>]*\\>",
|
||||
QRegularExpression::PatternOption::CaseInsensitiveOption |
|
||||
QRegularExpression::PatternOption::InvertedGreedinessOption);
|
||||
QRegularExpressionMatchIterator i = imgTagRegex.globalMatch(message.m_contents);
|
||||
QString pictures_html;
|
||||
|
||||
while (i.hasNext()) {
|
||||
QRegularExpressionMatch match = i.next();
|
||||
|
||||
pictures_html += QString("<br/>[%1] <a href=\"%2\">%2</a>").arg(tr("image"), match.captured(1));
|
||||
}
|
||||
|
||||
/*if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayImagePlaceholders)).toBool()) {
|
||||
html += message.m_contents;
|
||||
}
|
||||
else {*/
|
||||
QString cnts = message.m_contents;
|
||||
|
||||
html += cnts.replace(imgTagRegex, QString());
|
||||
//}
|
||||
|
||||
html += pictures_html;
|
||||
}
|
||||
|
||||
// TODO: If FgInteresting not defined by the skin
|
||||
// use current pallette/Highlight color perhaps.
|
||||
return { QSL("<html>"
|
||||
"<head><style>"
|
||||
"a { color: %2; }"
|
||||
"</style></head>"
|
||||
"<body>%1</body>"
|
||||
"</html>").arg(html,
|
||||
qApp->skins()->currentSkin()
|
||||
.colorForModel(SkinEnums::PaletteColors::FgInteresting)
|
||||
.value<QColor>().name()),
|
||||
QUrl() };
|
||||
}
|
||||
|
||||
void LiteHtmlViewer::loadMessages(const QList<Message>& messages, RootItem* root) {
|
||||
auto html_messages = qApp->skins()->generateHtmlOfArticles(messages, root);
|
||||
auto html_messages = m_useSimpleArticleLayout
|
||||
? prepareHtmlForMessage(messages, root)
|
||||
: qApp->skins()->generateHtmlOfArticles(messages, root);
|
||||
|
||||
setHtml(html_messages.first, html_messages.second);
|
||||
emit loadFinished(true);
|
||||
|
@ -160,6 +214,10 @@ void LiteHtmlViewer::setZoomFactor(qreal zoom_factor) {
|
|||
}
|
||||
}
|
||||
|
||||
void LiteHtmlViewer::simpleLayoutChanged(bool activated) {
|
||||
m_useSimpleArticleLayout = activated;
|
||||
}
|
||||
|
||||
void LiteHtmlViewer::selectedTextChanged(bool available) {
|
||||
if (!available) {
|
||||
return;
|
||||
|
@ -233,10 +291,16 @@ void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) {
|
|||
}
|
||||
});
|
||||
|
||||
m_actionSimpleLayout.reset(new QAction(qApp->icons()->fromTheme(QSL("view-list-details")),
|
||||
tr("Use simple article layout"),
|
||||
this));
|
||||
m_actionSimpleLayout->setCheckable(true);
|
||||
|
||||
m_actionReloadWithImages.reset(new QAction(qApp->icons()->fromTheme(QSL("viewimage"), QSL("view-refresh")),
|
||||
tr("Reload with images"),
|
||||
this));
|
||||
|
||||
connect(m_actionSimpleLayout.data(), &QAction::triggered, this, &LiteHtmlViewer::simpleLayoutChanged);
|
||||
connect(m_actionReloadWithImages.data(), &QAction::triggered, this, &LiteHtmlViewer::reloadPageWithImages);
|
||||
}
|
||||
|
||||
|
@ -248,6 +312,7 @@ void LiteHtmlViewer::showContextMenu(const QPoint& pos, const QUrl& url) {
|
|||
m_contextMenu->addActions({ m_actionCopyUrl.data(),
|
||||
m_actionCopyText.data(),
|
||||
m_actionOpenLinkExternally.data(),
|
||||
m_actionSimpleLayout.data(),
|
||||
m_actionReloadWithImages.data() });
|
||||
|
||||
if (url.isValid()) {
|
||||
|
|
|
@ -35,6 +35,7 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
|
|||
virtual void setZoomFactor(qreal zoom_factor);
|
||||
|
||||
private slots:
|
||||
void simpleLayoutChanged(bool activated);
|
||||
void selectedTextChanged(bool available);
|
||||
void onLinkClicked(const QUrl& link);
|
||||
void reloadPageWithImages();
|
||||
|
@ -55,6 +56,7 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
|
|||
virtual void keyPressEvent(QKeyEvent* event);
|
||||
|
||||
private:
|
||||
QPair<QString, QUrl> prepareHtmlForMessage(const QList<Message>& messages, RootItem* selected_item) const;
|
||||
BlockingResult blockedWithAdblock(const QUrl& url);
|
||||
QByteArray handleResource(const QUrl& url);
|
||||
|
||||
|
@ -64,8 +66,10 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
|
|||
QScopedPointer<QAction> m_actionCopyUrl;
|
||||
QScopedPointer<QAction> m_actionCopyText;
|
||||
QScopedPointer<QAction> m_actionOpenLinkExternally;
|
||||
QScopedPointer<QAction> m_actionSimpleLayout;
|
||||
QScopedPointer<QAction> m_actionReloadWithImages;
|
||||
bool m_reloadingWithImages;
|
||||
bool m_useSimpleArticleLayout;
|
||||
};
|
||||
|
||||
#endif // LITEHTMLVIEWER_H
|
||||
|
|
Loading…
Add table
Reference in a new issue