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);