work on previewers refactoring.

This commit is contained in:
Martin Rotter 2020-09-14 20:05:21 +02:00
parent cb2922f0bc
commit 51401376be
20 changed files with 215 additions and 330 deletions

View File

@ -1,16 +1,11 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="card-title">%1 <a class="btn btn-primary btn-sm" href="%3">URL</a> %6</h4> <h4 class="card-title">%1 <a class="btn btn-primary btn-sm" href="%3">URL</a> %6</h4>
<div class="buttons" style="margin-bottom: 10px;">
<img class="%7" message_id="%9" onclick="switchReadStatus(this); return false;"></img>
<img class="%8" message_id="%9" onclick="switchStarredStatus(this); return false;"></img>
</div>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div style="padding: 2px; margin: 0px;"> <div style="padding: 2px; margin: 0px;">
%10 %7
</div> </div>
%4 %4
</div> </div>

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<skin version="0.02"> <skin version="0.03">
<author> <author>
<name>Martin Rotter</name> <name>Martin Rotter</name>
<email>rotter.martinos@gmail.com</email> <email>rotter.martinos@gmail.com</email>

View File

@ -1,13 +1,9 @@
<div class="card"> <div class="card">
<div class="card-block"> <div class="card-block">
<h4 class="card-title">%1 <a class="btn btn-primary btn-sm" href="%3">URL</a> %6</h4> <h4 class="card-title">%1 <a class="btn btn-primary btn-sm" href="%3">URL</a> %6</h4>
<div class="buttons" style="margin-bottom: 10px;">
<img class="%7" message_id="%9" onclick="switchReadStatus(this); return false;"></img>
<img class="%8" message_id="%9" onclick="switchStarredStatus(this); return false;"></img>
</div>
<div class="card-text"> <div class="card-text">
<div style="padding: 2px; margin: 0px;"> <div style="padding: 2px; margin: 0px;">
%10 %7
</div> </div>
%4 %4
</div> </div>

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<skin version="0.21"> <skin version="0.22">
<author> <author>
<name>Martin Rotter</name> <name>Martin Rotter</name>
<email>rotter.martinos@gmail.com</email> <email>rotter.martinos@gmail.com</email>

View File

