Work on filters dialog.

This commit is contained in:
Martin Rotter 2020-07-01 10:13:44 +02:00
parent 05025f7a04
commit 5d8fd25173
15 changed files with 424 additions and 178 deletions

View File

@ -25,6 +25,7 @@
<file>./graphics/Faenza/actions/64/go-up.png</file>
<file>./graphics/Faenza/actions/64/gtk-edit.png</file>
<file>./graphics/Faenza/actions/64/help-about.png</file>
<file>./graphics/Faenza/actions/64/help-contents.png</file>
<file>./graphics/Faenza/actions/64/insert-object.png</file>
<file>./graphics/Faenza/actions/64/list-add.png</file>
<file>./graphics/Faenza/actions/64/list-remove.png</file>
@ -37,6 +38,7 @@
<file>./graphics/Faenza/actions/64/mail-message-new.png</file>
<file>./graphics/Faenza/actions/64/mail-send.png</file>
<file>./graphics/Faenza/actions/64/mail-sent.png</file>
<file>./graphics/Faenza/actions/64/media-playback-start.png</file>
<file>./graphics/Faenza/actions/64/process-stop.png</file>
<file>./graphics/Faenza/actions/64/reload.png</file>
<file>./graphics/Faenza/actions/64/system-search.png</file>

View File

@ -14,7 +14,7 @@ class MessageFilter : public QObject {
Q_OBJECT
public:
explicit MessageFilter(int id, QObject* parent = nullptr);
explicit MessageFilter(int id = -1, QObject* parent = nullptr);
FilteringAction filterMessage(QJSEngine* engine);

View File

@ -2,21 +2,83 @@
#include "gui/dialogs/formmessagefiltersmanager.h"
#include "core/messagefilter.h"
#include "gui/guiutilities.h"
#include "miscellaneous/application.h"
#include "miscellaneous/feedreader.h"
#include "miscellaneous/iconfactory.h"
#include "network-web/webfactory.h"
#include "services/abstract/accountcheckmodel.h"
FormMessageFiltersManager::FormMessageFiltersManager(QWidget* parent) : QDialog(parent) {
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_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_btnTest->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));
connect(m_ui.m_btnDetailedHelp, &QPushButton::clicked, this, []() {
qApp->web()->openUrlInExternalBrowser(MSG_FILTERING_HELP);
});
connect(m_ui.m_listFilters, &QListWidget::currentRowChanged,
this, &FormMessageFiltersManager::loadFilter);
connect(m_ui.m_btnAddNew, &QPushButton::clicked,
this, &FormMessageFiltersManager::addNewFilter);
}
FormMessageFiltersManager::~FormMessageFiltersManager() {
delete m_rootItem;
}
MessageFilter* FormMessageFiltersManager::selectedFilter() const {
if (m_ui.m_listFilters->selectedItems().isEmpty()) {
return nullptr;
}
else {
return m_ui.m_listFilters->selectedItems().at(0)->data(Qt::ItemDataRole::UserRole).value<MessageFilter*>();
}
}
ServiceRoot* FormMessageFiltersManager::selectedAccount() const {
return nullptr;
}
void FormMessageFiltersManager::addNewFilter() {
auto* fltr = m_reader->addMessageFilter(
tr("New message filter"),
QSL("function filterMessage() { return 1; }"));
auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters);
it->setData(Qt::ItemDataRole::UserRole, QVariant::fromValue<MessageFilter*>(fltr));
m_ui.m_listFilters->setCurrentRow(m_ui.m_listFilters->count() - 1);
}
void FormMessageFiltersManager::loadFilter() {
auto* filter = selectedFilter();
auto* acc = selectedAccount();
showFilter(filter);
updateFeedAssignments(filter, acc);
}
void FormMessageFiltersManager::showFilter(MessageFilter* filter) {
if (filter == nullptr) {
m_ui.m_txtTitle->clear();
m_ui.m_txtScript->clear();
m_ui.m_gbDetails->setEnabled(false);
}
else {
m_ui.m_txtTitle->setText(filter->name());
m_ui.m_txtScript->setPlainText(filter->script());
m_ui.m_gbDetails->setEnabled(true);
}
}
void FormMessageFiltersManager::updateFeedAssignments(MessageFilter* filter, ServiceRoot* account) {}

View File

