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-heading">
<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 class="panel-body">
<div style="padding: 2px; margin: 0px;">
%10
%7
</div>
%4
</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"?>
<skin version="0.02">
<skin version="0.03">
<author>
<name>Martin Rotter</name>
<email>rotter.martinos@gmail.com</email>

View File

@ -1,13 +1,9 @@
<div class="card">
<div class="card-block">
<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 style="padding: 2px; margin: 0px;">
%10
%7
</div>
%4
</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"?>
<skin version="0.21">
<skin version="0.22">
<author>
<name>Martin Rotter</name>
<email>rotter.martinos@gmail.com</email>

View File

@ -5,9 +5,13 @@
#include "core/feeddownloader.h"
#include "core/feedsproxymodel.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/feedsview.h"
#include "gui/messagebox.h"
#include "gui/messagepreviewer.h"
#include "gui/messagestoolbar.h"
#include "gui/messagesview.h"
#include "gui/statusbar.h"
@ -23,14 +27,8 @@
#include "services/standard/standardfeedsimportexportmodel.h"
#include "services/standard/standardserviceroot.h"
#include "exceptions/applicationexception.h"
#include "gui/dialogs/formdatabasecleanup.h"
#include "gui/dialogs/formmain.h"
#if defined(USE_WEBENGINE)
#include "gui/webbrowser.h"
#else
#include "gui/messagepreviewer.h"
#endif
#include <QAction>
@ -49,13 +47,7 @@
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_messagesView(new MessagesView(this)), m_feedsView(new FeedsView(this)),
#if defined(USE_WEBENGINE)
m_messagesBrowser(new WebBrowser(this)) {
#else
m_messagesBrowser(new MessagePreviewer(this)) {
#endif
initialize();
initializeViews();
@ -70,7 +62,7 @@ FeedMessageViewer::~FeedMessageViewer() {
#if defined(USE_WEBENGINE)
WebBrowser* FeedMessageViewer::webBrowser() const {
return m_messagesBrowser;
return m_messagesBrowser->webBrowser();
}
#endif
@ -210,16 +202,10 @@ void FeedMessageViewer::createConnections() {
connect(m_toolBarMessages, &MessagesToolBar::messageSearchPatternChanged, m_messagesView, &MessagesView::searchMessages);
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_messagesBrowser, &MessagePreviewer::markMessageRead, m_messagesView->sourceModel(), &MessagesModel::setMessageReadById);
connect(m_messagesBrowser, &MessagePreviewer::markMessageImportant,
m_messagesView->sourceModel(), &MessagesModel::setMessageImportantById);
#endif
connect(m_messagesView, &MessagesView::currentMessageChanged, this, &FeedMessageViewer::displayMessage);

View File

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

View File

@ -10,7 +10,11 @@
#include "network-web/webfactory.h"
#include "services/abstract/serviceroot.h"
#if defined (USE_WEBENGINE)
#include "gui/webbrowser.h"
#else
#include "gui/messagetextbrowser.h"
#endif
#include <QGridLayout>
#include <QKeyEvent>
@ -22,6 +26,8 @@
void MessagePreviewer::createConnections() {
installEventFilter(this);
#if defined (USE_WEBENGINE)
#else
connect(m_searchWidget, &SearchTextWidget::cancelSearch, this, [this]() {
m_txtMessage->textCursor().clearSelection();
m_txtMessage->moveCursor(QTextCursor::MoveOperation::Left);
@ -87,6 +93,14 @@ void MessagePreviewer::createConnections() {
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")),
&QAction::triggered,
this,
@ -99,52 +113,52 @@ void MessagePreviewer::createConnections() {
&QAction::triggered,
this,
&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)
: QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)),
m_txtMessage(new MessageTextBrowser(this)), m_searchWidget(new SearchTextWidget(this)) {
m_txtMessage->setAutoFillBackground(true);
m_txtMessage->setFrameShape(QFrame::StyledPanel);
m_txtMessage->setFrameShadow(QFrame::Plain);
m_txtMessage->setTabChangesFocus(true);
m_txtMessage->setOpenLinks(false);
m_txtMessage->viewport()->setAutoFillBackground(true);
: QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)) {
#if defined (USE_WEBENGINE)
m_txtMessage = new WebBrowser(this);
#else
m_txtMessage = new MessageTextBrowser(this);
m_searchWidget = new SearchTextWidget(this);
#endif
m_toolBar->setOrientation(Qt::Vertical);
m_layout->setContentsMargins(3, 3, 3, 3);
m_layout->addWidget(m_txtMessage, 0, 1, 1, 1);
#if !defined (USE_WEBENGINE)
m_layout->addWidget(m_searchWidget, 1, 1, 1, 1);
#endif
m_layout->addWidget(m_toolBar, 0, 0, -1, 1);
createConnections();
m_actionSwitchImportance->setCheckable(true);
m_searchWidget->hide();
#if defined (USE_WEBENGINE)
#else
m_searchWidget->hide();
#endif
reloadFontSettings();
clear();
}
void MessagePreviewer::reloadFontSettings() {
const Settings* settings = qApp->settings();
QFont fon;
fon.fromString(settings->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString());
m_txtMessage->setFont(fon);
m_txtMessage->reloadFontSettings();
}
#if defined (USE_WEBENGINE)
WebBrowser* MessagePreviewer::webBrowser() const {
return m_txtMessage;
}
#endif
void MessagePreviewer::clear() {
m_txtMessage->clear();
m_pictures.clear();
hide();
}
@ -157,12 +171,15 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) {
m_root = root;
if (!m_root.isNull()) {
m_searchWidget->hide();
m_actionSwitchImportance->setChecked(m_message.m_isImportant);
m_txtMessage->setHtml(prepareHtmlForMessage(m_message));
updateButtons();
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);
#endif
}
}
@ -222,16 +239,19 @@ void MessagePreviewer::switchMessageImportance(bool checked) {
bool MessagePreviewer::eventFilter(QObject* watched, QEvent* event) {
Q_UNUSED(watched)
#if !defined (USE_WEBENGINE)
if (event->type() == QEvent::Type::KeyPress) {
auto* key_event = static_cast<QKeyEvent*>(event);
if (key_event->matches(QKeySequence::StandardKey::Find)) {
m_searchWidget->clear();
m_searchWidget->show();
m_searchWidget->setFocus();
return true;
}
}
#endif
return false;
}
@ -240,54 +260,3 @@ void MessagePreviewer::updateButtons() {
m_actionMarkRead->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 QToolBar;
#if defined (USE_WEBENGINE)
class WebBrowser;
#else
class MessageTextBrowser;
class SearchTextWidget;
#endif
class MessagePreviewer : public QWidget {
Q_OBJECT
@ -24,6 +28,10 @@ class MessagePreviewer : public QWidget {
void reloadFontSettings();
#if defined (USE_WEBENGINE)
WebBrowser* webBrowser() const;
#endif
public slots:
void clear();
void hideToolbar();
@ -45,14 +53,18 @@ class MessagePreviewer : public QWidget {
private:
void createConnections();
void updateButtons();
QString prepareHtmlForMessage(const Message& message);
QGridLayout* m_layout;
QToolBar* m_toolBar;
#if defined (USE_WEBENGINE)
WebBrowser* m_txtMessage;
#else
MessageTextBrowser* m_txtMessage;
SearchTextWidget* m_searchWidget;
#endif
Message m_message;
QStringList m_pictures;
QPointer<RootItem> m_root;
QAction* m_actionMarkRead;
QAction* m_actionMarkUnread;

View File

@ -5,8 +5,67 @@
#include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.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) {
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) {
QTextBrowser::wheelEvent(e);
qApp->settings()->setValue(GROUP(Messages), Messages::PreviewerFontStandard, font().toString());

View File

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

View File

@ -15,11 +15,19 @@ NewspaperPreviewer::NewspaperPreviewer(RootItem* root, QList<Message> messages,
showMoreMessages();
}
#if defined(USE_WEBENGINE)
WebBrowser* NewspaperPreviewer::webBrowser() const {
return nullptr;
}
#endif
void NewspaperPreviewer::showMoreMessages() {
if (!m_root.isNull()) {
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();
auto* prev = new MessagePreviewer(this);
QMargins margins = prev->layout()->contentsMargins();
@ -28,7 +36,8 @@ void NewspaperPreviewer::showMoreMessages() {
connect(prev, &MessagePreviewer::markMessageImportant, this, &NewspaperPreviewer::markMessageImportant);
prev->layout()->setContentsMargins(margins);
prev->setFixedHeight(300);
prev->setFixedHeight(200);
prev->loadMessage(msg, m_root);
m_ui->m_layout->insertWidget(m_ui->m_layout->count() - 2, prev);
}

View File

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

View File

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

View File

@ -3,23 +3,21 @@
#include "gui/tabwidget.h"
#include "definitions/definitions.h"
#include "gui/dialogs/formmain.h"
#include "gui/feedmessageviewer.h"
#include "gui/feedsview.h"
#include "gui/messagesview.h"
#include "gui/newspaperpreviewer.h"
#include "gui/plaintoolbutton.h"
#include "gui/tabbar.h"
#include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h"
#include "miscellaneous/settings.h"
#include "miscellaneous/textfactory.h"
#include "gui/dialogs/formmain.h"
#include "gui/plaintoolbutton.h"
#include "network-web/webfactory.h"
#if defined(USE_WEBENGINE)
#include "gui/webbrowser.h"
#else
#include "gui/newspaperpreviewer.h"
#include "network-web/webfactory.h"
#endif
#include <QMenu>
@ -185,21 +183,12 @@ void TabWidget::closeAllTabs() {
}
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);
connect(prev, &NewspaperPreviewer::markMessageRead,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageReadById);
connect(prev, &NewspaperPreviewer::markMessageImportant,
m_feedMessageViewer->messagesView()->sourceModel(), &MessagesModel::setMessageImportantById);
#endif
int index = addTab(prev,
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.
//setCurrentIndex(index);
#if defined(USE_WEBENGINE)
prev->loadMessages(messages, root);
#endif
return index;
}

View File

@ -57,7 +57,6 @@ void WebBrowser::createConnections() {
m_searchWidget->setFocus();
});
connect(m_webView, &WebViewer::messageStatusChangeRequested, this, &WebBrowser::receiveMessageStatusChangeRequest);
connect(m_txtLocation, &LocationLineEdit::submitted,
this, static_cast<void (WebBrowser::*)(const QString&)>(&WebBrowser::loadUrl));
connect(m_webView, &WebViewer::urlChanged, this, &WebBrowser::updateUrl);
@ -76,8 +75,6 @@ void WebBrowser::createConnections() {
void WebBrowser::updateUrl(const QUrl& url) {
m_txtLocation->setText(url.toString());
//setNavigationBarVisible(url_string != INTERNAL_URL_EMPTY && url_string != INTERNAL_URL_NEWSPAPER);
}
void WebBrowser::loadUrl(const QUrl& url) {
@ -154,29 +151,6 @@ bool WebBrowser::eventFilter(QObject* watched, QEvent* event) {
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) {
if (new_title.isEmpty()) {
//: Webbrowser tab title when no title is available.
@ -259,56 +233,6 @@ void WebBrowser::onLoadingFinished(bool success) {
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) {
for (int i = 0; i < m_messages.size(); i++) {
if (m_messages.at(i).m_id == id) {

View File

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

View File

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

View File

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