diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp index 6a3eb27aa..8ed317fa4 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp @@ -1,3 +1,6 @@ +#include +#include + // For license of this file, see /LICENSE.md. #include "gui/dialogs/formmessagefiltersmanager.h" @@ -12,7 +15,7 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const QList& accounts, QWidget* parent) : QDialog(parent), m_feedsModel(new AccountCheckModel(this)), m_rootItem(new RootItem()), - m_accounts(accounts), m_reader(reader) { + m_accounts(accounts), m_reader(reader), m_loadingFilter(false) { m_ui.setupUi(this); GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("view-list-details"))); @@ -30,6 +33,11 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q this, &FormMessageFiltersManager::loadFilter); connect(m_ui.m_btnAddNew, &QPushButton::clicked, this, &FormMessageFiltersManager::addNewFilter); + connect(m_ui.m_txtTitle, &QLineEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter); + connect(m_ui.m_txtScript, &QPlainTextEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter); + connect(m_ui.m_btnTest, &QPushButton::clicked, this, &FormMessageFiltersManager::testFilter); + + initializeTestingMessage(); } FormMessageFiltersManager::~FormMessageFiltersManager() { @@ -37,11 +45,11 @@ FormMessageFiltersManager::~FormMessageFiltersManager() { } MessageFilter* FormMessageFiltersManager::selectedFilter() const { - if (m_ui.m_listFilters->selectedItems().isEmpty()) { + if (m_ui.m_listFilters->currentItem() == nullptr) { return nullptr; } else { - return m_ui.m_listFilters->selectedItems().at(0)->data(Qt::ItemDataRole::UserRole).value(); + return m_ui.m_listFilters->currentItem()->data(Qt::ItemDataRole::UserRole).value(); } } @@ -60,6 +68,24 @@ void FormMessageFiltersManager::addNewFilter() { m_ui.m_listFilters->setCurrentRow(m_ui.m_listFilters->count() - 1); } +void FormMessageFiltersManager::saveSelectedFilter() { + if (m_loadingFilter) { + return; + } + + auto* fltr = selectedFilter(); + + if (fltr == nullptr || m_ui.m_txtTitle->text().isEmpty() || m_ui.m_txtScript->toPlainText().isEmpty()) { + return; + } + + fltr->setName(m_ui.m_txtTitle->text()); + fltr->setScript(m_ui.m_txtScript->toPlainText()); + m_ui.m_listFilters->currentItem()->setText(fltr->name()); + + m_reader->updateMessageFilter(fltr); +} + void FormMessageFiltersManager::loadFilter() { auto* filter = selectedFilter(); auto* acc = selectedAccount(); @@ -68,7 +94,32 @@ void FormMessageFiltersManager::loadFilter() { updateFeedAssignments(filter, acc); } +void FormMessageFiltersManager::testFilter() { + // Perform per-message filtering. + QJSEngine filter_engine; + QSqlDatabase database = qApp->database()->connection(metaObject()->className()); + + // Create JavaScript communication wrapper for the message. + MessageObject msg_obj(&database, QString::number(NO_PARENT_CATEGORY), NO_PARENT_CATEGORY); + + // Register the wrapper. + auto js_object = filter_engine.newQObject(&msg_obj); + + filter_engine.installExtensions(QJSEngine::Extension::ConsoleExtension); + filter_engine.globalObject().setProperty("msg", js_object); + + Message msg = testingMessage(); + + msg_obj.setMessage(&msg); + + auto* fltr = selectedFilter(); + FilteringAction decision = fltr->filterMessage(&filter_engine); + int aa = 5; +} + void FormMessageFiltersManager::showFilter(MessageFilter* filter) { + m_loadingFilter = true; + if (filter == nullptr) { m_ui.m_txtTitle->clear(); m_ui.m_txtScript->clear(); @@ -79,6 +130,33 @@ void FormMessageFiltersManager::showFilter(MessageFilter* filter) { m_ui.m_txtScript->setPlainText(filter->script()); m_ui.m_gbDetails->setEnabled(true); } + + m_loadingFilter = false; } void FormMessageFiltersManager::updateFeedAssignments(MessageFilter* filter, ServiceRoot* account) {} + +void FormMessageFiltersManager::initializeTestingMessage() { + m_ui.m_cbSampleImportant->setChecked(true); + m_ui.m_txtSampleUrl->setText(QSL("https://mynews.com/news/5")); + m_ui.m_txtSampleTitle->setText(QSL("Year of Linux Desktop")); + m_ui.m_txtSampleAuthor->setText(QSL("Napoleon Bonaparte")); + m_ui.m_txtSampleContents->setPlainText(QSL("