@ -5,16 +5,40 @@
#include <QDialog>
#include "services/abstract/serviceroot.h"
#include "ui_formmessagefiltersmanager.h"
class AccountCheckModel;
class MessageFilter;
class FeedReader;
class FormMessageFiltersManager : public QDialog {
Q_OBJECT
Q_OBJECT
public:
explicit FormMessageFiltersManager(QWidget *parent = nullptr);
explicit FormMessageFiltersManager(FeedReader* reader, const QList<ServiceRoot*>& accounts, QWidget* parent = nullptr);
virtual ~FormMessageFiltersManager();
MessageFilter* selectedFilter() const;
ServiceRoot* selectedAccount() const;
private slots:
void addNewFilter();
void loadFilter();
// Display filter title/contents.
void showFilter(MessageFilter* filter);
// Load feeds/categories of the account, place checkmarks where filter is used.
void updateFeedAssignments(MessageFilter* filter, ServiceRoot* account);
private:
Ui::FormMessageFiltersManager m_ui;
AccountCheckModel* m_feedsModel;
RootItem* m_rootItem;
QList<ServiceRoot*> m_accounts;
FeedReader* m_reader;
};
#endif // FORMMESSAGEFILTERSMANAGER_H

View File

@ -6,144 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>737</width>
<height>592</height>
<width>900</width>
<height>625</height>
</rect>
</property>
<property name="windowTitle">
<string>Message filters</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QTreeView" name="m_treeFeeds"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Message filter details</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Title</string>
</property>
<property name="buddy">
<cstring>m_txtTitle</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="m_txtTitle">
<property name="placeholderText">
<string>Title of message filter</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>JavaScript code</string>
</property>
<property name="buddy">
<cstring>m_txtScript</cstring>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Errors</string>
</property>
<property name="buddy">
<cstring>m_txtErrors</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPlainTextEdit" name="m_txtErrors">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="m_btnDetailedHelp">
<property name="text">
<string>&amp;Detailed help</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QPlainTextEdit" name="m_txtScript">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>2</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string>Your JavaScript-based message filtering logic</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="3">
<widget class="QTreeView" name="m_treeFilters"/>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="m_btnRemoveSelected">
<property name="text">
@ -171,8 +43,276 @@
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QListWidget" name="m_listFilters"/>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QFormLayout" name="formLayout_3">
<item row="1" column="0" colspan="2">
<widget class="QTreeView" name="m_treeFeeds">
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
</size>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Account</string>
</property>
<property name="buddy">
<cstring>comboBox</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="m_gbDetails">
<property name="title">
<string>Message filter details</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Title</string>
</property>
<property name="buddy">
<cstring>m_txtTitle</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="m_txtTitle">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
<property name="placeholderText">
<string>Title of message filter</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>JavaScript code</string>
</property>
<property name="buddy">
<cstring>m_txtScript</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<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>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Sample message</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>Read</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_2">
<property name="text">
<string>Important</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Title</string>
</property>
<property name="buddy">
<cstring>lineEdit</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>URL</string>
</property>
<property name="buddy">
<cstring>lineEdit_2</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineEdit_2"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Author</string>
</property>
<property name="buddy">
<cstring>lineEdit_3</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_3"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Created on</string>
</property>
<property name="buddy">
<cstring>lineEdit_4</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_4"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Contents</string>
</property>
<property name="buddy">
<cstring>plainTextEdit</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPlainTextEdit" name="plainTextEdit"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="m_btnTest">
<property name="text">
<string>&amp;Test</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="m_btnDetailedHelp">
<property name="text">
<string>&amp;Detailed &amp;help</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Test output</string>
</property>
<property name="buddy">
<cstring>m_txtErrors</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPlainTextEdit" name="m_txtErrors">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="1">
<widget class="QDialogButtonBox" name="m_buttonBox">
<property name="orientation">
@ -189,12 +329,22 @@
</layout>
</widget>
<tabstops>
<tabstop>m_treeFilters</tabstop>
<tabstop>m_treeFeeds</tabstop>
<tabstop>m_listFilters</tabstop>
<tabstop>m_btnAddNew</tabstop>
<tabstop>m_btnRemoveSelected</tabstop>
<tabstop>comboBox</tabstop>
<tabstop>m_treeFeeds</tabstop>
<tabstop>m_txtTitle</tabstop>
<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_txtErrors</tabstop>
</tabstops>
<resources/>
@ -206,8 +356,8 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
<x>701</x>
<y>615</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
@ -222,8 +372,8 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
<x>769</x>
<y>615</y>
</hint>
<hint type="destinationlabel">
<x>286</x>

View File

