From 34fb27321249ac6fa203be75718cb41d634f391b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 14 Dec 2020 08:50:30 +0100 Subject: [PATCH] Fixed #278. --- .../core/messagesforfiltersmodel.cpp | 14 +++++- .../gui/dialogs/formmessagefiltersmanager.cpp | 50 +++++++++++++++++-- .../gui/dialogs/formmessagefiltersmanager.h | 4 +- 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/librssguard/core/messagesforfiltersmodel.cpp b/src/librssguard/core/messagesforfiltersmodel.cpp index 3d038a2a5..6791aeb15 100755 --- a/src/librssguard/core/messagesforfiltersmodel.cpp +++ b/src/librssguard/core/messagesforfiltersmodel.cpp @@ -131,9 +131,19 @@ void MessagesForFiltersModel::testFilter(MessageFilter* filter, QJSEngine* engin } Message* MessagesForFiltersModel::messageForRow(int row) { - return &m_messages[row]; + if (row >= 0 && row < m_messages.size()) { + return &m_messages[row]; + } + else { + return nullptr; + } } Message MessagesForFiltersModel::messageForRow(int row) const { - return m_messages[row]; + if (row >= 0 && row < m_messages.size()) { + return m_messages[row]; + } + else { + return Message(); + } } diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp index c51ab486d..ef7f2cf78 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp @@ -45,6 +45,7 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q m_ui.m_btnRunOnMessages->setIcon(qApp->icons()->fromTheme(QSL("media-playback-start"))); m_ui.m_btnDetailedHelp->setIcon(qApp->icons()->fromTheme(QSL("help-contents"))); m_ui.m_txtScript->setFont(QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont)); + m_ui.m_treeExistingMessages->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_ISREAD, QHeaderView::ResizeMode::ResizeToContents); m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_ISIMPORTANT, QHeaderView::ResizeMode::ResizeToContents); @@ -59,8 +60,9 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q }); connect(m_ui.m_listFilters, &QListWidget::currentRowChanged, this, &FormMessageFiltersManager::loadFilter); - connect(m_ui.m_btnAddNew, &QPushButton::clicked, - this, &FormMessageFiltersManager::addNewFilter); + connect(m_ui.m_btnAddNew, &QPushButton::clicked, this, [this]() { + addNewFilter(); + }); connect(m_ui.m_btnRemoveSelected, &QPushButton::clicked, this, &FormMessageFiltersManager::removeSelectedFilter); connect(m_ui.m_txtTitle, &QLineEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter); @@ -78,6 +80,8 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q this, &FormMessageFiltersManager::displayMessagesOfFeed); connect(m_ui.m_btnRunOnMessages, &QPushButton::clicked, this, &FormMessageFiltersManager::processCheckedFeeds); + connect(m_ui.m_treeExistingMessages, &QTreeView::customContextMenuRequested, + this, &FormMessageFiltersManager::showMessageContextMenu); initializeTestingMessage(); loadFilters(); @@ -104,6 +108,42 @@ ServiceRoot* FormMessageFiltersManager::selectedAccount() const { return dat.isNull() ? nullptr : dat.value(); } +void FormMessageFiltersManager::filterMessagesLikeThis(const Message& msg) { + QString filter_script = QSL("function filterMessage() {\n" + " // Adjust the condition to suit your needs.\n" + " var is_message_same =\n" + " msg.isRead == %1 &&\n" + " msg.isImportant == %2 &&\n" + " msg.title == '%3' &&\n" + " msg.url == '%4';\n" + "\n" + " if (is_message_same) {\n" + " return MessageObject.Accept;\n" + " }\n" + " else {\n" + " return MessageObject.Ignore;\n" + " }\n" + "}").arg(QString::number(int(msg.m_isRead)), + QString::number(int(msg.m_isImportant)), + msg.m_title, + msg.m_url); + + addNewFilter(filter_script); +} + +void FormMessageFiltersManager::showMessageContextMenu(const QPoint& pos) { + Message* msg = m_msgModel->messageForRow(m_ui.m_treeExistingMessages->indexAt(pos).row()); + + if (msg != nullptr) { + QMenu menu(tr("Context menu"), m_ui.m_treeExistingMessages); + + menu.addAction(tr("Filter messages like this"), this, [=]() { + filterMessagesLikeThis(*msg); + }); + menu.exec(m_ui.m_treeExistingMessages->mapToGlobal(pos)); + } +} + void FormMessageFiltersManager::removeSelectedFilter() { auto* fltr = selectedFilter(); @@ -123,11 +163,13 @@ void FormMessageFiltersManager::loadFilters() { } } -void FormMessageFiltersManager::addNewFilter() { +void FormMessageFiltersManager::addNewFilter(const QString& filter_script) { try { auto* fltr = m_reader->addMessageFilter( tr("New message filter"), - QSL("function filterMessage() { return MessageObject.Accept; }")); + filter_script.isEmpty() + ? QSL("function filterMessage() { return MessageObject.Accept; }") + : filter_script); auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters); it->setData(Qt::ItemDataRole::UserRole, QVariant::fromValue(fltr)); diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.h b/src/librssguard/gui/dialogs/formmessagefiltersmanager.h index 367da5f93..ef9f95793 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.h +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.h @@ -25,8 +25,10 @@ class FormMessageFiltersManager : public QDialog { ServiceRoot* selectedAccount() const; private slots: + void filterMessagesLikeThis(const Message& msg); + void showMessageContextMenu(const QPoint& pos); void removeSelectedFilter(); - void addNewFilter(); + void addNewFilter(const QString& filter_script = QString()); void saveSelectedFilter(); void loadFilter(); void loadFilters();