Now able to add filters too.
This commit is contained in:
parent
09fdf72d26
commit
2e04963acc
@ -68,7 +68,7 @@ class RSSGUARD_DLLSPEC FeedsModel : public QAbstractItemModel {
|
|||||||
QList<Message> messagesForItem(RootItem* item) const;
|
QList<Message> messagesForItem(RootItem* item) const;
|
||||||
|
|
||||||
// Returns ALL RECURSIVE CHILD feeds contained within single index.
|
// Returns ALL RECURSIVE CHILD feeds contained within single index.
|
||||||
QList<Feed*> feedsForIndex(const QModelIndex& index) const;
|
QList<Feed*> feedsForIndex(const QModelIndex& index = QModelIndex()) const;
|
||||||
|
|
||||||
// Returns feed/category which lies at the specified index or
|
// Returns feed/category which lies at the specified index or
|
||||||
// root item if index is invalid.
|
// root item if index is invalid.
|
||||||
@ -156,7 +156,6 @@ class RSSGUARD_DLLSPEC FeedsModel : public QAbstractItemModel {
|
|||||||
private:
|
private:
|
||||||
RootItem* m_rootItem;
|
RootItem* m_rootItem;
|
||||||
int m_itemHeight;
|
int m_itemHeight;
|
||||||
|
|
||||||
QList<QString> m_headerData;
|
QList<QString> m_headerData;
|
||||||
QList<QString> m_tooltipData;
|
QList<QString> m_tooltipData;
|
||||||
QIcon m_countsIcon;
|
QIcon m_countsIcon;
|
||||||
|
@ -81,3 +81,7 @@ QString MessageFilter::script() const {
|
|||||||
void MessageFilter::setScript(const QString& script) {
|
void MessageFilter::setScript(const QString& script) {
|
||||||
m_script = script;
|
m_script = script;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessageFilter::setId(int id) {
|
||||||
|
m_id = id;
|
||||||
|
}
|
||||||
|
@ -19,6 +19,7 @@ class MessageFilter : public QObject {
|
|||||||
FilteringAction filterMessage(QJSEngine* engine);
|
FilteringAction filterMessage(QJSEngine* engine);
|
||||||
|
|
||||||
int id() const;
|
int id() const;
|
||||||
|
void setId(int id);
|
||||||
|
|
||||||
QString name() const;
|
QString name() const;
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
|
@ -42,6 +42,8 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q
|
|||||||
this, &FormMessageFiltersManager::loadFilter);
|
this, &FormMessageFiltersManager::loadFilter);
|
||||||
connect(m_ui.m_btnAddNew, &QPushButton::clicked,
|
connect(m_ui.m_btnAddNew, &QPushButton::clicked,
|
||||||
this, &FormMessageFiltersManager::addNewFilter);
|
this, &FormMessageFiltersManager::addNewFilter);
|
||||||
|
connect(m_ui.m_btnRemoveSelected, &QPushButton::clicked,
|
||||||
|
this, &FormMessageFiltersManager::removeSelectedFilter);
|
||||||
connect(m_ui.m_txtTitle, &QLineEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter);
|
connect(m_ui.m_txtTitle, &QLineEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter);
|
||||||
connect(m_ui.m_txtScript, &QPlainTextEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter);
|
connect(m_ui.m_txtScript, &QPlainTextEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter);
|
||||||
connect(m_ui.m_btnTest, &QPushButton::clicked, this, &FormMessageFiltersManager::testFilter);
|
connect(m_ui.m_btnTest, &QPushButton::clicked, this, &FormMessageFiltersManager::testFilter);
|
||||||
@ -79,6 +81,17 @@ ServiceRoot* FormMessageFiltersManager::selectedAccount() const {
|
|||||||
return dat.isNull() ? nullptr : dat.value<ServiceRoot*>();
|
return dat.isNull() ? nullptr : dat.value<ServiceRoot*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FormMessageFiltersManager::removeSelectedFilter() {
|
||||||
|
auto* fltr = selectedFilter();
|
||||||
|
|
||||||
|
if (fltr == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_reader->removeMessageFilter(fltr);
|
||||||
|
delete m_ui.m_listFilters->currentItem();
|
||||||
|
}
|
||||||
|
|
||||||
void FormMessageFiltersManager::loadFilters() {
|
void FormMessageFiltersManager::loadFilters() {
|
||||||
for (auto* fltr : m_reader->messageFilters()) {
|
for (auto* fltr : m_reader->messageFilters()) {
|
||||||
auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters);
|
auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters);
|
||||||
@ -88,14 +101,20 @@ void FormMessageFiltersManager::loadFilters() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FormMessageFiltersManager::addNewFilter() {
|
void FormMessageFiltersManager::addNewFilter() {
|
||||||
auto* fltr = m_reader->addMessageFilter(
|
try {
|
||||||
tr("New message filter"),
|
auto* fltr = m_reader->addMessageFilter(
|
||||||
QSL("function filterMessage() { return 1; }"));
|
tr("New message filter"),
|
||||||
auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters);
|
QSL("function filterMessage() { return 1; }"));
|
||||||
|
auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters);
|
||||||
|
|
||||||
it->setData(Qt::ItemDataRole::UserRole, QVariant::fromValue<MessageFilter*>(fltr));
|
it->setData(Qt::ItemDataRole::UserRole, QVariant::fromValue<MessageFilter*>(fltr));
|
||||||
|
|
||||||
m_ui.m_listFilters->setCurrentRow(m_ui.m_listFilters->count() - 1);
|
m_ui.m_listFilters->setCurrentRow(m_ui.m_listFilters->count() - 1);
|
||||||
|
}
|
||||||
|
catch (const ApplicationException& ex) {
|
||||||
|
MessageBox::show(this, QMessageBox::Icon::Critical, tr("Error"),
|
||||||
|
tr("Cannot save new filter, error: ''.").arg(ex.message()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMessageFiltersManager::saveSelectedFilter() {
|
void FormMessageFiltersManager::saveSelectedFilter() {
|
||||||
|
@ -24,6 +24,7 @@ class FormMessageFiltersManager : public QDialog {
|
|||||||
ServiceRoot* selectedAccount() const;
|
ServiceRoot* selectedAccount() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void removeSelectedFilter();
|
||||||
void addNewFilter();
|
void addNewFilter();
|
||||||
void saveSelectedFilter();
|
void saveSelectedFilter();
|
||||||
void loadFilter();
|
void loadFilter();
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "miscellaneous/databasequeries.h"
|
#include "miscellaneous/databasequeries.h"
|
||||||
|
|
||||||
|
#include "exceptions/applicationexception.h"
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
@ -26,6 +27,7 @@
|
|||||||
#include "services/tt-rss/ttrssfeed.h"
|
#include "services/tt-rss/ttrssfeed.h"
|
||||||
#include "services/tt-rss/ttrssserviceroot.h"
|
#include "services/tt-rss/ttrssserviceroot.h"
|
||||||
|
|
||||||
|
#include <QSqlDriver>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
|
||||||
@ -1396,6 +1398,73 @@ bool DatabaseQueries::editBaseFeed(const QSqlDatabase& db, int feed_id, Feed::Au
|
|||||||
return q.exec();
|
return q.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MessageFilter* DatabaseQueries::addMessageFilter(const QSqlDatabase& db, const QString& title,
|
||||||
|
const QString& script) {
|
||||||
|
if (!db.driver()->hasFeature(QSqlDriver::DriverFeature::LastInsertId)) {
|
||||||
|
throw ApplicationException(QObject::tr("Cannot insert message filter, because current database cannot return last inserted row ID."));
|
||||||
|
}
|
||||||
|
|
||||||
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
q.prepare("INSERT INTO MessageFilters (name, script) VALUES(:name, :script);");
|
||||||
|
|
||||||
|
q.bindValue(QSL(":name"), title);
|
||||||
|
q.bindValue(QSL(":script"), script);
|
||||||
|
q.setForwardOnly(true);
|
||||||
|
|
||||||
|
if (q.exec()) {
|
||||||
|
auto* fltr = new MessageFilter(q.lastInsertId().toInt());
|
||||||
|
|
||||||
|
fltr->setName(title);
|
||||||
|
fltr->setScript(script);
|
||||||
|
|
||||||
|
return fltr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw ApplicationException(q.lastError().text());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseQueries::removeMessageFilter(const QSqlDatabase& db, int filter_id, bool* ok) {
|
||||||
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
q.prepare("DELETE FROM MessageFilters WHERE id = :id;");
|
||||||
|
|
||||||
|
q.bindValue(QSL(":id"), filter_id);
|
||||||
|
q.setForwardOnly(true);
|
||||||
|
|
||||||
|
if (q.exec()) {
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseQueries::removeMessageFilterAssignments(const QSqlDatabase& db, int filter_id, bool* ok) {
|
||||||
|
QSqlQuery q(db);
|
||||||
|
|
||||||
|
q.prepare("DELETE FROM MessageFiltersInFeeds WHERE filter = :filter;");
|
||||||
|
|
||||||
|
q.bindValue(QSL(":filter"), filter_id);
|
||||||
|
q.setForwardOnly(true);
|
||||||
|
|
||||||
|
if (q.exec()) {
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (ok != nullptr) {
|
||||||
|
*ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QList<MessageFilter*> DatabaseQueries::getMessageFilters(const QSqlDatabase& db, bool* ok) {
|
QList<MessageFilter*> DatabaseQueries::getMessageFilters(const QSqlDatabase& db, bool* ok) {
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
QList<MessageFilter*> filters;
|
QList<MessageFilter*> filters;
|
||||||
|
@ -87,6 +87,9 @@ class DatabaseQueries {
|
|||||||
int account_id, bool* ok = nullptr);
|
int account_id, bool* ok = nullptr);
|
||||||
|
|
||||||
// Message filters operators.
|
// Message filters operators.
|
||||||
|
static MessageFilter* addMessageFilter(const QSqlDatabase& db, const QString& title, const QString& script);
|
||||||
|
static void removeMessageFilter(const QSqlDatabase& db, int filter_id, bool* ok = nullptr);
|
||||||
|
static void removeMessageFilterAssignments(const QSqlDatabase& db, int filter_id, bool* ok = nullptr);
|
||||||
static QList<MessageFilter*> getMessageFilters(const QSqlDatabase& db, bool* ok = nullptr);
|
static QList<MessageFilter*> getMessageFilters(const QSqlDatabase& db, bool* ok = nullptr);
|
||||||
static QMultiMap<QString, int> messageFiltersInFeeds(const QSqlDatabase& db, int account_id, bool* ok = nullptr);
|
static QMultiMap<QString, int> messageFiltersInFeeds(const QSqlDatabase& db, int account_id, bool* ok = nullptr);
|
||||||
static void assignMessageFilterToFeed(const QSqlDatabase& db, const QString& feed_custom_id, int filter_id,
|
static void assignMessageFilterToFeed(const QSqlDatabase& db, const QString& feed_custom_id, int filter_id,
|
||||||
|
@ -150,17 +150,30 @@ void FeedReader::loadSavedMessageFilters() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MessageFilter* FeedReader::addMessageFilter(const QString& title, const QString& script) {
|
MessageFilter* FeedReader::addMessageFilter(const QString& title, const QString& script) {
|
||||||
auto* fltr = new MessageFilter(12, this);
|
auto* fltr = DatabaseQueries::addMessageFilter(qApp->database()->connection(metaObject()->className()), title, script);
|
||||||
|
|
||||||
fltr->setName(title);
|
|
||||||
fltr->setScript(script);
|
|
||||||
|
|
||||||
// TODO: Save into database, then return.
|
|
||||||
|
|
||||||
m_messageFilters.append(fltr);
|
m_messageFilters.append(fltr);
|
||||||
return fltr;
|
return fltr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FeedReader::removeMessageFilter(MessageFilter* filter) {
|
||||||
|
m_messageFilters.removeAll(filter);
|
||||||
|
|
||||||
|
// Now, remove all references from all feeds.
|
||||||
|
auto all_feeds = m_feedsModel->feedsForIndex();
|
||||||
|
|
||||||
|
for (auto* feed : all_feeds) {
|
||||||
|
feed->removeMessageFilter(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove from DB.
|
||||||
|
DatabaseQueries::removeMessageFilterAssignments(qApp->database()->connection(metaObject()->className()), filter->id());
|
||||||
|
DatabaseQueries::removeMessageFilter(qApp->database()->connection(metaObject()->className()), filter->id());
|
||||||
|
|
||||||
|
// Free from memory as last step.
|
||||||
|
filter->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
void FeedReader::updateMessageFilter(MessageFilter* filter) {
|
void FeedReader::updateMessageFilter(MessageFilter* filter) {
|
||||||
DatabaseQueries::updateMessageFilter(qApp->database()->connection(metaObject()->className()), filter);
|
DatabaseQueries::updateMessageFilter(qApp->database()->connection(metaObject()->className()), filter);
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,7 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject {
|
|||||||
void loadSavedMessageFilters();
|
void loadSavedMessageFilters();
|
||||||
QList<MessageFilter*> messageFilters() const;
|
QList<MessageFilter*> messageFilters() const;
|
||||||
MessageFilter* addMessageFilter(const QString& title, const QString& script);
|
MessageFilter* addMessageFilter(const QString& title, const QString& script);
|
||||||
|
void removeMessageFilter(MessageFilter* filter);
|
||||||
void updateMessageFilter(MessageFilter* filter);
|
void updateMessageFilter(MessageFilter* filter);
|
||||||
void assignMessageFilterToFeed(Feed* feed, MessageFilter* filter);
|
void assignMessageFilterToFeed(Feed* feed, MessageFilter* filter);
|
||||||
void removeMessageFilterToFeedAssignment(Feed* feed, MessageFilter* filter);
|
void removeMessageFilterToFeedAssignment(Feed* feed, MessageFilter* filter);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user