Work on filters gui.

This commit is contained in:
Martin Rotter 2020-07-02 10:14:51 +02:00
parent 5d8fd25173
commit e0415a8060
5 changed files with 121 additions and 30 deletions

View File

@ -1,3 +1,6 @@
#include <QDateTime>
#include <QJSEngine>
// For license of this file, see <project-root-folder>/LICENSE.md.
#include "gui/dialogs/formmessagefiltersmanager.h"
@ -12,7 +15,7 @@
FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const QList<ServiceRoot*>& 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<MessageFilter*>();
return m_ui.m_listFilters->currentItem()->data(Qt::ItemDataRole::UserRole).value<MessageFilter*>();
}
}
@ -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("<p>Browsers usually insert quotation marks around the q element.</p>"
"<p>WWF's goal is to: <q>Build a future where people live in harmony "
"with nature.</q></p>"));
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;
}

View File

@ -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<ServiceRoot*> m_accounts;
FeedReader* m_reader;
bool m_loadingFilter;
};
#endif // FORMMESSAGEFILTERSMANAGER_H

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>900</width>
<height>625</height>
<height>644</height>
</rect>
</property>
<property name="windowTitle">
@ -117,6 +117,12 @@
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
@ -135,12 +141,6 @@
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPlainTextEdit" name="m_txtScript">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string>Your JavaScript-based message filtering logic</string>
</property>
@ -155,14 +155,14 @@
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="checkBox">
<widget class="QCheckBox" name="m_cbSampleRead">
<property name="text">
<string>Read</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_2">
<widget class="QCheckBox" name="m_cbSampleImportant">
<property name="text">
<string>Important</string>
</property>
@ -189,12 +189,12 @@
<string>Title</string>
</property>
<property name="buddy">
<cstring>lineEdit</cstring>
<cstring>m_txtSampleTitle</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineEdit"/>
<widget class="QLineEdit" name="m_txtSampleTitle"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
@ -202,12 +202,12 @@
<string>URL</string>
</property>
<property name="buddy">
<cstring>lineEdit_2</cstring>
<cstring>m_txtSampleUrl</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_2"/>
<widget class="QLineEdit" name="m_txtSampleUrl"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
@ -215,12 +215,12 @@
<string>Author</string>
</property>
<property name="buddy">
<cstring>lineEdit_3</cstring>
<cstring>m_txtSampleAuthor</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_3"/>
<widget class="QLineEdit" name="m_txtSampleAuthor"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
@ -228,12 +228,12 @@
<string>Created on</string>
</property>
<property name="buddy">
<cstring>lineEdit_4</cstring>
<cstring>m_txtSampleCreatedOn</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_4"/>
<widget class="QLineEdit" name="m_txtSampleCreatedOn"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
@ -241,12 +241,12 @@
<string>Contents</string>
</property>
<property name="buddy">
<cstring>plainTextEdit</cstring>
<cstring>m_txtSampleContents</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPlainTextEdit" name="plainTextEdit"/>
<widget class="QPlainTextEdit" name="m_txtSampleContents"/>
</item>
</layout>
</widget>
@ -258,7 +258,7 @@
<item>
<widget class="QPushButton" name="m_btnTest">
<property name="text">
<string>&amp;Test</string>
<string>&amp;Test the script</string>
</property>
</widget>
</item>
@ -338,13 +338,13 @@
<tabstop>m_txtScript</tabstop>
<tabstop>m_btnTest</tabstop>
<tabstop>m_btnDetailedHelp</tabstop>
<tabstop>checkBox</tabstop>
<tabstop>checkBox_2</tabstop>
<tabstop>lineEdit</tabstop>
<tabstop>lineEdit_2</tabstop>
<tabstop>lineEdit_3</tabstop>
<tabstop>lineEdit_4</tabstop>
<tabstop>plainTextEdit</tabstop>
<tabstop>m_cbSampleRead</tabstop>
<tabstop>m_cbSampleImportant</tabstop>
<tabstop>m_txtSampleTitle</tabstop>
<tabstop>m_txtSampleUrl</tabstop>
<tabstop>m_txtSampleAuthor</tabstop>
<tabstop>m_txtSampleCreatedOn</tabstop>
<tabstop>m_txtSampleContents</tabstop>
<tabstop>m_txtErrors</tabstop>
</tabstops>
<resources/>

View File

@ -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());
}

View File

@ -55,6 +55,7 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject {
void loadSavedMessageFilters();
QList<MessageFilter*> messageFilters() const;
MessageFilter* addMessageFilter(const QString& title, const QString& script);
void updateMessageFilter(MessageFilter* filter);
public slots:
void updateAllFeeds();