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;