work on article ignore/limit

This commit is contained in:
Martin Rotter 2024-01-15 09:37:43 +01:00
parent 869e0d1f70
commit 796fbf916e
11 changed files with 93 additions and 92 deletions

View File

@ -518,14 +518,16 @@ void FeedDownloader::removeDuplicateMessages(QList<Message>& messages) {
}
void FeedDownloader::removeTooOldMessages(Feed* feed, QList<Message>& 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 =

View File

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

View File

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

View File

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

View File

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

View File

@ -29,7 +29,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="m_tabIgnore">
<attribute name="title">
@ -72,9 +72,6 @@
</property>
<item>
<widget class="QGroupBox" name="m_gbAvoidOldArticles">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Avoid adding articles before this date/time into the database</string>
</property>

View File

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

View File

@ -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<QPointer<MessageFilter>>()) {
m_openArticlesDirectly(false), m_isRtl(false), m_messageFilters(QList<QPointer<MessageFilter>>()) {
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<MessageFilter>(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 {

View File

@ -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

View File

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

View File

@ -492,11 +492,15 @@ QMap<QString, QVariantMap> 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<QString, QVariantMap>& 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::ArticleIgnoreLimit>());
/*
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<qint64>();
@ -557,6 +566,7 @@ void ServiceRoot::restoreCustomFeedsData(const QMap<QString, QVariantMap>& data,
else {
feed->setHoursToAvoid(time_to_avoid);
}
*/
}
}
}