From 796fbf916e23c4d859f367c1dcb1ac3572ea6e6e Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 15 Jan 2024 09:37:43 +0100 Subject: [PATCH] work on article ignore/limit --- src/librssguard/core/feeddownloader.cpp | 12 +++--- src/librssguard/database/databasequeries.cpp | 11 ++++-- src/librssguard/database/databasequeries.h | 10 +++-- .../gui/reusable/articleamountcontrol.cpp | 37 ++++++++++--------- .../gui/reusable/articleamountcontrol.h | 22 ++--------- .../gui/reusable/articleamountcontrol.ui | 5 +-- .../gui/settings/settingsfeedsmessages.cpp | 4 +- src/librssguard/services/abstract/feed.cpp | 35 +++++------------- src/librssguard/services/abstract/feed.h | 31 ++++++++++------ .../services/abstract/gui/formfeeddetails.cpp | 6 ++- .../services/abstract/serviceroot.cpp | 12 +++++- 11 files changed, 93 insertions(+), 92 deletions(-) diff --git a/src/librssguard/core/feeddownloader.cpp b/src/librssguard/core/feeddownloader.cpp index 1699177d2..cfa1637cf 100644 --- a/src/librssguard/core/feeddownloader.cpp +++ b/src/librssguard/core/feeddownloader.cpp @@ -518,14 +518,16 @@ void FeedDownloader::removeDuplicateMessages(QList& messages) { } void FeedDownloader::removeTooOldMessages(Feed* feed, QList& msgs) { - if (!feed->addAnyDatetimeArticles()) { + const Feed::ArticleIgnoreLimit art = feed->articleIgnoreLimit(); + + if (!art.m_addAnyArticlesToDb) { QDateTime dt_to_avoid; - if (feed->datetimeToAvoid().isValid() && feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) { - dt_to_avoid = feed->datetimeToAvoid(); + if (art.m_dtToAvoid.isValid() && art.m_dtToAvoid.toMSecsSinceEpoch() > 0) { + dt_to_avoid = art.m_dtToAvoid; } - else if (feed->hoursToAvoid() > 0) { - dt_to_avoid = QDateTime::currentDateTimeUtc().addSecs((feed->hoursToAvoid() * -3600)); + else if (art.m_hoursToAvoid > 0) { + dt_to_avoid = QDateTime::currentDateTimeUtc().addSecs((art.m_hoursToAvoid * -3600)); } else if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::AvoidOldArticles)).toBool()) { QDateTime global_dt_to_avoid = diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 34c291a24..c58e579fb 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -2554,11 +2554,14 @@ void DatabaseQueries::createOverwriteFeed(const QSqlDatabase& db, Feed* feed, in q.bindValue(QSL(":is_quiet"), feed->isQuiet()); q.bindValue(QSL(":open_articles"), feed->openArticlesDirectly()); q.bindValue(QSL(":is_rtl"), feed->isRtl()); - q.bindValue(QSL(":add_any_datetime_articles"), feed->addAnyDatetimeArticles()); + + const Feed::ArticleIgnoreLimit art = feed->articleIgnoreLimit(); + + q.bindValue(QSL(":add_any_datetime_articles"), art.m_addAnyArticlesToDb); q.bindValue(QSL(":datetime_to_avoid"), - (feed->datetimeToAvoid().isValid() && feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) - ? feed->datetimeToAvoid().toMSecsSinceEpoch() - : feed->hoursToAvoid()); + (art.m_dtToAvoid.isValid() && art.m_dtToAvoid.toMSecsSinceEpoch() > 0) + ? art.m_dtToAvoid.toMSecsSinceEpoch() + : art.m_hoursToAvoid); auto custom_data = feed->customDatabaseData(); QString serialized_custom_data = serializeCustomData(custom_data); diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index 06aaddd9d..73cb2297b 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -381,17 +381,21 @@ Assignment DatabaseQueries::getFeeds(const QSqlDatabase& db, feed->setIsSwitchedOff(query.value(FDS_DB_IS_OFF_INDEX).toBool()); feed->setIsQuiet(query.value(FDS_DB_IS_QUIET_INDEX).toBool()); feed->setIsRtl(query.value(FDS_DB_IS_RTL_INDEX).toBool()); - feed->setAddAnyDatetimeArticles(query.value(FDS_DB_ADD_ANY_DATETIME_ARTICLES_INDEX).toBool()); + + Feed::ArticleIgnoreLimit art; + + art.m_addAnyArticlesToDb = query.value(FDS_DB_ADD_ANY_DATETIME_ARTICLES_INDEX).toBool(); qint64 time_to_avoid = query.value(FDS_DB_DATETIME_TO_AVOID_INDEX).value(); if (time_to_avoid > 10000) { - feed->setDatetimeToAvoid(TextFactory::parseDateTime(time_to_avoid)); + art.m_dtToAvoid = TextFactory::parseDateTime(time_to_avoid); } else { - feed->setHoursToAvoid(time_to_avoid); + art.m_hoursToAvoid = time_to_avoid; } + feed->setArticleIgnoreLimit(art); feed->setOpenArticlesDirectly(query.value(FDS_DB_OPEN_ARTICLES_INDEX).toBool()); qDebugNN << LOGSEC_CORE << "Custom ID of feed when loading from DB is" << QUOTE_W_SPACE_DOT(feed->customId()); diff --git a/src/librssguard/gui/reusable/articleamountcontrol.cpp b/src/librssguard/gui/reusable/articleamountcontrol.cpp index 34778c83f..4eb95aa43 100644 --- a/src/librssguard/gui/reusable/articleamountcontrol.cpp +++ b/src/librssguard/gui/reusable/articleamountcontrol.cpp @@ -19,7 +19,7 @@ ArticleAmountControl::ArticleAmountControl(QWidget* parent) : QWidget(parent) { false); m_ui.m_spinArticleCount->setSpecialValueText(tr("all articles")); - m_ui.m_cbAddAnyDateArticles->setChecked(true); + // m_ui.m_cbAddAnyDateArticles->setChecked(true); m_ui.m_dtDateTimeToAvoid->setEnabled(false); m_ui.m_spinHoursAvoid->setEnabled(false); m_ui.m_spinHoursAvoid->setMode(TimeSpinBox::Mode::DaysHours); @@ -57,7 +57,7 @@ void ArticleAmountControl::setForAppWideFeatures(bool app_wide, bool batch_edit) m_ui.m_cbAddAnyDateArticles->setVisible(false); } else { - connect(m_ui.m_cbAddAnyDateArticles, &QCheckBox::toggled, m_ui.m_gbAvoidOldArticles, &QGroupBox::setEnabled); + connect(m_ui.m_cbAddAnyDateArticles, &QCheckBox::toggled, m_ui.m_wdgAvoidOldArticles, &QGroupBox::setDisabled); } if (batch_edit) { @@ -78,7 +78,7 @@ void ArticleAmountControl::setForAppWideFeatures(bool app_wide, bool batch_edit) } } -void ArticleAmountControl::load(const Setup& setup) { +void ArticleAmountControl::load(const Feed::ArticleIgnoreLimit& setup) { // Ignoring articles. if (setup.m_dtToAvoid.isValid() && setup.m_dtToAvoid.toMSecsSinceEpoch() > 0) { m_ui.m_rbAvoidAbsolute->setChecked(true); @@ -90,6 +90,7 @@ void ArticleAmountControl::load(const Setup& setup) { } m_ui.m_gbAvoidOldArticles->setChecked(setup.m_avoidOldArticles); + m_ui.m_cbAddAnyDateArticles->setChecked(setup.m_addAnyArticlesToDb); // Limitting articles. m_ui.m_spinArticleCount->setValue(setup.m_keepCountOfArticles); @@ -98,8 +99,8 @@ void ArticleAmountControl::load(const Setup& setup) { m_ui.m_cbNoRemoveUnread->setChecked(setup.m_doNotRemoveUnread); } -ArticleAmountControl::Setup ArticleAmountControl::save() const { - Setup setup; +Feed::ArticleIgnoreLimit ArticleAmountControl::save() const { + Feed::ArticleIgnoreLimit setup; // Ignoring articles. setup.m_addAnyArticlesToDb = m_ui.m_cbAddAnyDateArticles->isChecked(); @@ -121,29 +122,31 @@ ArticleAmountControl::Setup ArticleAmountControl::save() const { return setup; } -bool isChangeAllowed(MultiFeedEditCheckBox* mcb) { - return mcb->isChecked(); +bool isChangeAllowed(MultiFeedEditCheckBox* mcb, bool batch_edit) { + return !batch_edit || mcb->isChecked(); } -void ArticleAmountControl::saveFeed(Feed* fd) const { - if (isChangeAllowed(m_ui.m_mcbAddAnyDateArticles)) { - fd->setAddAnyDatetimeArticles(m_ui.m_cbAddAnyDateArticles->isChecked()); +void ArticleAmountControl::saveFeed(Feed* fd, bool batch_edit) const { + Feed::ArticleIgnoreLimit& art = fd->articleIgnoreLimit(); + + if (isChangeAllowed(m_ui.m_mcbAddAnyDateArticles, batch_edit)) { + art.m_addAnyArticlesToDb = m_ui.m_cbAddAnyDateArticles->isChecked(); } - if (isChangeAllowed(m_ui.m_mcbAvoidOldArticles)) { + if (isChangeAllowed(m_ui.m_mcbAvoidOldArticles, batch_edit)) { if (m_ui.m_gbAvoidOldArticles->isChecked()) { if (m_ui.m_rbAvoidAbsolute->isChecked()) { - fd->setDatetimeToAvoid(m_ui.m_dtDateTimeToAvoid->dateTime()); - fd->setHoursToAvoid(0); + art.m_dtToAvoid = m_ui.m_dtDateTimeToAvoid->dateTime(); + art.m_hoursToAvoid = 0; } else { - fd->setDatetimeToAvoid({}); - fd->setHoursToAvoid(m_ui.m_spinHoursAvoid->value()); + art.m_dtToAvoid = {}; + art.m_hoursToAvoid = m_ui.m_spinHoursAvoid->value(); } } else { - fd->setDatetimeToAvoid({}); - fd->setHoursToAvoid(0); + art.m_dtToAvoid = {}; + art.m_hoursToAvoid = 0; } } } diff --git a/src/librssguard/gui/reusable/articleamountcontrol.h b/src/librssguard/gui/reusable/articleamountcontrol.h index 14bdc68ba..b5abd7154 100644 --- a/src/librssguard/gui/reusable/articleamountcontrol.h +++ b/src/librssguard/gui/reusable/articleamountcontrol.h @@ -7,7 +7,7 @@ #include "ui_articleamountcontrol.h" -class Feed; +#include "services/abstract/feed.h" class ArticleAmountControl : public QWidget { Q_OBJECT @@ -15,28 +15,14 @@ class ArticleAmountControl : public QWidget { friend class FormFeedDetails; public: - struct Setup { - // Ignoring articles. - bool m_avoidOldArticles = false; - bool m_addAnyArticlesToDb = false; - QDateTime m_dtToAvoid = QDateTime(); - int m_hoursToAvoid = 0; - - // Limitting articles. - int m_keepCountOfArticles = 0; - bool m_doNotRemoveStarred = true; - bool m_doNotRemoveUnread = true; - bool m_moveToBinDontPurge = false; - }; - explicit ArticleAmountControl(QWidget* parent = nullptr); void setForAppWideFeatures(bool app_wide, bool batch_edit); - void load(const Setup& setup); - Setup save() const; + void load(const Feed::ArticleIgnoreLimit& setup); + Feed::ArticleIgnoreLimit save() const; - void saveFeed(Feed* fd) const; + void saveFeed(Feed* fd, bool batch_edit) const; private slots: void updateArticleCountSuffix(int count); diff --git a/src/librssguard/gui/reusable/articleamountcontrol.ui b/src/librssguard/gui/reusable/articleamountcontrol.ui index f900794a0..ec6e9ce80 100644 --- a/src/librssguard/gui/reusable/articleamountcontrol.ui +++ b/src/librssguard/gui/reusable/articleamountcontrol.ui @@ -29,7 +29,7 @@ - 1 + 0 @@ -72,9 +72,6 @@ - - true - Avoid adding articles before this date/time into the database diff --git a/src/librssguard/gui/settings/settingsfeedsmessages.cpp b/src/librssguard/gui/settings/settingsfeedsmessages.cpp index 5141a003a..c6460f4f8 100644 --- a/src/librssguard/gui/settings/settingsfeedsmessages.cpp +++ b/src/librssguard/gui/settings/settingsfeedsmessages.cpp @@ -283,7 +283,7 @@ void SettingsFeedsMessages::loadSettings() { ->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseLegacyArticleFormat)).toBool()); } - ArticleAmountControl::Setup art_limit; + Feed::ArticleIgnoreLimit art_limit; art_limit.m_avoidOldArticles = settings()->value(GROUP(Messages), SETTING(Messages::AvoidOldArticles)).toBool(); art_limit.m_dtToAvoid = settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime(); art_limit.m_hoursToAvoid = settings()->value(GROUP(Messages), SETTING(Messages::HoursToAvoidArticle)).toInt(); @@ -413,7 +413,7 @@ void SettingsFeedsMessages::saveSettings() { m_ui->m_cbLegacyArticleFormatting->isChecked()); } - ArticleAmountControl::Setup art_limit = m_ui->m_wdgArticleLimiting->save(); + Feed::ArticleIgnoreLimit art_limit = m_ui->m_wdgArticleLimiting->save(); settings()->setValue(GROUP(Messages), Messages::AvoidOldArticles, art_limit.m_avoidOldArticles); settings()->setValue(GROUP(Messages), Messages::DateTimeToAvoidArticle, art_limit.m_dtToAvoid); diff --git a/src/librssguard/services/abstract/feed.cpp b/src/librssguard/services/abstract/feed.cpp index 0193251ae..838c9663c 100644 --- a/src/librssguard/services/abstract/feed.cpp +++ b/src/librssguard/services/abstract/feed.cpp @@ -16,8 +16,7 @@ Feed::Feed(RootItem* parent) : RootItem(parent), m_source(QString()), m_status(Status::Normal), m_statusString(QString()), m_autoUpdateType(AutoUpdateType::DefaultAutoUpdate), m_autoUpdateInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_lastUpdated(QDateTime::currentDateTimeUtc()), m_isSwitchedOff(false), m_isQuiet(false), - m_openArticlesDirectly(false), m_isRtl(false), m_addAnyDatetimeArticles(false), m_datetimeToAvoid(QDateTime()), - m_hoursToAvoid(0), m_messageFilters(QList>()) { + m_openArticlesDirectly(false), m_isRtl(false), m_messageFilters(QList>()) { setKind(RootItem::Kind::Feed); } @@ -39,9 +38,7 @@ Feed::Feed(const Feed& other) : RootItem(other) { setLastUpdated(other.lastUpdated()); setMessageFilters(other.messageFilters()); setOpenArticlesDirectly(other.openArticlesDirectly()); - setAddAnyDatetimeArticles(other.addAnyDatetimeArticles()); - setDatetimeToAvoid(other.datetimeToAvoid()); - setHoursToAvoid(other.hoursToAvoid()); + setArticleIgnoreLimit(Feed::ArticleIgnoreLimit(other.articleIgnoreLimit())); setIsRtl(other.isRtl()); setIsSwitchedOff(other.isSwitchedOff()); setIsQuiet(other.isQuiet()); @@ -203,22 +200,6 @@ void Feed::setIsRtl(bool rtl) { m_isRtl = rtl; } -bool Feed::addAnyDatetimeArticles() const { - return m_addAnyDatetimeArticles; -} - -void Feed::setAddAnyDatetimeArticles(bool add_any_articles) { - m_addAnyDatetimeArticles = add_any_articles; -} - -QDateTime Feed::datetimeToAvoid() const { - return m_datetimeToAvoid; -} - -void Feed::setDatetimeToAvoid(const QDateTime& dt) { - m_datetimeToAvoid = dt; -} - void Feed::appendMessageFilter(MessageFilter* filter) { m_messageFilters.append(QPointer(filter)); } @@ -313,12 +294,16 @@ QString Feed::getStatusDescription() const { } } -int Feed::hoursToAvoid() const { - return m_hoursToAvoid; +Feed::ArticleIgnoreLimit& Feed::articleIgnoreLimit() { + return m_articleIgnoreLimit; } -void Feed::setHoursToAvoid(int hours_to_avoid) { - m_hoursToAvoid = hours_to_avoid; +const Feed::ArticleIgnoreLimit& Feed::articleIgnoreLimit() const { + return m_articleIgnoreLimit; +} + +void Feed::setArticleIgnoreLimit(const ArticleIgnoreLimit& ignore_limit) { + m_articleIgnoreLimit = ignore_limit; } bool Feed::isQuiet() const { diff --git a/src/librssguard/services/abstract/feed.h b/src/librssguard/services/abstract/feed.h index 6dbff32b2..09858f6a7 100644 --- a/src/librssguard/services/abstract/feed.h +++ b/src/librssguard/services/abstract/feed.h @@ -16,6 +16,20 @@ class Feed : public RootItem { Q_OBJECT public: + struct ArticleIgnoreLimit { + // Ignoring articles. + bool m_avoidOldArticles = false; + bool m_addAnyArticlesToDb = false; + QDateTime m_dtToAvoid = QDateTime(); + int m_hoursToAvoid = 0; + + // Limitting articles. + int m_keepCountOfArticles = 0; + bool m_doNotRemoveStarred = true; + bool m_doNotRemoveUnread = true; + bool m_moveToBinDontPurge = false; + }; + // Specifies the auto-download strategy for the feed. enum class AutoUpdateType { DontAutoUpdate = 0, @@ -91,14 +105,9 @@ class Feed : public RootItem { bool isRtl() const; void setIsRtl(bool rtl); - bool addAnyDatetimeArticles() const; - void setAddAnyDatetimeArticles(bool add_any_articles); - - QDateTime datetimeToAvoid() const; - void setDatetimeToAvoid(const QDateTime& dt); - - int hoursToAvoid() const; - void setHoursToAvoid(int hours_to_avoid); + ArticleIgnoreLimit& articleIgnoreLimit(); + const ArticleIgnoreLimit& articleIgnoreLimit() const; + void setArticleIgnoreLimit(const ArticleIgnoreLimit& ignore_limit); public slots: virtual void updateCounts(bool including_total_count); @@ -122,9 +131,8 @@ class Feed : public RootItem { // NOTE: These are used to filter out older articles // than needed. Either absolute value is given (date/time) // or relative value given in minutes. - bool m_addAnyDatetimeArticles; - QDateTime m_datetimeToAvoid; - int m_hoursToAvoid; + // Amount + ArticleIgnoreLimit m_articleIgnoreLimit; int m_totalCount{}; int m_unreadCount{}; @@ -133,5 +141,6 @@ class Feed : public RootItem { Q_DECLARE_METATYPE(Feed::AutoUpdateType) Q_DECLARE_METATYPE(Feed::Status) +Q_DECLARE_METATYPE(Feed::ArticleIgnoreLimit) #endif // FEED_H diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.cpp b/src/librssguard/services/abstract/gui/formfeeddetails.cpp index be0072fd1..869673f03 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.cpp +++ b/src/librssguard/services/abstract/gui/formfeeddetails.cpp @@ -55,7 +55,7 @@ void FormFeedDetails::apply() { fd->setIsRtl(m_ui.m_cbFeedRTL->isChecked()); } - m_ui.m_wdgArticleLimiting->saveFeed(fd); + m_ui.m_wdgArticleLimiting->saveFeed(fd, m_isBatchEdit); if (isChangeAllowed(m_ui.m_mcbDisableFeed)) { fd->setIsSwitchedOff(m_ui.m_cbDisableFeed->isChecked()); @@ -149,8 +149,9 @@ void FormFeedDetails::loadFeedData() { m_ui.m_cbDisableFeed->setChecked(fd->isSwitchedOff()); m_ui.m_cbSuppressFeed->setChecked(fd->isQuiet()); - ArticleAmountControl::Setup art_limit; + Feed::ArticleIgnoreLimit art_limit = Feed::ArticleIgnoreLimit(fd->articleIgnoreLimit()); + /* art_limit.m_addAnyArticlesToDb = fd->addAnyDatetimeArticles(); art_limit.m_avoidOldArticles = (fd->datetimeToAvoid().isValid() && fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) || fd->hoursToAvoid() > 0; @@ -161,6 +162,7 @@ void FormFeedDetails::loadFeedData() { art_limit.m_doNotRemoveUnread = false; art_limit.m_keepCountOfArticles = 4; art_limit.m_moveToBinDontPurge = false; +*/ m_ui.m_wdgArticleLimiting->load(art_limit); } diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 2e4b87469..989d6ab1e 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -492,11 +492,15 @@ QMap ServiceRoot::storeCustomFeedsData() { feed_custom_data.insert(QSL("is_quiet"), feed->isQuiet()); feed_custom_data.insert(QSL("open_articles_directly"), feed->openArticlesDirectly()); feed_custom_data.insert(QSL("is_rtl"), feed->isRtl()); - feed_custom_data.insert(QSL("add_any_datetime_articles"), feed->addAnyDatetimeArticles()); + + feed_custom_data.insert(QSL("article_limit_ignore"), QVariant::fromValue(feed->articleIgnoreLimit())); + + /* feed_custom_data.insert(QSL("datetime_to_avoid"), (feed->datetimeToAvoid().isValid() && feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) ? feed->datetimeToAvoid().toMSecsSinceEpoch() : feed->hoursToAvoid()); + */ // NOTE: This is here specifically to be able to restore custom sort order. // Otherwise the information is lost when list of feeds/folders is refreshed from remote @@ -547,6 +551,11 @@ void ServiceRoot::restoreCustomFeedsData(const QMap& data, feed->setIsQuiet(feed_custom_data.value(QSL("is_quiet")).toBool()); feed->setOpenArticlesDirectly(feed_custom_data.value(QSL("open_articles_directly")).toBool()); feed->setIsRtl(feed_custom_data.value(QSL("is_rtl")).toBool()); + + feed + ->setArticleIgnoreLimit(feed_custom_data.value(QSL("article_limit_ignore")).value()); + + /* feed->setAddAnyDatetimeArticles(feed_custom_data.value(QSL("add_any_datetime_articles")).toBool()); qint64 time_to_avoid = feed_custom_data.value(QSL("datetime_to_avoid")).value(); @@ -557,6 +566,7 @@ void ServiceRoot::restoreCustomFeedsData(const QMap& data, else { feed->setHoursToAvoid(time_to_avoid); } + */ } } }