Browsers usually insert quotation marks around the q element.

" + "

WWF's goal is to: Build a future where people live in harmony " + "with nature.

")); + m_ui.m_txtSampleCreatedOn->setText(QString::number(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch())); +} + +Message FormMessageFiltersManager::testingMessage() const { + Message msg; + + msg.m_url = m_ui.m_txtSampleUrl->text(); + msg.m_title = m_ui.m_txtSampleTitle->text(); + msg.m_author = m_ui.m_txtSampleAuthor->text(); + msg.m_isRead = m_ui.m_cbSampleRead->isChecked(); + msg.m_isImportant = m_ui.m_cbSampleImportant->isChecked(); + msg.m_created = QDateTime::fromMSecsSinceEpoch(m_ui.m_txtSampleCreatedOn->text().toLongLong()); + msg.m_contents = m_ui.m_txtSampleContents->toPlainText(); + + return msg; +} diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.h b/src/librssguard/gui/dialogs/formmessagefiltersmanager.h index d8c4663ef..d80cd810a 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.h +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.h @@ -25,7 +25,9 @@ class FormMessageFiltersManager : public QDialog { private slots: void addNewFilter(); + void saveSelectedFilter(); void loadFilter(); + void testFilter(); // Display filter title/contents. void showFilter(MessageFilter* filter); @@ -33,12 +35,17 @@ class FormMessageFiltersManager : public QDialog { // Load feeds/categories of the account, place checkmarks where filter is used. void updateFeedAssignments(MessageFilter* filter, ServiceRoot* account); + private: + void initializeTestingMessage(); + Message testingMessage() const; + private: Ui::FormMessageFiltersManager m_ui; AccountCheckModel* m_feedsModel; RootItem* m_rootItem; QList m_accounts; FeedReader* m_reader; + bool m_loadingFilter; }; #endif // FORMMESSAGEFILTERSMANAGER_H diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui index 2f4ec1d78..f185faf8b 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui @@ -7,7 +7,7 @@ 0 0 900 - 625 + 644 @@ -117,6 +117,12 @@ Qt::Horizontal + + + 0 + 0 + + @@ -135,12 +141,6 @@ - - - 0 - 1 - - Your JavaScript-based message filtering logic @@ -155,14 +155,14 @@ - + Read - + Important @@ -189,12 +189,12 @@ Title - lineEdit + m_txtSampleTitle - + @@ -202,12 +202,12 @@ URL - lineEdit_2 + m_txtSampleUrl - + @@ -215,12 +215,12 @@ Author - lineEdit_3 + m_txtSampleAuthor - + @@ -228,12 +228,12 @@ Created on - lineEdit_4 + m_txtSampleCreatedOn - + @@ -241,12 +241,12 @@ Contents - plainTextEdit + m_txtSampleContents - + @@ -258,7 +258,7 @@ - &Test + &Test the script @@ -338,13 +338,13 @@ m_txtScript m_btnTest m_btnDetailedHelp - checkBox - checkBox_2 - lineEdit - lineEdit_2 - lineEdit_3 - lineEdit_4 - plainTextEdit + m_cbSampleRead + m_cbSampleImportant + m_txtSampleTitle + m_txtSampleUrl + m_txtSampleAuthor + m_txtSampleCreatedOn + m_txtSampleContents m_txtErrors diff --git a/src/librssguard/miscellaneous/feedreader.cpp b/src/librssguard/miscellaneous/feedreader.cpp index 4da905c7f..aff7fcd70 100644 --- a/src/librssguard/miscellaneous/feedreader.cpp +++ b/src/librssguard/miscellaneous/feedreader.cpp @@ -159,9 +159,14 @@ MessageFilter* FeedReader::addMessageFilter(const QString& title, const QString& // TODO: Save into database, then return. + m_messageFilters.append(fltr); return fltr; } +void FeedReader::updateMessageFilter(MessageFilter* filter) { + // TODO: Filter's name or script is changed, save to database. +} + void FeedReader::updateAllFeeds() { updateFeeds(m_feedsModel->rootItem()->getSubTreeFeeds()); } diff --git a/src/librssguard/miscellaneous/feedreader.h b/src/librssguard/miscellaneous/feedreader.h index 2005efd08..4bc375a90 100644 --- a/src/librssguard/miscellaneous/feedreader.h +++ b/src/librssguard/miscellaneous/feedreader.h @@ -55,6 +55,7 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject { void loadSavedMessageFilters(); QList messageFilters() const; MessageFilter* addMessageFilter(const QString& title, const QString& script); + void updateMessageFilter(MessageFilter* filter); public slots: void updateAllFeeds();