diff --git a/resources/icons.qrc b/resources/icons.qrc
index 4c1509a08..89037330a 100644
--- a/resources/icons.qrc
+++ b/resources/icons.qrc
@@ -44,6 +44,7 @@
./graphics/Faenza/actions/64/tab-new.png
./graphics/Faenza/actions/64/up.png
./graphics/Faenza/actions/64/view-fullscreen.png
+ ./graphics/Faenza/actions/64/view-list-details.png
./graphics/Faenza/actions/64/view-refresh.png
./graphics/Faenza/actions/64/view-restore.png
./graphics/Faenza/actions/64/window-close.png
diff --git a/src/librssguard/core/feeddownloader.cpp b/src/librssguard/core/feeddownloader.cpp
index 769baba9b..25a8d2dc8 100644
--- a/src/librssguard/core/feeddownloader.cpp
+++ b/src/librssguard/core/feeddownloader.cpp
@@ -120,6 +120,7 @@ void FeedDownloader::updateOneFeed(Feed* feed) {
// Register the wrapper.
auto js_object = filter_engine.newQObject(&msg_obj);
+ filter_engine.installExtensions(QJSEngine::Extension::ConsoleExtension);
filter_engine.globalObject().setProperty("msg", js_object);
qDebug().nospace() << "Setting up JS evaluation took " << tmr.nsecsElapsed() / 1000 << " microseconds.";
diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h
index e05c8a557..8d6a1b3b4 100755
--- a/src/librssguard/definitions/definitions.h
+++ b/src/librssguard/definitions/definitions.h
@@ -32,6 +32,7 @@
#define RELEASES_LIST "https://api.github.com/repos/martinrotter/rssguard/releases"
#define DEFAULT_LOCALE "en"
#define DEFAULT_FEED_ENCODING "UTF-8"
+#define MSG_FILTERING_HELP "https://github.com/martinrotter/rssguard/wiki/Message-filtering"
#define DEFAULT_FEED_TYPE "RSS"
#define URL_REGEXP "^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$"
#define TEXT_TITLE_LIMIT 30
diff --git a/src/librssguard/gui/dialogs/formdatabasecleanup.cpp b/src/librssguard/gui/dialogs/formdatabasecleanup.cpp
index 75175f4ad..1707188df 100644
--- a/src/librssguard/gui/dialogs/formdatabasecleanup.cpp
+++ b/src/librssguard/gui/dialogs/formdatabasecleanup.cpp
@@ -2,6 +2,7 @@
#include "gui/dialogs/formdatabasecleanup.h"
+#include "gui/guiutilities.h"
#include "miscellaneous/application.h"
#include "miscellaneous/databasefactory.h"
#include "miscellaneous/iconfactory.h"
@@ -13,9 +14,7 @@
FormDatabaseCleanup::FormDatabaseCleanup(QWidget* parent) : QDialog(parent), m_ui(new Ui::FormDatabaseCleanup), m_cleaner(nullptr) {
m_ui->setupUi(this);
- // Set flags and attributes.
- setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
- setWindowIcon(qApp->icons()->fromTheme(QSL("edit-clear")));
+ GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("edit-clear")));
connect(m_ui->m_spinDays, static_cast(&QSpinBox::valueChanged), this, &FormDatabaseCleanup::updateDaysSuffix);
connect(m_ui->m_btnBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &FormDatabaseCleanup::startPurging);
diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp
index ee327107b..9d3a2cbc1 100755
--- a/src/librssguard/gui/dialogs/formmain.cpp
+++ b/src/librssguard/gui/dialogs/formmain.cpp
@@ -184,6 +184,7 @@ QList FormMain::allActions() const {
actions << m_ui->m_actionSelectPreviousMessage;
actions << m_ui->m_actionSelectNextUnreadMessage;
actions << m_ui->m_actionExpandCollapseItem;
+ actions << m_ui->m_actionMessageFilters;
#if defined(USE_WEBENGINE)
actions << m_ui->m_actionTabNewWebBrowser;
@@ -525,6 +526,7 @@ void FormMain::setupIcons() {
m_ui->m_actionServiceDelete->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
m_ui->m_actionAddFeedIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("application-rss+xml")));
m_ui->m_actionAddCategoryIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder")));
+ m_ui->m_actionMessageFilters->setIcon(icon_theme_factory->fromTheme(QSL("view-list-details")));
// Tabs & web browser.
m_ui->m_actionTabNewWebBrowser->setIcon(icon_theme_factory->fromTheme(QSL("tab-new")));
@@ -753,6 +755,8 @@ void FormMain::createConnections() {
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(), &FeedsModel::restoreAllBins);
connect(m_ui->m_actionEmptyAllRecycleBins, &QAction::triggered,
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(), &FeedsModel::emptyAllBins);
+ connect(m_ui->m_actionMessageFilters, &QAction::triggered,
+ qApp->feedReader(), &FeedReader::showMessageFiltersManager);
}
void FormMain::backupDatabaseSettings() {
diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
index 9cdedfa6e..3bc77ed36 100644
--- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
+++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp
@@ -2,6 +2,21 @@
#include "gui/dialogs/formmessagefiltersmanager.h"
-FormMessageFiltersManager::FormMessageFiltersManager(QWidget *parent) : QDialog(parent) {
+#include "gui/guiutilities.h"
+#include "miscellaneous/application.h"
+#include "miscellaneous/iconfactory.h"
+#include "network-web/webfactory.h"
+
+FormMessageFiltersManager::FormMessageFiltersManager(QWidget* parent) : QDialog(parent) {
m_ui.setupUi(this);
+
+ GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("view-list-details")));
+
+ m_ui.m_btnAddNew->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
+ m_ui.m_btnRemoveSelected->setIcon(qApp->icons()->fromTheme(QSL("list-remove")));
+ m_ui.m_txtScript->setFont(QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont));
+
+ connect(m_ui.m_btnDetailedHelp, &QPushButton::clicked, this, []() {
+ qApp->web()->openUrlInExternalBrowser(MSG_FILTERING_HELP);
+ });
}
diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
index d26023244..739f18d1f 100644
--- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
+++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui
@@ -1,42 +1,206 @@
+
-
-
-
FormMessageFiltersManager
0
0
- 400
- 300
+ 737
+ 592
- Dialog
+ Message filters
-
-
-
- 30
- 240
- 341
- 32
-
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
+
+ -
+
+
+ -
+
+
+
+ 0
+ 1
+
+
+
+ Message filter details
+
+
+
-
+
+
+ Title
+
+
+ m_txtTitle
+
+
+
+ -
+
+
-
+
+
+ Title of message filter
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+ JavaScript code
+
+
+ m_txtScript
+
+
+
+ -
+
+
+ Errors
+
+
+ m_txtErrors
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 1
+
+
+
+ false
+
+
+
+ -
+
+
-
+
+
+ &Detailed help
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 2
+
+
+
+ Your JavaScript-based message filtering logic
+
+
+
+
+
+
+ -
+
+
-
+
+
+ -
+
+
+ Remove selected
+
+
+
+ -
+
+
+ Add new
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Close
+
+
+ false
+
+
+
+
-
+
+ m_treeFilters
+ m_treeFeeds
+ m_btnAddNew
+ m_btnRemoveSelected
+ m_txtTitle
+ m_txtScript
+ m_txtErrors
+
- buttonBox
+ m_buttonBox
accepted()
FormMessageFiltersManager
accept()
@@ -52,7 +216,7 @@
- buttonBox
+ m_buttonBox
rejected()
FormMessageFiltersManager
reject()
diff --git a/src/librssguard/gui/timespinbox.cpp b/src/librssguard/gui/timespinbox.cpp
index 0fcaca078..77e502ebb 100644
--- a/src/librssguard/gui/timespinbox.cpp
+++ b/src/librssguard/gui/timespinbox.cpp
@@ -59,7 +59,7 @@ QString TimeSpinBox::textFromValue(double val) const {
int seconds_val = int(val);
int minutes_total = seconds_val / 60;
int seconds_total = seconds_val - (minutes_total * 60);
- QString seconds = tr("%n seconds(s)", "", seconds_total);
+ QString seconds = tr("%n second(s)", "", seconds_total);
QString minutes = tr("%n minute(s)", "", minutes_total);
return minutes + tr(" and ") + seconds;