@ -5,9 +5,13 @@
#include "core/feeddownloader.h" #include "core/feeddownloader.h"
#include "core/feedsproxymodel.h" #include "core/feedsproxymodel.h"
#include "core/messagesproxymodel.h" #include "core/messagesproxymodel.h"
#include "exceptions/applicationexception.h"
#include "gui/dialogs/formdatabasecleanup.h"
#include "gui/dialogs/formmain.h"
#include "gui/feedstoolbar.h" #include "gui/feedstoolbar.h"
#include "gui/feedsview.h" #include "gui/feedsview.h"
#include "gui/messagebox.h" #include "gui/messagebox.h"
#include "gui/messagepreviewer.h"
#include "gui/messagestoolbar.h" #include "gui/messagestoolbar.h"
#include "gui/messagesview.h" #include "gui/messagesview.h"
#include "gui/statusbar.h" #include "gui/statusbar.h"
@ -23,14 +27,8 @@
#include "services/standard/standardfeedsimportexportmodel.h" #include "services/standard/standardfeedsimportexportmodel.h"
#include "services/standard/standardserviceroot.h" #include "services/standard/standardserviceroot.h"
#include "exceptions/applicationexception.h"
#include "gui/dialogs/formdatabasecleanup.h"
#include "gui/dialogs/formmain.h"
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
#include "gui/webbrowser.h" #include "gui/webbrowser.h"
#else
#include "gui/messagepreviewer.h"
#endif #endif
#include <QAction> #include <QAction>
@ -49,13 +47,7 @@
FeedMessageViewer::FeedMessageViewer(QWidget* parent) : TabContent(parent), m_toolBarsEnabled(true), m_listHeadersEnabled(true), FeedMessageViewer::FeedMessageViewer(QWidget* parent) : TabContent(parent), m_toolBarsEnabled(true), m_listHeadersEnabled(true),
m_toolBarFeeds(new FeedsToolBar(tr("Toolbar for feeds"), this)), m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)), m_toolBarFeeds(new FeedsToolBar(tr("Toolbar for feeds"), this)), m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)),
m_messagesView(new MessagesView(this)), m_feedsView(new FeedsView(this)), m_messagesView(new MessagesView(this)), m_feedsView(new FeedsView(this)),
#if defined(USE_WEBENGINE)
m_messagesBrowser(new WebBrowser(this)) {
#else
m_messagesBrowser(new MessagePreviewer(this)) { m_messagesBrowser(new MessagePreviewer(this)) {
#endif
initialize(); initialize();
initializeViews(); initializeViews();
@ -70,7 +62,7 @@ FeedMessageViewer::~FeedMessageViewer() {
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
WebBrowser* FeedMessageViewer::webBrowser() const { WebBrowser* FeedMessageViewer::webBrowser() const {
return m_messagesBrowser; return m_messagesBrowser->webBrowser();
} }
#endif #endif
@ -210,16 +202,10 @@ void FeedMessageViewer::createConnections() {
connect(m_toolBarMessages, &MessagesToolBar::messageSearchPatternChanged, m_messagesView, &MessagesView::searchMessages); connect(m_toolBarMessages, &MessagesToolBar::messageSearchPatternChanged, m_messagesView, &MessagesView::searchMessages);
connect(m_toolBarMessages, &MessagesToolBar::messageFilterChanged, m_messagesView, &MessagesView::filterMessages); connect(m_toolBarMessages, &MessagesToolBar::messageFilterChanged, m_messagesView, &MessagesView::filterMessages);
#if defined(USE_WEBENGINE)
connect(m_messagesView, &MessagesView::currentMessageRemoved, m_messagesBrowser, &WebBrowser::clear);
connect(m_messagesBrowser, &WebBrowser::markMessageRead, m_messagesView->sourceModel(), &MessagesModel::setMessageReadById);
connect(m_messagesBrowser, &WebBrowser::markMessageImportant, m_messagesView->sourceModel(), &MessagesModel::setMessageImportantById);
#else
connect(m_messagesView, &MessagesView::currentMessageRemoved, m_messagesBrowser, &MessagePreviewer::clear); connect(m_messagesView, &MessagesView::currentMessageRemoved, m_messagesBrowser, &MessagePreviewer::clear);
connect(m_messagesBrowser, &MessagePreviewer::markMessageRead, m_messagesView->sourceModel(), &MessagesModel::setMessageReadById); connect(m_messagesBrowser, &MessagePreviewer::markMessageRead, m_messagesView->sourceModel(), &MessagesModel::setMessageReadById);
connect(m_messagesBrowser, &MessagePreviewer::markMessageImportant, connect(m_messagesBrowser, &MessagePreviewer::markMessageImportant,
m_messagesView->sourceModel(), &MessagesModel::setMessageImportantById); m_messagesView->sourceModel(), &MessagesModel::setMessageImportantById);
#endif
connect(m_messagesView, &MessagesView::currentMessageChanged, this, &FeedMessageViewer::displayMessage); connect(m_messagesView, &MessagesView::currentMessageChanged, this, &FeedMessageViewer::displayMessage);

View File

@ -11,10 +11,9 @@
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
class WebBrowser; class WebBrowser;
#else
class MessagePreviewer;
#endif #endif
class MessagePreviewer;
class MessagesView; class MessagesView;
class MessagesToolBar; class MessagesToolBar;
class FeedsToolBar; class FeedsToolBar;
@ -91,12 +90,7 @@ class RSSGUARD_DLLSPEC FeedMessageViewer : public TabContent {
FeedsView* m_feedsView; FeedsView* m_feedsView;
QWidget* m_feedsWidget; QWidget* m_feedsWidget;
QWidget* m_messagesWidget; QWidget* m_messagesWidget;
#if defined(USE_WEBENGINE)
WebBrowser* m_messagesBrowser;
#else
MessagePreviewer* m_messagesBrowser; MessagePreviewer* m_messagesBrowser;
#endif
}; };
#endif // FEEDMESSAGEVIEWER_H #endif // FEEDMESSAGEVIEWER_H

View File

@ -10,7 +10,11 @@
#include "network-web/webfactory.h" #include "network-web/webfactory.h"
#include "services/abstract/serviceroot.h" #include "services/abstract/serviceroot.h"
#if defined (USE_WEBENGINE)
#include "gui/webbrowser.h"
#else
#include "gui/messagetextbrowser.h" #include "gui/messagetextbrowser.h"
#endif
#include <QGridLayout> #include <QGridLayout>
#include <QKeyEvent> #include <QKeyEvent>
@ -22,6 +26,8 @@
void MessagePreviewer::createConnections() { void MessagePreviewer::createConnections() {
installEventFilter(this); installEventFilter(this);
#if defined (USE_WEBENGINE)
#else
connect(m_searchWidget, &SearchTextWidget::cancelSearch, this, [this]() { connect(m_searchWidget, &SearchTextWidget::cancelSearch, this, [this]() {
m_txtMessage->textCursor().clearSelection(); m_txtMessage->textCursor().clearSelection();
m_txtMessage->moveCursor(QTextCursor::MoveOperation::Left); m_txtMessage->moveCursor(QTextCursor::MoveOperation::Left);
@ -87,6 +93,14 @@ void MessagePreviewer::createConnections() {
tr("Selected hyperlink is invalid.")); tr("Selected hyperlink is invalid."));
} }
}); });
connect(m_txtMessage,
QOverload<const QUrl&>::of(&QTextBrowser::highlighted),
[=](const QUrl& url) {
Q_UNUSED(url)
QToolTip::showText(QCursor::pos(), tr("Click this link to download it or open it with external browser."), this);
});
#endif
connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-read"), tr("Mark message as read")), connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-read"), tr("Mark message as read")),
&QAction::triggered, &QAction::triggered,
this, this,
@ -99,52 +113,52 @@ void MessagePreviewer::createConnections() {
&QAction::triggered, &QAction::triggered,
this, this,
&MessagePreviewer::switchMessageImportance); &MessagePreviewer::switchMessageImportance);
connect(m_txtMessage,
QOverload<const QUrl&>::of(&QTextBrowser::highlighted),
[=](const QUrl& url) {
Q_UNUSED(url)
QToolTip::showText(QCursor::pos(), tr("Click this link to download it or open it with external browser."), this);
});
} }
MessagePreviewer::MessagePreviewer(QWidget* parent) MessagePreviewer::MessagePreviewer(QWidget* parent)
: QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)), : QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)) {
m_txtMessage(new MessageTextBrowser(this)), m_searchWidget(new SearchTextWidget(this)) { #if defined (USE_WEBENGINE)
m_txtMessage = new WebBrowser(this);
m_txtMessage->setAutoFillBackground(true); #else
m_txtMessage->setFrameShape(QFrame::StyledPanel); m_txtMessage = new MessageTextBrowser(this);
m_txtMessage->setFrameShadow(QFrame::Plain); m_searchWidget = new SearchTextWidget(this);
m_txtMessage->setTabChangesFocus(true); #endif
m_txtMessage->setOpenLinks(false);
m_txtMessage->viewport()->setAutoFillBackground(true);
m_toolBar->setOrientation(Qt::Vertical); m_toolBar->setOrientation(Qt::Vertical);
m_layout->setContentsMargins(3, 3, 3, 3); m_layout->setContentsMargins(3, 3, 3, 3);
m_layout->addWidget(m_txtMessage, 0, 1, 1, 1); m_layout->addWidget(m_txtMessage, 0, 1, 1, 1);
#if !defined (USE_WEBENGINE)
m_layout->addWidget(m_searchWidget, 1, 1, 1, 1); m_layout->addWidget(m_searchWidget, 1, 1, 1, 1);
#endif
m_layout->addWidget(m_toolBar, 0, 0, -1, 1); m_layout->addWidget(m_toolBar, 0, 0, -1, 1);
createConnections(); createConnections();
m_actionSwitchImportance->setCheckable(true); m_actionSwitchImportance->setCheckable(true);
m_searchWidget->hide();
#if defined (USE_WEBENGINE)
#else
m_searchWidget->hide();
#endif
reloadFontSettings(); reloadFontSettings();
clear(); clear();
} }
void MessagePreviewer::reloadFontSettings() { void MessagePreviewer::reloadFontSettings() {
const Settings* settings = qApp->settings(); m_txtMessage->reloadFontSettings();
QFont fon;
fon.fromString(settings->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString());
m_txtMessage->setFont(fon);
} }
#if defined (USE_WEBENGINE)
WebBrowser* MessagePreviewer::webBrowser() const {
return m_txtMessage;
}
#endif
void MessagePreviewer::clear() { void MessagePreviewer::clear() {
m_txtMessage->clear(); m_txtMessage->clear();
m_pictures.clear();
hide(); hide();
} }
@ -157,12 +171,15 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) {
m_root = root; m_root = root;
if (!m_root.isNull()) { if (!m_root.isNull()) {
m_searchWidget->hide();
m_actionSwitchImportance->setChecked(m_message.m_isImportant);
m_txtMessage->setHtml(prepareHtmlForMessage(m_message));
updateButtons(); updateButtons();
show(); show();
m_actionSwitchImportance->setChecked(m_message.m_isImportant);
m_txtMessage->loadMessage(message, root);
#if !defined (USE_WEBENGINE)
m_searchWidget->hide();
m_txtMessage->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum); m_txtMessage->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum);
#endif
} }
} }
@ -222,16 +239,19 @@ void MessagePreviewer::switchMessageImportance(bool checked) {
bool MessagePreviewer::eventFilter(QObject* watched, QEvent* event) { bool MessagePreviewer::eventFilter(QObject* watched, QEvent* event) {
Q_UNUSED(watched) Q_UNUSED(watched)
#if !defined (USE_WEBENGINE)
if (event->type() == QEvent::Type::KeyPress) { if (event->type() == QEvent::Type::KeyPress) {
auto* key_event = static_cast<QKeyEvent*>(event); auto* key_event = static_cast<QKeyEvent*>(event);
if (key_event->matches(QKeySequence::StandardKey::Find)) { if (key_event->matches(QKeySequence::StandardKey::Find)) {
m_searchWidget->clear(); m_searchWidget->clear();
m_searchWidget->show(); m_searchWidget->show();
m_searchWidget->setFocus(); m_searchWidget->setFocus();
return true; return true;
} }
} }
#endif
return false; return false;
} }
@ -240,54 +260,3 @@ void MessagePreviewer::updateButtons() {
m_actionMarkRead->setEnabled(!m_message.m_isRead); m_actionMarkRead->setEnabled(!m_message.m_isRead);
m_actionMarkUnread->setEnabled(m_message.m_isRead); m_actionMarkUnread->setEnabled(m_message.m_isRead);
} }
QString MessagePreviewer::prepareHtmlForMessage(const Message& message) {
QString 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) {
QString enc_url;
if (!enc.m_url.contains(QRegularExpression(QSL("^(http|ftp|\\/)")))) {
enc_url = QString(INTERNAL_URL_PASSATTACHMENT) + QL1S("/?") + enc.m_url;
}
else {
enc_url = enc.m_url;
}
html += QString("[%2] <a href=\"%1\">%1</a><br/>").arg(enc_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();
m_pictures.append(match.captured(1));
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;
html = html
.replace(QSL("\r\n"), QSL("\n"))
.replace(QL1C('\r'), QL1C('\n'))
.replace(QL1C('\n'), QSL("<br/>"));
return html;
}

View File

@ -13,8 +13,12 @@
class QGridLayout; class QGridLayout;
class QToolBar; class QToolBar;
#if defined (USE_WEBENGINE)
class WebBrowser;
#else
class MessageTextBrowser; class MessageTextBrowser;
class SearchTextWidget; class SearchTextWidget;
#endif
class MessagePreviewer : public QWidget { class MessagePreviewer : public QWidget {
Q_OBJECT Q_OBJECT
@ -24,6 +28,10 @@ class MessagePreviewer : public QWidget {
void reloadFontSettings(); void reloadFontSettings();
#if defined (USE_WEBENGINE)
WebBrowser* webBrowser() const;
#endif
public slots: public slots:
void clear(); void clear();
void hideToolbar(); void hideToolbar();
@ -45,14 +53,18 @@ class MessagePreviewer : public QWidget {
private: private:
void createConnections(); void createConnections();
void updateButtons(); void updateButtons();
QString prepareHtmlForMessage(const Message& message);
QGridLayout* m_layout; QGridLayout* m_layout;
QToolBar* m_toolBar; QToolBar* m_toolBar;
#if defined (USE_WEBENGINE)
WebBrowser* m_txtMessage;
#else
MessageTextBrowser* m_txtMessage; MessageTextBrowser* m_txtMessage;
SearchTextWidget* m_searchWidget; SearchTextWidget* m_searchWidget;
#endif
Message m_message; Message m_message;
QStringList m_pictures;
QPointer<RootItem> m_root; QPointer<RootItem> m_root;
QAction* m_actionMarkRead; QAction* m_actionMarkRead;
QAction* m_actionMarkUnread; QAction* m_actionMarkUnread;

View File

@ -5,8 +5,67 @@
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "network-web/networkfactory.h" #include "network-web/networkfactory.h"
#include "services/abstract/rootitem.h"
MessageTextBrowser::MessageTextBrowser(QWidget* parent) : QTextBrowser(parent) {} MessageTextBrowser::MessageTextBrowser(QWidget* parent) : QTextBrowser(parent) {
setAutoFillBackground(true);
setFrameShape(QFrame::StyledPanel);
setFrameShadow(QFrame::Plain);
setTabChangesFocus(true);
setOpenLinks(false);
viewport()->setAutoFillBackground(true);
}
QString MessageTextBrowser::prepareHtmlForMessage(const Message& message) {
QString 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) {
QString enc_url;
if (!enc.m_url.contains(QRegularExpression(QSL("^(http|ftp|\\/)")))) {
enc_url = QString(INTERNAL_URL_PASSATTACHMENT) + QL1S("/?") + enc.m_url;
}
else {
enc_url = enc.m_url;
}
html += QString("[%2] <a href=\"%1\">%1</a><br/>").arg(enc_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();
m_pictures.append(match.captured(1));
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;
html = html
.replace(QSL("\r\n"), QSL("\n"))
.replace(QL1C('\r'), QL1C('\n'))
.replace(QL1C('\n'), QSL("<br/>"));
return html;
}
QVariant MessageTextBrowser::loadResource(int type, const QUrl& name) { QVariant MessageTextBrowser::loadResource(int type, const QUrl& name) {
Q_UNUSED(name) Q_UNUSED(name)
@ -30,6 +89,25 @@ QVariant MessageTextBrowser::loadResource(int type, const QUrl& name) {
} }
} }
void MessageTextBrowser::clear() {
QTextBrowser::clear();
m_pictures.clear();
}
void MessageTextBrowser::reloadFontSettings() {
const Settings* settings = qApp->settings();
QFont fon;
fon.fromString(settings->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString());
setFont(fon);
}
void MessageTextBrowser::loadMessage(const Message& message, RootItem* root) {
Q_UNUSED(root)
setHtml(prepareHtmlForMessage(message));
}
void MessageTextBrowser::wheelEvent(QWheelEvent* e) { void MessageTextBrowser::wheelEvent(QWheelEvent* e) {
QTextBrowser::wheelEvent(e); QTextBrowser::wheelEvent(e);
qApp->settings()->setValue(GROUP(Messages), Messages::PreviewerFontStandard, font().toString()); qApp->settings()->setValue(GROUP(Messages), Messages::PreviewerFontStandard, font().toString());

View File

@ -5,6 +5,10 @@
#include <QTextBrowser> #include <QTextBrowser>
#include "core/message.h"
class RootItem;
class MessageTextBrowser : public QTextBrowser { class MessageTextBrowser : public QTextBrowser {
Q_OBJECT Q_OBJECT
@ -14,11 +18,20 @@ class MessageTextBrowser : public QTextBrowser {
QVariant loadResource(int type, const QUrl& name); QVariant loadResource(int type, const QUrl& name);
public slots:
void clear();
void reloadFontSettings();
void loadMessage(const Message& message, RootItem* root);
protected: protected:
void wheelEvent(QWheelEvent* e); void wheelEvent(QWheelEvent* e);
private:
QString prepareHtmlForMessage(const Message& message);
private: private:
QPixmap m_imagePlaceholder; QPixmap m_imagePlaceholder;
QStringList m_pictures;
}; };
#endif // MESSAGETEXTBROWSER_H #endif // MESSAGETEXTBROWSER_H

View File

@ -15,11 +15,19 @@ NewspaperPreviewer::NewspaperPreviewer(RootItem* root, QList<Message> messages,
showMoreMessages(); showMoreMessages();
} }
#if defined(USE_WEBENGINE)
WebBrowser* NewspaperPreviewer::webBrowser() const {
return nullptr;
}
#endif
void NewspaperPreviewer::showMoreMessages() { void NewspaperPreviewer::showMoreMessages() {
if (!m_root.isNull()) { if (!m_root.isNull()) {
int current_scroll = m_ui->scrollArea->verticalScrollBar()->value(); int current_scroll = m_ui->scrollArea->verticalScrollBar()->value();
for (int i = 0; i < 10 && !m_messages.isEmpty(); i++) { for (int i = 0; i < 5 && !m_messages.isEmpty(); i++) {
Message msg = m_messages.takeFirst(); Message msg = m_messages.takeFirst();
auto* prev = new MessagePreviewer(this); auto* prev = new MessagePreviewer(this);
QMargins margins = prev->layout()->contentsMargins(); QMargins margins = prev->layout()->contentsMargins();
@ -28,7 +36,8 @@ void NewspaperPreviewer::showMoreMessages() {
connect(prev, &MessagePreviewer::markMessageImportant, this, &NewspaperPreviewer::markMessageImportant); connect(prev, &MessagePreviewer::markMessageImportant, this, &NewspaperPreviewer::markMessageImportant);
prev->layout()->setContentsMargins(margins); prev->layout()->setContentsMargins(margins);
prev->setFixedHeight(300);
prev->setFixedHeight(200);
prev->loadMessage(msg, m_root); prev->loadMessage(msg, m_root);
m_ui->m_layout->insertWidget(m_ui->m_layout->count() - 2, prev); m_ui->m_layout->insertWidget(m_ui->m_layout->count() - 2, prev);
} }

View File

@ -20,12 +20,20 @@ namespace Ui {
class RootItem; class RootItem;
#if defined(USE_WEBENGINE)
class WebBrowser;
#endif
class NewspaperPreviewer : public TabContent { class NewspaperPreviewer : public TabContent {
Q_OBJECT Q_OBJECT
public: public:
explicit NewspaperPreviewer(RootItem* root, QList<Message> messages, QWidget* parent = nullptr); explicit NewspaperPreviewer(RootItem* root, QList<Message> messages, QWidget* parent = nullptr);
#if defined(USE_WEBENGINE)
WebBrowser* webBrowser() const;
#endif
private slots: private slots:
void showMoreMessages(); void showMoreMessages();

View File

@ -10,6 +10,7 @@
SearchTextWidget::SearchTextWidget(QWidget* parent) : QWidget(parent) { SearchTextWidget::SearchTextWidget(QWidget* parent) : QWidget(parent) {
m_ui.setupUi(this); m_ui.setupUi(this);
setFocusProxy(m_ui.m_txtSearch); setFocusProxy(m_ui.m_txtSearch);
setFixedHeight(28);
m_ui.m_btnClear->setIcon(qApp->icons()->fromTheme(QSL("edit-clear"))); m_ui.m_btnClear->setIcon(qApp->icons()->fromTheme(QSL("edit-clear")));
m_ui.m_btnSearchBackward->setIcon(qApp->icons()->fromTheme(QSL("back"))); m_ui.m_btnSearchBackward->setIcon(qApp->icons()->fromTheme(QSL("back")));

View File

@ -3,23 +3,21 @@
#include "gui/tabwidget.h" #include "gui/tabwidget.h"
#include "definitions/definitions.h" #include "definitions/definitions.h"
#include "gui/dialogs/formmain.h"
#include "gui/feedmessageviewer.h" #include "gui/feedmessageviewer.h"
#include "gui/feedsview.h" #include "gui/feedsview.h"
#include "gui/messagesview.h" #include "gui/messagesview.h"
#include "gui/newspaperpreviewer.h"
#include "gui/plaintoolbutton.h"
#include "gui/tabbar.h" #include "gui/tabbar.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "miscellaneous/settings.h" #include "miscellaneous/settings.h"
#include "miscellaneous/textfactory.h" #include "miscellaneous/textfactory.h"
#include "network-web/webfactory.h"
#include "gui/dialogs/formmain.h"
#include "gui/plaintoolbutton.h"
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
#include "gui/webbrowser.h" #include "gui/webbrowser.h"
#else
#include "gui/newspaperpreviewer.h"
#include "network-web/webfactory.h"
#endif #endif
#include <QMenu> #include <QMenu>
@ -185,21 +183,12 @@ void TabWidget::closeAllTabs() {
} }
int TabWidget::addNewspaperView(RootItem* root, const QList<Message>& messages) { int TabWidget::addNewspaperView(RootItem* root, const QList<Message>& messages) {
#if defined(USE_WEBENGINE)
WebBrowser* prev = new WebBrowser(this);
connect(prev, &WebBrowser::markMessageRead,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageReadById);
connect(prev, &WebBrowser::markMessageImportant,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageImportantById);
#else
NewspaperPreviewer* prev = new NewspaperPreviewer(root, messages, this); NewspaperPreviewer* prev = new NewspaperPreviewer(root, messages, this);
connect(prev, &NewspaperPreviewer::markMessageRead, connect(prev, &NewspaperPreviewer::markMessageRead,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageReadById); m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageReadById);
connect(prev, &NewspaperPreviewer::markMessageImportant, connect(prev, &NewspaperPreviewer::markMessageImportant,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageImportantById); m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageImportantById);
#endif
int index = addTab(prev, int index = addTab(prev,
qApp->icons()->fromTheme(QSL("format-justify-fill")), qApp->icons()->fromTheme(QSL("format-justify-fill")),
@ -209,10 +198,6 @@ int TabWidget::addNewspaperView(RootItem* root, const QList<Message>& messages)
// NOTE: Do not bring "newspaper" tabs to front anymore. // NOTE: Do not bring "newspaper" tabs to front anymore.
//setCurrentIndex(index); //setCurrentIndex(index);
#if defined(USE_WEBENGINE)
prev->loadMessages(messages, root);
#endif
return index; return index;
} }

View File

@ -57,7 +57,6 @@ void WebBrowser::createConnections() {
m_searchWidget->setFocus(); m_searchWidget->setFocus();
}); });
connect(m_webView, &WebViewer::messageStatusChangeRequested, this, &WebBrowser::receiveMessageStatusChangeRequest);
connect(m_txtLocation, &LocationLineEdit::submitted, connect(m_txtLocation, &LocationLineEdit::submitted,
this, static_cast<void (WebBrowser::*)(const QString&)>(&WebBrowser::loadUrl)); this, static_cast<void (WebBrowser::*)(const QString&)>(&WebBrowser::loadUrl));
connect(m_webView, &WebViewer::urlChanged, this, &WebBrowser::updateUrl); connect(m_webView, &WebViewer::urlChanged, this, &WebBrowser::updateUrl);
@ -76,8 +75,6 @@ void WebBrowser::createConnections() {
void WebBrowser::updateUrl(const QUrl& url) { void WebBrowser::updateUrl(const QUrl& url) {
m_txtLocation->setText(url.toString()); m_txtLocation->setText(url.toString());
//setNavigationBarVisible(url_string != INTERNAL_URL_EMPTY && url_string != INTERNAL_URL_NEWSPAPER);
} }
void WebBrowser::loadUrl(const QUrl& url) { void WebBrowser::loadUrl(const QUrl& url) {
@ -154,29 +151,6 @@ bool WebBrowser::eventFilter(QObject* watched, QEvent* event) {
return false; return false;
} }
void WebBrowser::receiveMessageStatusChangeRequest(int message_id, WebPage::MessageStatusChange change) {
switch (change) {
case WebPage::MessageStatusChange::MarkRead:
markMessageAsRead(message_id, true);
break;
case WebPage::MessageStatusChange::MarkUnread:
markMessageAsRead(message_id, false);
break;
case WebPage::MessageStatusChange::MarkStarred:
switchMessageImportance(message_id, true);
break;
case WebPage::MessageStatusChange::MarkUnstarred:
switchMessageImportance(message_id, false);
break;
default:
break;
}
}
void WebBrowser::onTitleChanged(const QString& new_title) { void WebBrowser::onTitleChanged(const QString& new_title) {
if (new_title.isEmpty()) { if (new_title.isEmpty()) {
//: Webbrowser tab title when no title is available. //: Webbrowser tab title when no title is available.
@ -259,56 +233,6 @@ void WebBrowser::onLoadingFinished(bool success) {
m_loadingProgress->setValue(0); m_loadingProgress->setValue(0);
} }
void WebBrowser::markMessageAsRead(int id, bool read) {
if (!m_root.isNull()) {
Message* msg = findMessage(id);
if (msg != nullptr && m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(),
QList<Message>() << *msg,
read
? RootItem::ReadStatus::Read
: RootItem::ReadStatus::Unread)) {
DatabaseQueries::markMessagesReadUnread(qApp->database()->connection(objectName()),
QStringList() << QString::number(msg->m_id),
read ? RootItem::ReadStatus::Read : RootItem::ReadStatus::Unread);
m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(),
QList<Message>() << *msg,
read ? RootItem::ReadStatus::Read : RootItem::ReadStatus::Unread);
emit markMessageRead(msg->m_id, read ? RootItem::ReadStatus::Read : RootItem::ReadStatus::Unread);
msg->m_isRead = read;
}
}
}
void WebBrowser::switchMessageImportance(int id, bool checked) {
if (!m_root.isNull()) {
Message* msg = findMessage(id);
if (msg != nullptr &&
m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(),
QList<ImportanceChange>()
<< ImportanceChange(*msg,
msg->m_isImportant
? RootItem::Importance::NotImportant
: RootItem::Importance::Important))) {
DatabaseQueries::switchMessagesImportance(qApp->database()->connection(objectName()),
QStringList() << QString::number(msg->m_id));
m_root->getParentServiceRoot()->onAfterSwitchMessageImportance(m_root.data(),
QList<ImportanceChange>()
<< ImportanceChange(*msg,
msg->m_isImportant ?
RootItem::Importance::NotImportant :
RootItem::Importance::Important));
emit markMessageImportant(msg->m_id, msg->m_isImportant
? RootItem::Importance::NotImportant
: RootItem::Importance::Important);
msg->m_isImportant = checked;
}
}
}
Message* WebBrowser::findMessage(int id) { Message* WebBrowser::findMessage(int id) {
for (int i = 0; i < m_messages.size(); i++) { for (int i = 0; i < m_messages.size(); i++) {
if (m_messages.at(i).m_id == id) { if (m_messages.at(i).m_id == id) {

View File

@ -31,13 +31,8 @@ class WebBrowser : public TabContent {
explicit WebBrowser(QWidget* parent = nullptr); explicit WebBrowser(QWidget* parent = nullptr);
virtual ~WebBrowser(); virtual ~WebBrowser();
WebBrowser* webBrowser() const { WebBrowser* webBrowser() const;
return const_cast<WebBrowser*>(this); WebViewer* viewer() const;
}
WebViewer* viewer() const {
return m_webView;
}
void reloadFontSettings(); void reloadFontSettings();
@ -51,11 +46,7 @@ class WebBrowser : public TabContent {
void loadUrl(const QUrl& url); void loadUrl(const QUrl& url);
void loadMessages(const QList<Message>& messages, RootItem* root); void loadMessages(const QList<Message>& messages, RootItem* root);
void loadMessage(const Message& message, RootItem* root); void loadMessage(const Message& message, RootItem* root);
void setNavigationBarVisible(bool visible);
// Switches visibility of navigation bar.
inline void setNavigationBarVisible(bool visible) {
m_toolBar->setVisible(visible);
}
protected: protected:
bool eventFilter(QObject* watched, QEvent* event); bool eventFilter(QObject* watched, QEvent* event);
@ -66,9 +57,6 @@ class WebBrowser : public TabContent {
void onLoadingStarted(); void onLoadingStarted();
void onLoadingProgress(int progress); void onLoadingProgress(int progress);
void onLoadingFinished(bool success); void onLoadingFinished(bool success);
void receiveMessageStatusChangeRequest(int message_id, WebPage::MessageStatusChange change);
void onTitleChanged(const QString& new_title); void onTitleChanged(const QString& new_title);
void onIconChanged(const QIcon& icon); void onIconChanged(const QIcon& icon);
@ -77,15 +65,10 @@ class WebBrowser : public TabContent {
void iconChanged(int index, const QIcon& icon); void iconChanged(int index, const QIcon& icon);
void titleChanged(int index, const QString& title); void titleChanged(int index, const QString& title);
void markMessageRead(int id, RootItem::ReadStatus read);
void markMessageImportant(int id, RootItem::Importance important);
private: private:
void initializeLayout(); void initializeLayout();
Message* findMessage(int id); Message* findMessage(int id);
void markMessageAsRead(int id, bool read);
void switchMessageImportance(int id, bool checked);
void createConnections(); void createConnections();
QVBoxLayout* m_layout; QVBoxLayout* m_layout;
@ -103,4 +86,16 @@ class WebBrowser : public TabContent {
QPointer<RootItem> m_root; QPointer<RootItem> m_root;
}; };
inline WebBrowser* WebBrowser::webBrowser() const {
return const_cast<WebBrowser*>(this);
}
inline WebViewer* WebBrowser::viewer() const {
return m_webView;
}
inline void WebBrowser::setNavigationBarVisible(bool visible) {
m_toolBar->setVisible(visible);
}
#endif // WEBBROWSER_H #endif // WEBBROWSER_H

View File

@ -131,10 +131,7 @@ void WebViewer::loadMessages(const QList<Message>& messages, RootItem* root) {
message.m_contents, message.m_contents,
QLocale().toString(message.m_created, QLocale::FormatType::ShortFormat), QLocale().toString(message.m_created, QLocale::FormatType::ShortFormat),
enclosures, enclosures,
message.m_isRead ? "mark-unread" : "mark-read", enclosure_images));
message.m_isImportant ? "mark-unstarred" : "mark-starred",
QString::number(message.m_id))
.arg(enclosure_images));
} }
m_root = root; m_root = root;

View File

@ -174,7 +174,9 @@ HEADERS += core/feeddownloader.h \
services/gmail/gui/formdownloadattachment.h \ services/gmail/gui/formdownloadattachment.h \
services/gmail/gui/formaddeditemail.h \ services/gmail/gui/formaddeditemail.h \
gui/searchtextwidget.h \ gui/searchtextwidget.h \
network-web/oauthhttphandler.h network-web/oauthhttphandler.h \
gui/messagepreviewer.h \
gui/newspaperpreviewer.h
SOURCES += core/feeddownloader.cpp \ SOURCES += core/feeddownloader.cpp \
core/feedsmodel.cpp \ core/feedsmodel.cpp \
@ -313,7 +315,9 @@ SOURCES += core/feeddownloader.cpp \
services/gmail/gui/formdownloadattachment.cpp \ services/gmail/gui/formdownloadattachment.cpp \
services/gmail/gui/formaddeditemail.cpp \ services/gmail/gui/formaddeditemail.cpp \
gui/searchtextwidget.cpp \ gui/searchtextwidget.cpp \
network-web/oauthhttphandler.cpp network-web/oauthhttphandler.cpp \
gui/messagepreviewer.cpp \
gui/newspaperpreviewer.cpp
mac { mac {
OBJECTIVE_SOURCES += miscellaneous/disablewindowtabbing.mm OBJECTIVE_SOURCES += miscellaneous/disablewindowtabbing.mm
@ -348,7 +352,8 @@ FORMS += gui/dialogs/formabout.ui \
services/tt-rss/gui/formeditttrssaccount.ui \ services/tt-rss/gui/formeditttrssaccount.ui \
services/gmail/gui/formdownloadattachment.ui \ services/gmail/gui/formdownloadattachment.ui \
services/gmail/gui/formaddeditemail.ui \ services/gmail/gui/formaddeditemail.ui \
gui/searchtextwidget.ui gui/searchtextwidget.ui \
gui/newspaperpreviewer.ui
equals(USE_WEBENGINE, true) { equals(USE_WEBENGINE, true) {
HEADERS += gui/locationlineedit.h \ HEADERS += gui/locationlineedit.h \
@ -399,16 +404,8 @@ equals(USE_WEBENGINE, true) {
network-web/adblock/adblockdialog.ui network-web/adblock/adblockdialog.ui
} }
else { else {
HEADERS += gui/messagepreviewer.h \ HEADERS += gui/messagetextbrowser.h
gui/messagetextbrowser.h \ SOURCES += gui/messagetextbrowser.cpp
gui/newspaperpreviewer.h
SOURCES += gui/messagepreviewer.cpp \
gui/messagetextbrowser.cpp \
gui/newspaperpreviewer.cpp
FORMS += \
gui/newspaperpreviewer.ui
} }
# Add mimesis. # Add mimesis.