@ -22,7 +22,7 @@ void GuiUtilities::setLabelAsNotice(QLabel& label, bool is_warning) {
}
void GuiUtilities::applyDialogProperties(QWidget& widget, const QIcon& icon, const QString& title) {
widget.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
widget.setWindowFlags(/*Qt::MSWindowsFixedSizeDialogHint | */ Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
widget.setWindowIcon(icon);
if (!title.isEmpty()) {

View File

@ -7,10 +7,10 @@
#include "core/feedsproxymodel.h"
#include "core/messagesmodel.h"
#include "core/messagesproxymodel.h"
#include "gui/dialogs/formmessagefiltersmanager.h"
#include "miscellaneous/application.h"
#include "miscellaneous/databasequeries.h"
#include "miscellaneous/mutex.h"
#include "gui/dialogs/formmessagefiltersmanager.h"
#include "services/abstract/cacheforserviceroot.h"
#include "services/abstract/serviceroot.h"
#include "services/gmail/gmailentrypoint.h"
@ -97,7 +97,10 @@ void FeedReader::updateFeeds(const QList<Feed*>& feeds) {
}
void FeedReader::showMessageFiltersManager() {
FormMessageFiltersManager manager(qApp->mainFormWidget());
FormMessageFiltersManager manager(qApp->feedReader(),
qApp->feedReader()->feedsModel()->serviceRoots(),
qApp->mainFormWidget());
manager.exec();
}
@ -135,7 +138,7 @@ int FeedReader::autoUpdateInitialInterval() const {
return m_globalAutoUpdateInitialInterval;
}
void FeedReader::loadSaveMessageFilters() {
void FeedReader::loadSavedMessageFilters() {
// Load all message filters from database.
// All plugin services will hook active filters to
// all feeds.
@ -148,6 +151,17 @@ void FeedReader::loadSaveMessageFilters() {
}
}
MessageFilter* FeedReader::addMessageFilter(const QString& title, const QString& script) {
auto* fltr = new MessageFilter(12, this);
fltr->setName(title);
fltr->setScript(script);
// TODO: Save into database, then return.
return fltr;
}
void FeedReader::updateAllFeeds() {
updateFeeds(m_feedsModel->rootItem()->getSubTreeFeeds());
}

View File

@ -52,9 +52,9 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject {
int autoUpdateRemainingInterval() const;
int autoUpdateInitialInterval() const;
void loadSaveMessageFilters();
void loadSavedMessageFilters();
QList<MessageFilter*> messageFilters() const;
MessageFilter* addMessageFilter(const QString& title, const QString& script);
public slots:
void updateAllFeeds();

View File

@ -25,9 +25,7 @@ RootItem* AccountCheckModel::rootItem() const {
}
void AccountCheckModel::setRootItem(RootItem* root_item) {
delete m_rootItem;
m_rootItem = root_item;
}
@ -161,23 +159,17 @@ QVariant AccountCheckModel::data(const QModelIndex& index, int role) const {
}
}
else if (role == Qt::DecorationRole) {
switch (item->kind()) {
case RootItemKind::Category:
case RootItemKind::Bin:
case RootItemKind::Feed:
return item->icon();
auto ic = item->icon();
default:
return QVariant();
}
return ic.isNull() ? QVariant() : ic;
}
else if (role == Qt::DisplayRole) {
switch (item->kind()) {
case RootItemKind::Category:
return QVariant(item->data(index.column(), role).toString() + tr(" (category)"));
return QVariant(item->data(index.column(), role).toString() + QSL(" ") + tr("(category)"));
case RootItemKind::Feed:
return QVariant(item->data(index.column(), role).toString() + tr(" (feed)"));
return QVariant(item->data(index.column(), role).toString() + QSL(" ") + tr("(feed)"));
default:
return item->title();
@ -243,7 +235,8 @@ bool AccountCheckModel::setData(const QModelIndex& index, const QVariant& value,
}
Qt::ItemFlags AccountCheckModel::flags(const QModelIndex& index) const {
if (!index.isValid() || itemForIndex(index)->kind() == RootItemKind::Bin) {
if (!index.isValid() || (itemForIndex(index)->kind() != RootItemKind::Kind::Category &&
itemForIndex(index)->kind() != RootItemKind::Kind::Feed)) {
return Qt::NoItemFlags;
}

View File

@ -7,12 +7,12 @@
#include "services/abstract/rootitem.h"
// This is common model which displays only categories/feeds
// and allows user to place checkmarks.
class AccountCheckModel : public QAbstractItemModel {
Q_OBJECT
public:
// Constructors and destructors.
explicit AccountCheckModel(QObject* parent = nullptr);
virtual ~AccountCheckModel();

View File

@ -40,7 +40,7 @@ void FormStandardImportExport::setMode(const FeedsImportExportModel::Mode& mode)
m_ui->m_progressBar->setVisible(false);
switch (mode) {
case FeedsImportExportModel::Export: {
case FeedsImportExportModel::Mode::Export: {
m_model->setRootItem(m_serviceRoot);
m_model->checkAllItems();
m_ui->m_treeFeeds->setModel(m_model);
@ -55,7 +55,7 @@ void FormStandardImportExport::setMode(const FeedsImportExportModel::Mode& mode)
break;
}
case FeedsImportExportModel::Import: {
case FeedsImportExportModel::Mode::Import: {
m_ui->m_groupFile->setTitle(tr("Source file"));
m_ui->m_groupFeeds->setTitle(tr("Target feeds && categories"));
m_ui->m_groupFeeds->setDisabled(true);
@ -77,11 +77,11 @@ void FormStandardImportExport::setMode(const FeedsImportExportModel::Mode& mode)
void FormStandardImportExport::selectFile() {
switch (m_model->mode()) {
case FeedsImportExportModel::Import:
case FeedsImportExportModel::Mode::Import:
selectImportFile();
break;
case FeedsImportExportModel::Export: {
case FeedsImportExportModel::Mode::Export: {
selectExportFile();
break;
}
@ -194,6 +194,7 @@ void FormStandardImportExport::selectImportFile() {
QString(),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes);
parseImportFile(selected_file, answer == QMessageBox::Yes);
}
}
@ -227,11 +228,11 @@ void FormStandardImportExport::parseImportFile(const QString& file_name, bool fe
void FormStandardImportExport::performAction() {
switch (m_model->mode()) {
case FeedsImportExportModel::Import:
case FeedsImportExportModel::Mode::Import:
importFeeds();
break;
case FeedsImportExportModel::Export:
case FeedsImportExportModel::Mode::Export:
exportFeeds();
break;

View File

@ -16,10 +16,10 @@
#include <QStack>
FeedsImportExportModel::FeedsImportExportModel(QObject* parent)
: AccountCheckModel(parent), m_mode(Import) {}
: AccountCheckModel(parent), m_mode(Mode::Import) {}
FeedsImportExportModel::~FeedsImportExportModel() {
if (m_rootItem != nullptr && m_mode == Import) {
if (m_rootItem != nullptr && m_mode == Mode::Import) {
// Delete all model items, but only if we are in import mode. Export mode shares
// root item with main feed model, thus cannot be deleted from memory now.
delete m_rootItem;
@ -52,10 +52,11 @@ bool FeedsImportExportModel::exportToOMPL20(QByteArray& result) {
elem_opml_head.appendChild(elem_opml_created);
opml_document.documentElement().appendChild(elem_opml_head);
QDomElement elem_opml_body = opml_document.createElement(QSL("body"));
QStack<RootItem*> items_to_process;
items_to_process.push(m_rootItem);
QStack<QDomElement> elements_to_use;
elements_to_use.push(elem_opml_body);
// Process all unprocessed nodes.
@ -146,10 +147,11 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m
int completed = 0, total = 0, succeded = 0, failed = 0;
auto* root_item = new StandardServiceRoot();
QStack<RootItem*> model_items;
model_items.push(root_item);
QStack<QDomElement> elements_to_process;
elements_to_process.push(opml_document.documentElement().elementsByTagName(QSL("body")).at(0).toElement());
while (!elements_to_process.isEmpty()) {
@ -276,7 +278,6 @@ void FeedsImportExportModel::importAsTxtURLPerLine(const QByteArray& data, bool
emit layoutChanged();
int completed = 0, succeded = 0, failed = 0;
auto* root_item = new StandardServiceRoot();
QList<QByteArray> urls = data.split('\n');
for (const QByteArray& url : urls) {

View File

@ -9,13 +9,12 @@ class FeedsImportExportModel : public AccountCheckModel {
Q_OBJECT
public:
enum Mode {
enum class Mode {
Import,
Export
};
// Constructors and destructors.
explicit FeedsImportExportModel(QObject* parent = 0);
explicit FeedsImportExportModel(QObject* parent = nullptr);
virtual ~FeedsImportExportModel();
// Exports to OPML 2.0

View File

@ -293,14 +293,14 @@ void StandardServiceRoot::addNewCategory() {
void StandardServiceRoot::importFeeds() {
QScopedPointer<FormStandardImportExport> form(new FormStandardImportExport(this, qApp->mainFormWidget()));
form.data()->setMode(FeedsImportExportModel::Import);
form.data()->setMode(FeedsImportExportModel::Mode::Import);
form.data()->exec();
}
void StandardServiceRoot::exportFeeds() {
QScopedPointer<FormStandardImportExport> form(new FormStandardImportExport(this, qApp->mainFormWidget()));
form.data()->setMode(FeedsImportExportModel::Export);
form.data()->setMode(FeedsImportExportModel::Mode::Export);
form.data()->exec();
}

View File

@ -77,7 +77,7 @@ int main(int argc, char* argv[]) {
qApp->loadDynamicShortcuts();
qApp->hideOrShowMainForm();
qApp->feedReader()->loadSaveMessageFilters();
qApp->feedReader()->loadSavedMessageFilters();
qApp->feedReader()->feedsModel()->loadActivatedServiceAccounts();
qApp->showTrayIcon();
qApp->offerChanges();