// This file is part of RSS Guard. // // Copyright (C) 2011-2017 by Martin Rotter // // RSS Guard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // RSS Guard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RSS Guard. If not, see . #include "gui/messagepreviewer.h" #include "miscellaneous/application.h" #include "network-web/webfactory.h" #include "miscellaneous/databasequeries.h" #include "gui/messagebox.h" #include "gui/dialogs/formmain.h" #include "services/abstract/serviceroot.h" #include #include #include void MessagePreviewer::createConnections() { connect(m_ui->m_txtMessage, &QTextBrowser::anchorClicked, [ = ](const QUrl & url) { if (!url.isEmpty()) { bool open_externally_now = qApp->settings()->value(GROUP(Browser), SETTING(Browser::OpenLinksInExternalBrowserRightAway)).toBool(); if (open_externally_now) { qApp->web()->openUrlInExternalBrowser(url.toString()); } else { // User clicked some URL. Open it in external browser or download? MessageBox box(qApp->mainForm()); box.setText(tr("You clicked some link. You can download the link contents or open it in external web browser.")); box.setInformativeText(tr("What action do you want to take?")); box.setDetailedText(url.toString()); QAbstractButton* btn_open = box.addButton(tr("Open in external browser"), QMessageBox::ActionRole); QAbstractButton* btn_download = box.addButton(tr("Download"), QMessageBox::ActionRole); QAbstractButton* btn_cancel = box.addButton(QMessageBox::Cancel); bool always; MessageBox::setCheckBox(&box, tr("Always open links in external browser."), &always); box.setDefaultButton(QMessageBox::Cancel); box.exec(); if (box.clickedButton() != box.button(QMessageBox::Cancel)) { // Store selected checkbox value. qApp->settings()->setValue(GROUP(Browser), Browser::OpenLinksInExternalBrowserRightAway, always); } if (box.clickedButton() == btn_open) { qApp->web()->openUrlInExternalBrowser(url.toString()); } else if (box.clickedButton() == btn_download) { qApp->downloadManager()->download(url); } btn_download->deleteLater(); btn_open->deleteLater(); btn_cancel->deleteLater(); } } else { MessageBox::show(qApp->mainForm(), QMessageBox::Warning, tr("Incorrect link"), tr("Selected hyperlink is invalid.")); } }); connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-read"), tr("Mark message as read")), &QAction::triggered, this, &MessagePreviewer::markMessageAsRead); connect(m_actionMarkUnread = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-unread"), tr("Mark message as unread")), &QAction::triggered, this, &MessagePreviewer::markMessageAsUnread); connect(m_actionSwitchImportance = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-important"), tr("Switch message importance")), &QAction::triggered, this, &MessagePreviewer::switchMessageImportance); connect(m_ui->m_txtMessage, static_cast(&QTextBrowser::highlighted), [ = ](const QString & text) { Q_UNUSED(text) 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_ui(new Ui::MessagePreviewer), m_pictures(QStringList()) { m_ui->setupUi(this); m_ui->m_txtMessage->viewport()->setAutoFillBackground(true); m_toolBar = new QToolBar(this); m_toolBar->setOrientation(Qt::Vertical); m_ui->m_layout->addWidget(m_toolBar, 0, 0, -1, 1); createConnections(); m_actionSwitchImportance->setCheckable(true); reloadFontSettings(); clear(); } MessagePreviewer::~MessagePreviewer() { } void MessagePreviewer::reloadFontSettings() { const Settings* settings = qApp->settings(); QFont fon; fon.fromString(settings->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString()); m_ui->m_txtMessage->setFont(fon); } void MessagePreviewer::clear() { m_ui->m_txtMessage->clear(); m_pictures.clear(); hide(); } void MessagePreviewer::hideToolbar() { m_toolBar->setVisible(false); } void MessagePreviewer::loadMessage(const Message& message, RootItem* root) { m_message = message; m_root = root; if (!m_root.isNull()) { m_actionSwitchImportance->setChecked(m_message.m_isImportant); m_ui->m_txtMessage->setHtml(prepareHtmlForMessage(m_message)); updateButtons(); show(); m_ui->m_txtMessage->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum); } } void MessagePreviewer::markMessageAsRead() { markMessageAsReadUnread(RootItem::Read); } void MessagePreviewer::markMessageAsUnread() { markMessageAsReadUnread(RootItem::Unread); } void MessagePreviewer::markMessageAsReadUnread(RootItem::ReadStatus read) { if (!m_root.isNull()) { if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(), QList() << m_message, read)) { DatabaseQueries::markMessagesReadUnread(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings), QStringList() << QString::number(m_message.m_id), read); m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(), QList() << m_message, read); m_message.m_isRead = read == RootItem::Read; emit markMessageRead(m_message.m_id, read); updateButtons(); } } } void MessagePreviewer::switchMessageImportance(bool checked) { if (!m_root.isNull()) { if (m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(), QList() << ImportanceChange(m_message, m_message.m_isImportant ? RootItem::NotImportant : RootItem::Important))) { DatabaseQueries::switchMessagesImportance(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings), QStringList() << QString::number(m_message.m_id)); m_root->getParentServiceRoot()->onAfterSwitchMessageImportance(m_root.data(), QList() << ImportanceChange(m_message, m_message.m_isImportant ? RootItem::NotImportant : RootItem::Important)); emit markMessageImportant(m_message.m_id, checked ? RootItem::Important : RootItem::NotImportant); m_message.m_isImportant = checked; } } } 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("

%1

").arg(message.m_title); html += QString("[url] %1
").arg(message.m_url); foreach (const Enclosure& enc, message.m_enclosures) { html += QString("[%2] %1
").arg(enc.m_url, enc.m_mimeType); } int offset = 0; QRegExp imgTagRegex("\\]*src\\s*=\\s*\"([^\"]*)\"[^\\>]*\\>", Qt::CaseInsensitive); imgTagRegex.setMinimal(true); while ((offset = imgTagRegex.indexIn(message.m_contents, offset)) != -1) { m_pictures.append(imgTagRegex.cap(1)); offset += imgTagRegex.matchedLength(); html += QString("[%2] %1
").arg(imgTagRegex.cap(1), tr("image")); } html += "
"; html += message.m_contents; return html; }