diff --git a/src/librssguard/CMakeLists.txt b/src/librssguard/CMakeLists.txt index a55c49327..ce4a6fd65 100644 --- a/src/librssguard/CMakeLists.txt +++ b/src/librssguard/CMakeLists.txt @@ -295,6 +295,8 @@ set(SOURCES services/gmail/gui/formeditgmailaccount.h services/gmail/gui/gmailaccountdetails.cpp services/gmail/gui/gmailaccountdetails.h + services/gmail/gui/emailpreviewer.h + services/gmail/gui/emailpreviewer.cpp services/greader/definitions.h services/greader/greaderentrypoint.cpp services/greader/greaderentrypoint.h @@ -541,6 +543,7 @@ set(UI_FILES services/gmail/gui/formaddeditemail.ui services/gmail/gui/formdownloadattachment.ui services/gmail/gui/gmailaccountdetails.ui + services/gmail/gui/emailpreviewer.ui services/greader/gui/greaderaccountdetails.ui services/newsblur/gui/newsbluraccountdetails.ui services/owncloud/gui/owncloudaccountdetails.ui diff --git a/src/librssguard/gui/messagepreviewer.cpp b/src/librssguard/gui/messagepreviewer.cpp index 5e6180f8e..70e658e63 100644 --- a/src/librssguard/gui/messagepreviewer.cpp +++ b/src/librssguard/gui/messagepreviewer.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -41,22 +42,28 @@ void MessagePreviewer::createConnections() { } MessagePreviewer::MessagePreviewer(QWidget* parent) - : QWidget(parent), m_layout(new QGridLayout(this)), m_toolBar(new QToolBar(this)), - m_separator(nullptr), m_btnLabels(QList>()) { - m_msgBrowser = new WebBrowser(nullptr, this); + : QWidget(parent), m_mainLayout(new QGridLayout(this)), m_viewerLayout(new QStackedLayout(this)), + m_toolBar(new QToolBar(this)), m_msgBrowser(new WebBrowser(nullptr, this)), m_separator(nullptr), + m_btnLabels(QList>()) { - m_actionSwitchImportance->setCheckable(true); m_toolBar->setOrientation(Qt::Orientation::Vertical); // NOTE: To make sure that if we have many labels and short message // that whole toolbar is visible. m_toolBar->setSizePolicy(m_toolBar->sizePolicy().horizontalPolicy(), QSizePolicy::Policy::MinimumExpanding); - m_layout->setContentsMargins(3, 3, 3, 3); - m_layout->addWidget(m_msgBrowser, 0, 1, 1, 1); - m_layout->addWidget(m_toolBar, 0, 0, -1, 1); + // This layout holds standard article browser on index 0 + // and optional custom browser on index 1. + m_viewerLayout->addWidget(m_msgBrowser); + + m_mainLayout->setContentsMargins(3, 3, 3, 3); + m_mainLayout->addLayout(m_viewerLayout, 0, 1, 1, 1); + m_mainLayout->addWidget(m_toolBar, 0, 0, -1, 1); createConnections(); + + m_actionSwitchImportance->setCheckable(true); + clear(); } @@ -77,6 +84,7 @@ WebBrowser* MessagePreviewer::webBrowser() const { void MessagePreviewer::clear() { updateLabels(true); + ensureDefaultBrowserVisible(); m_msgBrowser->clear(false); hide(); m_root.clear(); @@ -88,6 +96,7 @@ void MessagePreviewer::hideToolbar() { } void MessagePreviewer::loadUrl(const QString& url) { + ensureDefaultBrowserVisible(); m_msgBrowser->loadUrl(url); } @@ -109,10 +118,9 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) { return it->kind() == RootItem::Kind::Feed && it->customId() == msg_feed_id; })->toFeed(); - // TODO: tady místo na otevření skrze custom previewer, pokud - // ho root má. - if (feed != nullptr && feed->openArticlesDirectly() && !m_message.m_url.isEmpty()) { + ensureDefaultBrowserVisible(); + m_msgBrowser->setVerticalScrollBarPosition(0.0); m_msgBrowser->loadUrl(m_message.m_url); } @@ -120,9 +128,24 @@ void MessagePreviewer::loadMessage(const Message& message, RootItem* root) { CustomMessagePreviewer* custom_previewer = root->getParentServiceRoot()->customMessagePreviewer(); if (custom_previewer != nullptr) { + auto* current_custom_previewer = m_viewerLayout->widget(1); + + if (current_custom_previewer != nullptr) { + if (current_custom_previewer != custom_previewer) { + m_viewerLayout->removeWidget(current_custom_previewer); + m_viewerLayout->addWidget(custom_previewer); + } + } + else { + m_viewerLayout->addWidget(custom_previewer); + } + + m_viewerLayout->setCurrentIndex(1); custom_previewer->loadMessage(message, m_root); } else { + ensureDefaultBrowserVisible(); + m_msgBrowser->loadMessages({ message }, m_root); } } @@ -249,6 +272,14 @@ void MessagePreviewer::updateLabels(bool only_clear) { } } +void MessagePreviewer::ensureDefaultBrowserVisible() { + if (m_viewerLayout->count() > 1) { + m_viewerLayout->removeWidget(m_viewerLayout->widget(1)); + } + + m_viewerLayout->setCurrentIndex(0); +} + LabelButton::LabelButton(QWidget* parent) : QToolButton(parent), m_label(nullptr) {} Label* LabelButton::label() const { diff --git a/src/librssguard/gui/messagepreviewer.h b/src/librssguard/gui/messagepreviewer.h index 577e95dc9..391698ba1 100644 --- a/src/librssguard/gui/messagepreviewer.h +++ b/src/librssguard/gui/messagepreviewer.h @@ -12,6 +12,7 @@ #include class QGridLayout; +class QStackedLayout; class QToolBar; class WebBrowser; @@ -60,8 +61,10 @@ class MessagePreviewer : public QWidget { void createConnections(); void updateButtons(); void updateLabels(bool only_clear); + void ensureDefaultBrowserVisible(); - QGridLayout* m_layout; + QGridLayout* m_mainLayout; + QStackedLayout* m_viewerLayout; QToolBar* m_toolBar; WebBrowser* m_msgBrowser; Message m_message; diff --git a/src/librssguard/services/gmail/gmailserviceroot.cpp b/src/librssguard/services/gmail/gmailserviceroot.cpp index c80bfd132..251c2be0b 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.cpp +++ b/src/librssguard/services/gmail/gmailserviceroot.cpp @@ -12,6 +12,7 @@ #include "services/gmail/definitions.h" #include "services/gmail/gmailentrypoint.h" #include "services/gmail/gmailnetworkfactory.h" +#include "services/gmail/gui/emailpreviewer.h" #include "services/gmail/gui/formaddeditemail.h" #include "services/gmail/gui/formdownloadattachment.h" #include "services/gmail/gui/formeditgmailaccount.h" @@ -97,6 +98,14 @@ bool GmailServiceRoot::wantsBaggedIdsOfExistingMessages() const { return true; } +CustomMessagePreviewer* GmailServiceRoot::customMessagePreviewer() { + if (m_emailPreview.isNull()) { + m_emailPreview.reset(new EmailPreviewer()); + } + + return m_emailPreview.data(); +} + bool GmailServiceRoot::downloadAttachmentOnMyOwn(const QUrl& url) const { QString str_url = url.toString(); QString attachment_id = str_url.mid(str_url.indexOf(QL1C('?')) + 1); diff --git a/src/librssguard/services/gmail/gmailserviceroot.h b/src/librssguard/services/gmail/gmailserviceroot.h index ede4a5974..4633e1d84 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.h +++ b/src/librssguard/services/gmail/gmailserviceroot.h @@ -6,6 +6,8 @@ #include "services/abstract/cacheforserviceroot.h" #include "services/abstract/serviceroot.h" +#include "services/gmail/gui/emailpreviewer.h" + class GmailNetworkFactory; class GmailServiceRoot : public ServiceRoot, public CacheForServiceRoot { @@ -35,6 +37,7 @@ class GmailServiceRoot : public ServiceRoot, public CacheForServiceRoot { const QHash& stated_messages, const QHash& tagged_messages); virtual bool wantsBaggedIdsOfExistingMessages() const; + virtual CustomMessagePreviewer* customMessagePreviewer(); protected: virtual RootItem* obtainNewTreeForSyncIn() const; @@ -47,6 +50,7 @@ class GmailServiceRoot : public ServiceRoot, public CacheForServiceRoot { void updateTitle(); private: + QScopedPointer m_emailPreview; GmailNetworkFactory* m_network; QAction* m_actionReply; Message m_replyToMessage; diff --git a/src/librssguard/services/gmail/gui/emailpreviewer.cpp b/src/librssguard/services/gmail/gui/emailpreviewer.cpp new file mode 100755 index 000000000..92588e61d --- /dev/null +++ b/src/librssguard/services/gmail/gui/emailpreviewer.cpp @@ -0,0 +1,13 @@ +#include "services/gmail/gui/emailpreviewer.h" + +EmailPreviewer::EmailPreviewer(QWidget* parent) : CustomMessagePreviewer(parent) { + m_ui.setupUi(this); +} + +EmailPreviewer::~EmailPreviewer() { + qDebugNN << LOGSEC_GMAIL << "Email previewer destroyed."; +} + +void EmailPreviewer::clear() {} + +void EmailPreviewer::loadMessage(const Message& msg, RootItem* selected_item) {} diff --git a/src/librssguard/services/gmail/gui/emailpreviewer.h b/src/librssguard/services/gmail/gui/emailpreviewer.h new file mode 100755 index 000000000..5fcfebd03 --- /dev/null +++ b/src/librssguard/services/gmail/gui/emailpreviewer.h @@ -0,0 +1,22 @@ +#ifndef EMAILPREVIEWER_H +#define EMAILPREVIEWER_H + +#include "services/abstract/gui/custommessagepreviewer.h" + +#include "ui_emailpreviewer.h" + +class EmailPreviewer : public CustomMessagePreviewer { + Q_OBJECT + + public: + explicit EmailPreviewer(QWidget* parent = nullptr); + virtual ~EmailPreviewer(); + + virtual void clear(); + virtual void loadMessage(const Message& msg, RootItem* selected_item); + + private: + Ui::EmailPreviewer m_ui; +}; + +#endif // EMAILPREVIEWER_H diff --git a/src/librssguard/services/gmail/gui/emailpreviewer.ui b/src/librssguard/services/gmail/gui/emailpreviewer.ui new file mode 100755 index 000000000..99e3e8b34 --- /dev/null +++ b/src/librssguard/services/gmail/gui/emailpreviewer.ui @@ -0,0 +1,32 @@ + + + EmailPreviewer + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + 80 + 90 + 49 + 16 + + + + test + + + + + +