From b0a416a96b379f65d468c50d66e9a854ad1f664c Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 12 May 2015 09:48:22 +0200 Subject: [PATCH] Work on #102. --- src/core/feedsmodel.cpp | 3 +- src/gui/feedmessageviewer.cpp | 2 + src/gui/formmain.ui | 6 ++ src/gui/formsettings.cpp | 38 +++++++++- src/gui/formsettings.h | 3 + src/gui/formsettings.ui | 127 ++++++++++++++++++++++++++++----- src/gui/messagesview.cpp | 14 ++++ src/gui/messagesview.h | 1 + src/miscellaneous/settings.cpp | 9 +++ src/miscellaneous/settings.h | 9 +++ src/network-web/webfactory.cpp | 18 +++++ src/network-web/webfactory.h | 4 ++ 12 files changed, 215 insertions(+), 19 deletions(-) diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 2705f14bb..2aaefaff4 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -767,7 +767,8 @@ void FeedsModel::loadFromDatabase() { query_feeds.setForwardOnly(true); if (!query_feeds.exec("SELECT * FROM Feeds;") || query_feeds.lastError().isValid()) { - qFatal("Query for obtaining feeds failed."); + qFatal("Query for obtaining feeds failed. Error message: '%s'.", + qPrintable(query_feeds.lastError().text())); } while (query_feeds.next()) { diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index b8c3c96ce..1200a72cf 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -243,6 +243,8 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesInternally())); connect(form_main->m_ui->m_actionOpenSelectedMessagesInternally, SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally())); + connect(form_main->m_ui->m_actionSendMessageViaEmail, + SIGNAL(triggered()), m_messagesView, SLOT(sendSelectedMessageViaEmail())); connect(form_main->m_ui->m_actionMarkAllFeedsRead, SIGNAL(triggered()), m_feedsView, SLOT(markAllFeedsRead())); connect(form_main->m_ui->m_actionMarkSelectedFeedsAsRead, diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 75a352c05..bc6622594 100755 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -162,6 +162,7 @@ + @@ -643,6 +644,11 @@ &Downloads + + + Send selected message via e-mail + + diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp index 71363175a..12c013467 100755 --- a/src/gui/formsettings.cpp +++ b/src/gui/formsettings.cpp @@ -121,6 +121,8 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form connect(m_ui->m_treeSkins, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(onSkinSelected(QTreeWidgetItem*,QTreeWidgetItem*))); connect(m_ui->m_cmbExternalBrowserPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(changeDefaultBrowserArguments(int))); connect(m_ui->m_btnExternalBrowserExecutable, SIGNAL(clicked()), this, SLOT(selectBrowserExecutable())); + connect(m_ui->m_cmbExternalEmailPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(changeDefaultEmailArguments(int))); + connect(m_ui->m_btnExternalEmailExecutable, SIGNAL(clicked()), this, SLOT(selectEmailExecutable())); connect(m_ui->m_txtMysqlUsername->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onMysqlUsernameChanged(QString))); connect(m_ui->m_txtMysqlHostname->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onMysqlHostnameChanged(QString))); connect(m_ui->m_txtMysqlPassword->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onMysqlPasswordChanged(QString))); @@ -205,7 +207,30 @@ void FormSettings::selectBrowserExecutable() { ); if (!executable_file.isEmpty()) { - m_ui->m_txtExternalBrowserExecutable->setText(executable_file); + m_ui->m_txtExternalBrowserExecutable->setText(QDir::toNativeSeparators(executable_file)); + } +} + +void FormSettings::changeDefaultEmailArguments(int index) { + if (index != 0) { + m_ui->m_txtExternalEmailArguments->setText(m_ui->m_cmbExternalEmailPreset->itemData(index).toString()); + } +} + +void FormSettings::selectEmailExecutable() { + QString executable_file = QFileDialog::getOpenFileName(this, + tr("Select e-mail executable"), + qApp->homeFolderPath(), + //: File filter for external e-mail selection dialog. + #if defined(Q_OS_LINUX) + tr("Executables (*)") + #else + tr("Executables (*.*)") + #endif + ); + + if (!executable_file.isEmpty()) { + m_ui->m_txtExternalEmailExecutable->setText(QDir::toNativeSeparators(executable_file)); } } @@ -378,6 +403,12 @@ void FormSettings::loadBrowser() { m_ui->m_checkAutoLoadImages->setChecked(WebFactory::instance()->autoloadImages()); m_ui->m_checkEnableJavascript->setChecked(WebFactory::instance()->javascriptEnabled()); m_ui->m_checkEnablePlugins->setChecked(WebFactory::instance()->pluginsEnabled()); + + // Load settings of e-mail. + m_ui->m_cmbExternalEmailPreset->addItem(tr("Mozilla Thunderbird"), "-compose \"subject='%1',body='%2'\""); + m_ui->m_txtExternalEmailExecutable->setText(settings->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString()); + m_ui->m_txtExternalEmailArguments->setText(settings->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString()); + m_ui->m_grpCustomExternalEmail->setChecked(settings->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()); } void FormSettings::saveBrowser() { @@ -390,6 +421,11 @@ void FormSettings::saveBrowser() { settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserExecutable, m_ui->m_txtExternalBrowserExecutable->text()); settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserArguments, m_ui->m_txtExternalBrowserArguments->text()); + // Save settings of e-mail. + settings->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text()); + settings->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text()); + settings->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked()); + WebFactory::instance()->switchImages(m_ui->m_checkAutoLoadImages->isChecked()); WebFactory::instance()->switchJavascript(m_ui->m_checkEnableJavascript->isChecked()); WebFactory::instance()->switchPlugins(m_ui->m_checkEnablePlugins->isChecked()); diff --git a/src/gui/formsettings.h b/src/gui/formsettings.h index 9c506fb79..810dd3cbe 100644 --- a/src/gui/formsettings.h +++ b/src/gui/formsettings.h @@ -91,6 +91,9 @@ class FormSettings : public QDialog { void changeDefaultBrowserArguments(int index); void selectBrowserExecutable(); + void changeDefaultEmailArguments(int index); + void selectEmailExecutable(); + void loadProxy(); void saveProxy(); void displayProxyPassword(int state); diff --git a/src/gui/formsettings.ui b/src/gui/formsettings.ui index 77136f4be..daaf27cb0 100644 --- a/src/gui/formsettings.ui +++ b/src/gui/formsettings.ui @@ -70,7 +70,7 @@ - Web browser & proxy + Web browser & e-mail & proxy @@ -88,7 +88,7 @@ - 0 + 5 @@ -414,8 +414,8 @@ MySQL backend will automatically use database with name "rssguard". Do 0 0 - 100 - 30 + 740 + 451 @@ -492,8 +492,8 @@ MySQL backend will automatically use database with name "rssguard". Do 0 0 - 208 - 238 + 734 + 425 @@ -898,15 +898,10 @@ MySQL backend will automatically use database with name "rssguard". Do Mouse gestures work with middle mouse button. Possible gestures are: -<ul> -<li>previous web page (drag mouse left),</li> -<li>next web page (drag mouse right),</li> -<li>reload current web page (drag mouse up),</li> -<li>open new web browser tab (drag mouse down).</li> -</ul> - - - Qt::RichText + • previous web page (drag mouse left), + • next web page (drag mouse right), + • reload current web page (drag mouse up), + • open new web browser tab (drag mouse down). 20 @@ -926,7 +921,7 @@ MySQL backend will automatically use database with name "rssguard". Do <html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html> - Custom external web browser + Use custom external web browser false @@ -993,7 +988,7 @@ MySQL backend will automatically use database with name "rssguard". Do - + Note that "%1" (without quotation marks) is placeholder for URL of selected message. @@ -1008,6 +1003,104 @@ MySQL backend will automatically use database with name "rssguard". Do + + + External e-mail client + + + + + + <html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html> + + + Use custom external e-mail client + + + false + + + true + + + + + + E-mail client executable + + + + + + + + + Executable file of e-mail client + + + + + + + ... + + + + + + + + + Executable parameters + + + + + + + Parameters to executable + + + + + + + Use sample arguments for + + + + + + + Select client + + + QComboBox::AdjustToContents + + + + Select client + + + + + + + + Placeholders: + • %1 - title of selected message, + • %2 - body of selected message. + + + 20 + + + + + + + + Proxy diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index 836d314ae..002a97ab8 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -161,6 +161,7 @@ void MessagesView::contextMenuEvent(QContextMenuEvent *event) { void MessagesView::initializeContextMenu() { m_contextMenu = new QMenu(tr("Context menu for messages"), this); m_contextMenu->addActions(QList() << + qApp->mainForm()->m_ui->m_actionSendMessageViaEmail << qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally << qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesInternally << qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally << @@ -299,6 +300,19 @@ void MessagesView::openSelectedMessagesInternally() { } } +void MessagesView::sendSelectedMessageViaEmail() { + if (selectionModel()->selectedRows().size() == 1) { + Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(selectionModel()->selectedRows().at(0)).row()); + + if (!WebFactory::instance()->sendMessageViaEmail(message)) { + MessageBox::show(this, + QMessageBox::Critical, + tr("Problem with starting external e-mail client"), + tr("External e-mail client could not be started.")); + } + } +} + void MessagesView::markSelectedMessagesRead() { setSelectedMessagesReadStatus(1); } diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 1e6acc7bd..2550927b1 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -66,6 +66,7 @@ class MessagesView : public QTreeView { void openSelectedSourceArticlesExternally(); void openSelectedSourceMessagesInternally(); void openSelectedMessagesInternally(); + void sendSelectedMessageViaEmail(); // Works with SELECTED messages only. void setSelectedMessagesReadStatus(int read); diff --git a/src/miscellaneous/settings.cpp b/src/miscellaneous/settings.cpp index 5df8b1747..132f823a3 100755 --- a/src/miscellaneous/settings.cpp +++ b/src/miscellaneous/settings.cpp @@ -238,6 +238,15 @@ DVALUE(char*) Browser::CustomExternalBrowserExecutableDef = ""; DKEY Browser::CustomExternalBrowserArguments = "external_browser_arguments"; DVALUE(char*) Browser::CustomExternalBrowserArgumentsDef = "%1"; +DKEY Browser::CustomExternalEmailEnabled = "custom_external_email"; +DVALUE(bool) Browser::CustomExternalEmailEnabledDef = false; + +DKEY Browser::CustomExternalEmailExecutable = "external_email_executable"; +DVALUE(char*) Browser::CustomExternalEmailExecutableDef = ""; + +DKEY Browser::CustomExternalEmailArguments = "external_email_arguments"; +DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = ""; + DKEY Browser::QueueTabs = "queue_tabs"; DVALUE(bool) Browser::QueueTabsDef = true; diff --git a/src/miscellaneous/settings.h b/src/miscellaneous/settings.h index 56eb7cbfb..d8f67d785 100755 --- a/src/miscellaneous/settings.h +++ b/src/miscellaneous/settings.h @@ -261,6 +261,15 @@ namespace Browser { KEY CustomExternalBrowserArguments; VALUE(char*) CustomExternalBrowserArgumentsDef; + KEY CustomExternalEmailEnabled; + VALUE(bool) CustomExternalEmailEnabledDef; + + KEY CustomExternalEmailExecutable; + VALUE(char*) CustomExternalEmailExecutableDef; + + KEY CustomExternalEmailArguments; + VALUE(char*) CustomExternalEmailArgumentsDef; + KEY QueueTabs; VALUE(bool) QueueTabsDef; } diff --git a/src/network-web/webfactory.cpp b/src/network-web/webfactory.cpp index 5deec9b1c..ecedd4afd 100755 --- a/src/network-web/webfactory.cpp +++ b/src/network-web/webfactory.cpp @@ -28,6 +28,24 @@ void WebFactory::loadState() { switchPlugins(settings->value(GROUP(Browser), SETTING(Browser::PluginsEnabled)).toBool(), false); } +bool WebFactory::sendMessageViaEmail(const Message &message) { + if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) { + QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString(); + QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString(); + + return QProcess::startDetached(browser, QStringList() << arguments.arg(message.m_title, + stripTags(message.m_contents))); + } + else { + // TODO: Check encoding when using mailto and add icon for the action. + + // Send it via mailto protocol. + // NOTE: http://en.wikipedia.org/wiki/Mailto + return QDesktopServices::openUrl(QString("mailto:?subject=%1&body=%2").arg(QString(QUrl::toPercentEncoding(message.m_title)), + QString(QUrl::toPercentEncoding(stripTags(message.m_contents))))); + } +} + bool WebFactory::openUrlInExternalBrowser(const QString &url) { if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) { QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString(); diff --git a/src/network-web/webfactory.h b/src/network-web/webfactory.h index 946e2d59a..85ff372c6 100644 --- a/src/network-web/webfactory.h +++ b/src/network-web/webfactory.h @@ -2,6 +2,9 @@ #define WEBFACTORY_H #include + +#include "core/messagesmodel.h" + #include #include @@ -38,6 +41,7 @@ class WebFactory : public QObject { public slots: // Opens given string URL in external browser. bool openUrlInExternalBrowser(const QString &url); + bool sendMessageViaEmail(const Message &message); // Switchers. void switchJavascript(bool enable, bool save_settings = true);