work on previewers refactoring.
This commit is contained in:
parent
cb2922f0bc
commit
51401376be
@ -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
@ -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>
|
||||
|
@ -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
@ -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>
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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")));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user