Work on filters, some code cleanups.
This commit is contained in:
parent
b02232a58a
commit
7017aa9e66
@ -4,7 +4,7 @@ APP_REVERSE_NAME = "com.github.rssguard"
|
||||
APP_LOW_H_NAME = ".rssguard"
|
||||
APP_AUTHOR = "Martin Rotter"
|
||||
APP_COPYRIGHT = "(C) 2011-2020 $$APP_AUTHOR"
|
||||
APP_VERSION = "3.6.3"
|
||||
APP_VERSION = "3.7.0"
|
||||
APP_LONG_NAME = "$$APP_NAME $$APP_VERSION"
|
||||
APP_EMAIL = "rotter.martinos@gmail.com"
|
||||
APP_URL = "https://github.com/martinrotter/rssguard"
|
||||
|
@ -31,7 +31,7 @@ bool FeedDownloader::isUpdateRunning() const {
|
||||
return !m_feeds.isEmpty();
|
||||
}
|
||||
|
||||
void FeedDownloader::updateAvailableFeeds(const QList<MessageFilter*>& msg_filters) {
|
||||
void FeedDownloader::updateAvailableFeeds() {
|
||||
for (const Feed* feed : m_feeds) {
|
||||
auto* cache = dynamic_cast<CacheForServiceRoot*>(feed->getParentServiceRoot());
|
||||
|
||||
@ -42,11 +42,11 @@ void FeedDownloader::updateAvailableFeeds(const QList<MessageFilter*>& msg_filte
|
||||
}
|
||||
|
||||
while (!m_feeds.isEmpty()) {
|
||||
updateOneFeed(m_feeds.takeFirst(), msg_filters);
|
||||
updateOneFeed(m_feeds.takeFirst());
|
||||
}
|
||||
}
|
||||
|
||||
void FeedDownloader::updateFeeds(const QList<Feed*>& feeds, const QList<MessageFilter*>& msg_filters) {
|
||||
void FeedDownloader::updateFeeds(const QList<Feed*>& feeds) {
|
||||
QMutexLocker locker(m_mutex);
|
||||
|
||||
if (feeds.isEmpty()) {
|
||||
@ -62,7 +62,7 @@ void FeedDownloader::updateFeeds(const QList<Feed*>& feeds, const QList<MessageF
|
||||
// Job starts now.
|
||||
emit updateStarted();
|
||||
|
||||
updateAvailableFeeds(msg_filters);
|
||||
updateAvailableFeeds();
|
||||
}
|
||||
|
||||
finalizeUpdate();
|
||||
@ -73,7 +73,7 @@ void FeedDownloader::stopRunningUpdate() {
|
||||
m_feedsOriginalCount = m_feedsUpdated = 0;
|
||||
}
|
||||
|
||||
void FeedDownloader::updateOneFeed(Feed* feed, const QList<MessageFilter*>& msg_filters) {
|
||||
void FeedDownloader::updateOneFeed(Feed* feed) {
|
||||
qDebug().nospace() << "Downloading new messages for feed ID "
|
||||
<< feed->customId() << " URL: " << feed->url() << " title: " << feed->title() << " in thread: \'"
|
||||
<< QThread::currentThreadId() << "\'.";
|
||||
@ -101,7 +101,7 @@ void FeedDownloader::updateOneFeed(Feed* feed, const QList<MessageFilter*>& msg_
|
||||
.remove(QRegularExpression(QSL("([\\n\\r])|(^\\s)")));
|
||||
}
|
||||
|
||||
if (!msg_filters.isEmpty()) {
|
||||
if (!feed->filters().isEmpty()) {
|
||||
// Perform per-message filtering.
|
||||
QJSEngine filter_engine;
|
||||
|
||||
@ -117,7 +117,19 @@ void FeedDownloader::updateOneFeed(Feed* feed, const QList<MessageFilter*>& msg_
|
||||
// Attach live message object to wrapper.
|
||||
msg_obj.setMessage(&msgs[i]);
|
||||
|
||||
for (MessageFilter* msg_filter : msg_filters) {
|
||||
auto feed_filters = feed->filters();
|
||||
|
||||
for (int i = 0; i < feed_filters.size(); i++) {
|
||||
QPointer<MessageFilter> filter = feed_filters.at(i);
|
||||
|
||||
if (filter.isNull()) {
|
||||
qWarning("Message filter was probably deleted, removing its pointer from list of filters.");
|
||||
feed_filters.removeAt(i--);
|
||||
continue;
|
||||
}
|
||||
|
||||
MessageFilter* msg_filter = filter.data();
|
||||
|
||||
// Call the filtering logic, given function must return integer value from
|
||||
// FilteringAction enumeration.
|
||||
//
|
||||
@ -129,10 +141,12 @@ void FeedDownloader::updateOneFeed(Feed* feed, const QList<MessageFilter*>& msg_
|
||||
|
||||
switch (decision) {
|
||||
case FilteringAction::Accept:
|
||||
|
||||
// Message is normally accepted, it could be tweaked by the filter.
|
||||
continue;
|
||||
|
||||
case FilteringAction::Ignore:
|
||||
|
||||
// Remove the message, we do not want it.
|
||||
msgs.removeAt(i--);
|
||||
break;
|
||||
|
@ -41,7 +41,7 @@ class FeedDownloader : public QObject {
|
||||
bool isUpdateRunning() const;
|
||||
|
||||
public slots:
|
||||
void updateFeeds(const QList<Feed*>& feeds, const QList<MessageFilter*>& msg_filters);
|
||||
void updateFeeds(const QList<Feed*>& feeds);
|
||||
void stopRunningUpdate();
|
||||
|
||||
signals:
|
||||
@ -50,8 +50,8 @@ class FeedDownloader : public QObject {
|
||||
void updateProgress(const Feed* feed, int current, int total);
|
||||
|
||||
private:
|
||||
void updateOneFeed(Feed* feed, const QList<MessageFilter*>& msg_filters);
|
||||
void updateAvailableFeeds(const QList<MessageFilter*>& msg_filters);
|
||||
void updateOneFeed(Feed* feed);
|
||||
void updateAvailableFeeds();
|
||||
void finalizeUpdate();
|
||||
|
||||
QList<Feed*> m_feeds;
|
||||
|
@ -229,7 +229,7 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
|
||||
QDateTime dt = TextFactory::parseDateTime(QSqlQueryModel::data(idx, role).value<qint64>()).toLocalTime();
|
||||
|
||||
if (m_customDateFormat.isEmpty()) {
|
||||
return dt.toString(Qt::DefaultLocaleShortDate);
|
||||
return QLocale().toString(dt, QLocale::FormatType::ShortFormat);
|
||||
}
|
||||
else {
|
||||
return dt.toString(m_customDateFormat);
|
||||
|
@ -72,8 +72,8 @@ void FormAbout::loadLicenseAndInformation() {
|
||||
m_ui.m_lblDesc->setText(tr("<b>%8</b><br>" "<b>Version:</b> %1 (built on %2/%3)<br>" "<b>Revision:</b> %4<br>" "<b>Build date:</b> %5<br>"
|
||||
"<b>Qt:</b> %6 (compiled against %7)<br>").arg(
|
||||
qApp->applicationVersion(), APP_SYSTEM_NAME, APP_SYSTEM_VERSION, APP_REVISION,
|
||||
TextFactory::parseDateTime(QString("%1 %2").arg(__DATE__,
|
||||
__TIME__)).toString(Qt::DefaultLocaleShortDate),
|
||||
QLocale().toString(TextFactory::parseDateTime(QString("%1 %2").arg(__DATE__, __TIME__)),
|
||||
QLocale::FormatType::ShortFormat),
|
||||
qVersion(), QT_VERSION_STR,
|
||||
APP_NAME));
|
||||
m_ui.m_txtInfo->setText(tr("<body>%5 is a (very) tiny feed reader."
|
||||
|
@ -127,7 +127,7 @@ void WebViewer::loadMessages(const QList<Message>& messages, RootItem* root) {
|
||||
message.m_author),
|
||||
message.m_url,
|
||||
message.m_contents,
|
||||
message.m_created.toString(Qt::DefaultLocaleShortDate),
|
||||
QLocale().toString(message.m_created, QLocale::FormatType::ShortFormat),
|
||||
enclosures,
|
||||
message.m_isRead ? "mark-unread" : "mark-read",
|
||||
message.m_isImportant ? "mark-unstarred" : "mark-starred",
|
||||
@ -201,11 +201,11 @@ bool WebViewer::eventFilter(QObject* object, QEvent* event) {
|
||||
QWheelEvent* wh_event = static_cast<QWheelEvent*>(event);
|
||||
|
||||
if ((wh_event->modifiers() & Qt::KeyboardModifier::ControlModifier) > 0) {
|
||||
if (wh_event->delta() > 0) {
|
||||
if (wh_event->angleDelta().y() > 0) {
|
||||
increaseWebPageZoom();
|
||||
return true;
|
||||
}
|
||||
else if (wh_event->delta() < 0) {
|
||||
else if (wh_event->angleDelta().y() < 0) {
|
||||
decreaseWebPageZoom();
|
||||
return true;
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ class ExternalTool {
|
||||
public:
|
||||
explicit ExternalTool();
|
||||
ExternalTool(const ExternalTool& other);
|
||||
explicit ExternalTool(QString executable, QStringList parameters);
|
||||
explicit ExternalTool(QString executable, QStringList parameters);
|
||||
|
||||
QString toString();
|
||||
QString executable() const;
|
||||
|
@ -75,7 +75,6 @@ void FeedReader::updateFeeds(const QList<Feed*>& feeds) {
|
||||
m_feedDownloader = new FeedDownloader();
|
||||
|
||||
// Downloader setup.
|
||||
qRegisterMetaType<QList<MessageFilter*>>("QList<MessageFilter*>");
|
||||
qRegisterMetaType<QList<Feed*>>("QList<Feed*>");
|
||||
|
||||
m_feedDownloader->moveToThread(m_feedDownloaderThread);
|
||||
@ -92,8 +91,7 @@ void FeedReader::updateFeeds(const QList<Feed*>& feeds) {
|
||||
|
||||
QMetaObject::invokeMethod(m_feedDownloader, "updateFeeds",
|
||||
Qt::ConnectionType::QueuedConnection,
|
||||
Q_ARG(QList<Feed*>, feeds),
|
||||
Q_ARG(QList<MessageFilter*>, m_messageFilters));
|
||||
Q_ARG(QList<Feed*>, feeds));
|
||||
}
|
||||
|
||||
void FeedReader::updateAutoUpdateStatus() {
|
||||
@ -130,6 +128,12 @@ int FeedReader::autoUpdateInitialInterval() const {
|
||||
return m_globalAutoUpdateInitialInterval;
|
||||
}
|
||||
|
||||
void FeedReader::loadSaveMessageFilters() {
|
||||
// TODO: Load all message filters from database.
|
||||
// All plugin services will hook active filters to
|
||||
// all feeds.
|
||||
}
|
||||
|
||||
void FeedReader::updateAllFeeds() {
|
||||
updateFeeds(m_feedsModel->rootItem()->getSubTreeFeeds());
|
||||
}
|
||||
|
@ -26,8 +26,7 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject {
|
||||
explicit FeedReader(QObject* parent = nullptr);
|
||||
virtual ~FeedReader();
|
||||
|
||||
// List of all installed "feed service plugins", including obligatory
|
||||
// "standard" service entry point.
|
||||
// List of all installed "feed service plugins".
|
||||
QList<ServiceEntryPoint*> feedServices();
|
||||
|
||||
// Access to DB cleaner.
|
||||
@ -51,6 +50,8 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject {
|
||||
int autoUpdateRemainingInterval() const;
|
||||
int autoUpdateInitialInterval() const;
|
||||
|
||||
void loadSaveMessageFilters();
|
||||
|
||||
public slots:
|
||||
void updateAllFeeds();
|
||||
void stopRunningFeedUpdate();
|
||||
|
@ -499,7 +499,7 @@ void AdBlockRule::parseFilter() {
|
||||
void AdBlockRule::parseDomains(const QString& domains, const QChar& separator) {
|
||||
QStringList domainsList = domains.split(separator, QString::SkipEmptyParts);
|
||||
|
||||
for (const QString domain : domainsList) {
|
||||
for (const QString& domain : domainsList) {
|
||||
if (domain.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
@ -619,6 +619,7 @@ QString AdBlockRule::createRegExpFromFilter(const QString& filter) const {
|
||||
|
||||
QList<QStringMatcher> AdBlockRule::createStringMatchers(const QStringList& filters) const {
|
||||
QList<QStringMatcher> matchers;
|
||||
|
||||
matchers.reserve(filters.size());
|
||||
|
||||
for (const QString& filter : filters) {
|
||||
|
@ -18,7 +18,8 @@
|
||||
|
||||
Feed::Feed(RootItem* parent)
|
||||
: RootItem(parent), m_url(QString()), m_status(Normal), m_autoUpdateType(DefaultAutoUpdate),
|
||||
m_autoUpdateInitialInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateRemainingInterval(DEFAULT_AUTO_UPDATE_INTERVAL) {
|
||||
m_autoUpdateInitialInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateRemainingInterval(DEFAULT_AUTO_UPDATE_INTERVAL),
|
||||
m_filters(QList<QPointer<MessageFilter>>()) {
|
||||
setKind(RootItemKind::Feed);
|
||||
}
|
||||
|
||||
@ -51,6 +52,7 @@ Feed::Feed(const Feed& other) : RootItem(other) {
|
||||
setAutoUpdateType(other.autoUpdateType());
|
||||
setAutoUpdateInitialInterval(other.autoUpdateInitialInterval());
|
||||
setAutoUpdateRemainingInterval(other.autoUpdateRemainingInterval());
|
||||
setFilters(other.filters());
|
||||
}
|
||||
|
||||
Feed::~Feed() = default;
|
||||
@ -241,9 +243,11 @@ QString Feed::getAutoUpdateStatusDescription() const {
|
||||
case DefaultAutoUpdate:
|
||||
|
||||
//: Describes feed auto-update status.
|
||||
auto_update_string = tr("uses global settings (%n minute(s) to next auto-update)",
|
||||
nullptr,
|
||||
qApp->feedReader()->autoUpdateRemainingInterval());
|
||||
auto_update_string = qApp->feedReader()->autoUpdateEnabled()
|
||||
? tr("uses global settings (%n minute(s) to next auto-update)",
|
||||
nullptr,
|
||||
qApp->feedReader()->autoUpdateRemainingInterval())
|
||||
: tr("uses global settings (global feed auto-updating is disabled)");
|
||||
break;
|
||||
|
||||
case SpecificAutoUpdate:
|
||||
@ -276,7 +280,18 @@ QString Feed::getStatusDescription() const {
|
||||
}
|
||||
}
|
||||
|
||||
QList<QPointer<MessageFilter>> Feed::filters() const {
|
||||
return m_filters;
|
||||
}
|
||||
|
||||
void Feed::setFilters(const QList<QPointer<MessageFilter>>& filters) {
|
||||
m_filters = filters;
|
||||
}
|
||||
|
||||
QString Feed::additionalTooltip() const {
|
||||
return tr("Auto-update status: %1\n"
|
||||
"Status: %2").arg(getAutoUpdateStatusDescription(), getStatusDescription());
|
||||
"Active message filters: %2\n"
|
||||
"Status: %3").arg(getAutoUpdateStatusDescription(),
|
||||
QString::number(m_filters.size()),
|
||||
getStatusDescription());
|
||||
}
|
||||
|
@ -6,7 +6,9 @@
|
||||
#include "services/abstract/rootitem.h"
|
||||
|
||||
#include "core/message.h"
|
||||
#include "core/messagefilter.h"
|
||||
|
||||
#include <QPointer>
|
||||
#include <QVariant>
|
||||
|
||||
// Base class for "feed" nodes.
|
||||
@ -67,6 +69,9 @@ class Feed : public RootItem {
|
||||
QString url() const;
|
||||
void setUrl(const QString& url);
|
||||
|
||||
QList<QPointer<MessageFilter>> filters() const;
|
||||
void setFilters(const QList<QPointer<MessageFilter>>& filters);
|
||||
|
||||
bool markAsReadUnread(ReadStatus status);
|
||||
bool cleanMessages(bool clean_read_only);
|
||||
|
||||
@ -88,6 +93,7 @@ class Feed : public RootItem {
|
||||
int m_autoUpdateRemainingInterval{};
|
||||
int m_totalCount{};
|
||||
int m_unreadCount{};
|
||||
QList<QPointer<MessageFilter>> m_filters;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(Feed::AutoUpdateType)
|
||||
|
@ -163,9 +163,9 @@ QString TtRssServiceRoot::additionalTooltip() const {
|
||||
"Last error: %3\nLast login on: %4").arg(m_network->username(),
|
||||
m_network->url(),
|
||||
NetworkFactory::networkErrorText(m_network->lastError()),
|
||||
m_network->lastLoginTime().isValid() ?
|
||||
m_network->lastLoginTime().toString(Qt::DefaultLocaleShortDate) :
|
||||
QSL("-"));
|
||||
m_network->lastLoginTime().isValid()
|
||||
? QLocale().toString(m_network->lastLoginTime(), QLocale::FormatType::ShortFormat)
|
||||
: QSL("-"));
|
||||
}
|
||||
|
||||
TtRssNetworkFactory* TtRssServiceRoot::network() const {
|
||||
|
@ -77,6 +77,7 @@ int main(int argc, char* argv[]) {
|
||||
|
||||
qApp->loadDynamicShortcuts();
|
||||
qApp->hideOrShowMainForm();
|
||||
qApp->feedReader()->loadSaveMessageFilters();
|
||||
qApp->feedReader()->feedsModel()->loadActivatedServiceAccounts();
|
||||
qApp->showTrayIcon();
|
||||
qApp->offerChanges();
|
||||
|
Loading…
x
Reference in New Issue
Block a user