From ea8bac60d6c34042e7b9aecc251d0811074f2f53 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 10 Jan 2024 10:14:07 +0100 Subject: [PATCH] fix #1267 and some other minor bugs and stuff --- src/librssguard/core/feeddownloader.cpp | 60 ++++++---- src/librssguard/core/feeddownloader.h | 1 + src/librssguard/database/databasequeries.cpp | 4 +- src/librssguard/database/databasequeries.h | 11 +- .../gui/mediaplayer/libmpv/libmpvwidget.cpp | 6 +- src/librssguard/gui/reusable/timespinbox.cpp | 66 ++++++----- src/librssguard/gui/reusable/timespinbox.h | 5 +- .../gui/settings/settingsfeedsmessages.cpp | 41 ++++++- .../gui/settings/settingsfeedsmessages.ui | 105 ++++++++++++++++-- src/librssguard/miscellaneous/settings.cpp | 3 + src/librssguard/miscellaneous/settings.h | 3 + .../network-web/basenetworkaccessmanager.cpp | 10 ++ src/librssguard/services/abstract/feed.cpp | 13 ++- src/librssguard/services/abstract/feed.h | 10 +- .../services/abstract/gui/formfeeddetails.cpp | 31 +++++- .../services/abstract/gui/formfeeddetails.ui | 94 +++++++++++++++- .../services/abstract/serviceroot.cpp | 16 ++- 17 files changed, 395 insertions(+), 84 deletions(-) diff --git a/src/librssguard/core/feeddownloader.cpp b/src/librssguard/core/feeddownloader.cpp index e26ec4cef..1699177d2 100644 --- a/src/librssguard/core/feeddownloader.cpp +++ b/src/librssguard/core/feeddownloader.cpp @@ -247,28 +247,6 @@ void FeedDownloader::updateOneFeed(ServiceRoot* acc, msg.sanitize(feed, fix_future_datetimes); } - if (!feed->addAnyDatetimeArticles()) { - QDateTime dt_to_avoid; - - if (feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) { - dt_to_avoid = feed->datetimeToAvoid(); - } - else if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::AvoidOldArticles)).toBool()) { - dt_to_avoid = qApp->settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime(); - } - - if (dt_to_avoid.isValid()) { - for (int i = 0; i < msgs.size(); i++) { - const auto& mss = msgs.at(i); - - if (mss.m_createdFromFeed && mss.m_created < dt_to_avoid) { - qDebugNN << LOGSEC_CORE << "Removing message" << QUOTE_W_SPACE(mss.m_title) << "for being too old."; - msgs.removeAt(i--); - } - } - } - } - QMutexLocker lck(&m_mutexDb); if (!feed->messageFilters().isEmpty()) { @@ -414,6 +392,7 @@ void FeedDownloader::updateOneFeed(ServiceRoot* acc, } removeDuplicateMessages(msgs); + removeTooOldMessages(feed, msgs); tmr.restart(); auto updated_messages = acc->updateMessages(msgs, feed, false, nullptr); @@ -538,6 +517,43 @@ void FeedDownloader::removeDuplicateMessages(QList& messages) { } } +void FeedDownloader::removeTooOldMessages(Feed* feed, QList& msgs) { + if (!feed->addAnyDatetimeArticles()) { + QDateTime dt_to_avoid; + + if (feed->datetimeToAvoid().isValid() && feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) { + dt_to_avoid = feed->datetimeToAvoid(); + } + else if (feed->hoursToAvoid() > 0) { + dt_to_avoid = QDateTime::currentDateTimeUtc().addSecs((feed->hoursToAvoid() * -3600)); + } + else if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::AvoidOldArticles)).toBool()) { + QDateTime global_dt_to_avoid = + qApp->settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime(); + int global_hours_to_avoid = + qApp->settings()->value(GROUP(Messages), SETTING(Messages::HoursToAvoidArticle)).toInt(); + + if (global_dt_to_avoid.isValid() && global_dt_to_avoid.toMSecsSinceEpoch() > 0) { + dt_to_avoid = global_dt_to_avoid; + } + else if (global_hours_to_avoid > 0) { + dt_to_avoid = QDateTime::currentDateTimeUtc().addSecs(global_hours_to_avoid * -3600); + } + } + + if (dt_to_avoid.isValid()) { + for (int i = 0; i < msgs.size(); i++) { + const auto& mss = msgs.at(i); + + if (mss.m_createdFromFeed && mss.m_created < dt_to_avoid) { + qDebugNN << LOGSEC_CORE << "Removing message" << QUOTE_W_SPACE(mss.m_title) << "for being too old."; + msgs.removeAt(i--); + } + } + } + } +} + QString FeedDownloadResults::overview(int how_many_feeds) const { QStringList result; diff --git a/src/librssguard/core/feeddownloader.h b/src/librssguard/core/feeddownloader.h index 8e24fd925..fd814419b 100644 --- a/src/librssguard/core/feeddownloader.h +++ b/src/librssguard/core/feeddownloader.h @@ -71,6 +71,7 @@ class FeedDownloader : public QObject { const QHash& tagged_messages); void finalizeUpdate(); void removeDuplicateMessages(QList& messages); + void removeTooOldMessages(Feed* feed, QList& msgs); FeedUpdateResult updateThreadedFeed(const FeedUpdateRequest& fd); diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 36f2d03db..34c291a24 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -2556,7 +2556,9 @@ void DatabaseQueries::createOverwriteFeed(const QSqlDatabase& db, Feed* feed, in q.bindValue(QSL(":is_rtl"), feed->isRtl()); q.bindValue(QSL(":add_any_datetime_articles"), feed->addAnyDatetimeArticles()); q.bindValue(QSL(":datetime_to_avoid"), - feed->datetimeToAvoid().isValid() ? feed->datetimeToAvoid().toMSecsSinceEpoch() : 0); + (feed->datetimeToAvoid().isValid() && feed->datetimeToAvoid().toMSecsSinceEpoch() > 0) + ? feed->datetimeToAvoid().toMSecsSinceEpoch() + : feed->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 01a6577b2..06aaddd9d 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -382,7 +382,16 @@ Assignment DatabaseQueries::getFeeds(const QSqlDatabase& db, 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->setDatetimeToAvoid(TextFactory::parseDateTime(query.value(FDS_DB_DATETIME_TO_AVOID_INDEX).value())); + + 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)); + } + else { + feed->setHoursToAvoid(time_to_avoid); + } + 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/mediaplayer/libmpv/libmpvwidget.cpp b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp index 4a579e997..9dca3438b 100644 --- a/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp +++ b/src/librssguard/gui/mediaplayer/libmpv/libmpvwidget.cpp @@ -134,10 +134,10 @@ void LibMpvWidget::initializeGL() { } void LibMpvWidget::paintGL() { - auto scaling_ratio = window()->devicePixelRatio(); + qreal scaling_ratio = window()->devicePixelRatio(); mpv_opengl_fbo mpfbo{static_cast(defaultFramebufferObject()), - width() * scaling_ratio, - height() * scaling_ratio, + int(width() * scaling_ratio), + int(height() * scaling_ratio), 0}; int flip_y{1}; diff --git a/src/librssguard/gui/reusable/timespinbox.cpp b/src/librssguard/gui/reusable/timespinbox.cpp index 91aca8f72..e6b1a3d30 100644 --- a/src/librssguard/gui/reusable/timespinbox.cpp +++ b/src/librssguard/gui/reusable/timespinbox.cpp @@ -23,21 +23,22 @@ double TimeSpinBox::valueFromText(const QString& text) const { else { static QRegularExpression rx(QSL("\\b[0-9]{1,}\\b")); QStringList numbers; - int pos = 0; - int count = 0; QRegularExpressionMatchIterator i = rx.globalMatch(text); while (i.hasNext()) { numbers.append(i.next().captured()); - - if (pos >= 0) { - ++pos; - ++count; - } } if (numbers.size() == 2) { - return (numbers.at(0).toDouble() * 60.0) + numbers.at(1).toDouble(); + switch (m_mode) { + case TimeSpinBox::Mode::DaysHours: + return (numbers.at(0).toDouble() * 24.0) + numbers.at(1).toDouble(); + + default: + case TimeSpinBox::Mode::HoursMinutes: + case TimeSpinBox::Mode::MinutesSeconds: + return (numbers.at(0).toDouble() * 60.0) + numbers.at(1).toDouble(); + } } else { return -1.0; @@ -46,25 +47,40 @@ double TimeSpinBox::valueFromText(const QString& text) const { } QString TimeSpinBox::textFromValue(double val) const { - if (mode() == TimeSpinBox::Mode::HoursMinutes) { - // "val" is number of minutes. - int minutes_total = int(val); - int minutes_val = minutes_total % 60; - int hours_val = (minutes_total - minutes_val) / 60; - QString hours = tr("%n hour(s)", "", hours_val); - QString minutes = tr("%n minute(s)", "", minutes_val); + switch (m_mode) { + case TimeSpinBox::Mode::MinutesSeconds: { + // "val" is number of seconds. + int seconds_val = int(val); + int minutes_total = seconds_val / 60; + int seconds_total = seconds_val - (minutes_total * 60); + QString seconds = tr("%n second(s)", nullptr, seconds_total); + QString minutes = tr("%n minute(s)", nullptr, minutes_total); - return hours + tr(" and ") + minutes; - } - else { - // "val" is number of seconds. - int seconds_val = int(val); - int minutes_total = seconds_val / 60; - int seconds_total = seconds_val - (minutes_total * 60); - QString seconds = tr("%n second(s)", "", seconds_total); - QString minutes = tr("%n minute(s)", "", minutes_total); + return minutes + tr(" and ") + seconds; + } - return minutes + tr(" and ") + seconds; + case TimeSpinBox::Mode::DaysHours: { + // "val" is number of hours. + int hours_val = int(val); + int days_total = hours_val / 24; + int hours_total = hours_val - (days_total * 24); + QString hours = tr("%n hour(s)", nullptr, hours_total); + QString days = tr("%n day(s)", nullptr, days_total); + + return days + tr(" and ") + hours; + } + + default: + case TimeSpinBox::Mode::HoursMinutes: { + // "val" is number of minutes. + int minutes_total = int(val); + int minutes_val = minutes_total % 60; + int hours_val = (minutes_total - minutes_val) / 60; + QString hours = tr("%n hour(s)", nullptr, hours_val); + QString minutes = tr("%n minute(s)", nullptr, minutes_val); + + return hours + tr(" and ") + minutes; + } } } diff --git a/src/librssguard/gui/reusable/timespinbox.h b/src/librssguard/gui/reusable/timespinbox.h index cd8e4d4d2..9ed0e7341 100644 --- a/src/librssguard/gui/reusable/timespinbox.h +++ b/src/librssguard/gui/reusable/timespinbox.h @@ -6,12 +6,13 @@ #include class TimeSpinBox : public QDoubleSpinBox { - Q_OBJECT + Q_OBJECT public: enum class Mode { HoursMinutes, - MinutesSeconds + MinutesSeconds, + DaysHours }; explicit TimeSpinBox(QWidget* parent = nullptr); diff --git a/src/librssguard/gui/settings/settingsfeedsmessages.cpp b/src/librssguard/gui/settings/settingsfeedsmessages.cpp index a4d66ba04..32de3160b 100644 --- a/src/librssguard/gui/settings/settingsfeedsmessages.cpp +++ b/src/librssguard/gui/settings/settingsfeedsmessages.cpp @@ -22,6 +22,7 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent : SettingsPanel(settings, parent), m_ui(new Ui::SettingsFeedsMessages) { m_ui->setupUi(this); + m_ui->m_spinHoursAvoid->setMode(TimeSpinBox::Mode::DaysHours); m_ui->m_spinAutoUpdateInterval->setMode(TimeSpinBox::Mode::MinutesSeconds); m_ui->m_spinStartupUpdateDelay->setMode(TimeSpinBox::Mode::MinutesSeconds); @@ -204,6 +205,9 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent connect(m_ui->m_gbAvoidOldArticles, &QGroupBox::toggled, this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_dtDateTimeToAvoid, &QDateTimeEdit::dateTimeChanged, this, &SettingsFeedsMessages::dirtifySettings); + connect(m_ui->m_spinHoursAvoid, &TimeSpinBox::valueChanged, this, &SettingsFeedsMessages::dirtifySettings); + connect(m_ui->m_rbAvoidAbsolute, &QRadioButton::toggled, this, &SettingsFeedsMessages::dirtifySettings); + connect(m_ui->m_rbAvoidAbsolute, &QRadioButton::toggled, this, &SettingsFeedsMessages::dirtifySettings); m_ui->m_spinRelativeArticleTime->setValue(-1); } @@ -274,10 +278,27 @@ void SettingsFeedsMessages::loadSettings() { ->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateOnlyUnfocused)).toBool()); m_ui->m_spinAutoUpdateInterval->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateInterval)).toInt()); m_ui->m_spinFeedUpdateTimeout->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt()); + + m_ui->m_dtDateTimeToAvoid->setEnabled(false); + m_ui->m_spinHoursAvoid->setEnabled(false); + + QDateTime avoid_dt_barrier = + settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime(); + int avoid_hour_barrier = settings()->value(GROUP(Messages), SETTING(Messages::HoursToAvoidArticle)).toInt(); + + if (avoid_dt_barrier.isValid() && avoid_dt_barrier.toMSecsSinceEpoch() > 0) { + m_ui->m_rbAvoidAbsolute->setChecked(true); + m_ui->m_dtDateTimeToAvoid + ->setDateTime(settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime()); + } + else { + m_ui->m_rbAvoidRelative->setChecked(true); + m_ui->m_spinHoursAvoid->setValue(avoid_hour_barrier); + } + m_ui->m_gbAvoidOldArticles ->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::AvoidOldArticles)).toBool()); - m_ui->m_dtDateTimeToAvoid - ->setDateTime(settings()->value(GROUP(Messages), SETTING(Messages::DateTimeToAvoidArticle)).toDateTime()); + m_ui->m_cmbFastAutoUpdate->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::FastAutoUpdate)).toBool()); m_ui->m_checkUpdateAllFeedsOnStartup ->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateOnStartup)).toBool()); @@ -386,8 +407,18 @@ void SettingsFeedsMessages::saveSettings() { settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateOnlyUnfocused, m_ui->m_checkAutoUpdateOnlyUnfocused->isChecked()); settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateInterval, m_ui->m_spinAutoUpdateInterval->value()); settings()->setValue(GROUP(Feeds), Feeds::UpdateTimeout, m_ui->m_spinFeedUpdateTimeout->value()); + settings()->setValue(GROUP(Messages), Messages::AvoidOldArticles, m_ui->m_gbAvoidOldArticles->isChecked()); - settings()->setValue(GROUP(Messages), Messages::DateTimeToAvoidArticle, m_ui->m_dtDateTimeToAvoid->dateTime()); + + if (m_ui->m_rbAvoidAbsolute->isChecked()) { + settings()->setValue(GROUP(Messages), Messages::DateTimeToAvoidArticle, m_ui->m_dtDateTimeToAvoid->dateTime()); + settings()->setValue(GROUP(Messages), Messages::HoursToAvoidArticle, 0); + } + else if (m_ui->m_rbAvoidRelative->isChecked()) { + settings()->setValue(GROUP(Messages), Messages::DateTimeToAvoidArticle, QDateTime()); + settings()->setValue(GROUP(Messages), Messages::HoursToAvoidArticle, m_ui->m_spinHoursAvoid->value()); + } + settings()->setValue(GROUP(Feeds), Feeds::FastAutoUpdate, m_ui->m_cmbFastAutoUpdate->isChecked()); settings()->setValue(GROUP(Feeds), Feeds::FeedsUpdateOnStartup, m_ui->m_checkUpdateAllFeedsOnStartup->isChecked()); settings()->setValue(GROUP(Feeds), Feeds::FeedsUpdateStartupDelay, m_ui->m_spinStartupUpdateDelay->value()); @@ -395,7 +426,9 @@ void SettingsFeedsMessages::saveSettings() { settings()->setValue(GROUP(Feeds), Feeds::EnableTooltipsFeedsMessages, m_ui->m_checkShowTooltips->isChecked()); settings()->setValue(GROUP(Messages), Messages::IgnoreContentsChanges, m_ui->m_cmbIgnoreContentsChanges->isChecked()); settings()->setValue(GROUP(Messages), Messages::MultilineArticleList, m_ui->m_checkMultilineArticleList->isChecked()); - settings()->setValue(GROUP(Messages), Messages::LimitArticleImagesHeight, m_ui->m_spinHeightImageAttachments->value()); + settings()->setValue(GROUP(Messages), + Messages::LimitArticleImagesHeight, + m_ui->m_spinHeightImageAttachments->value()); settings()->setValue(GROUP(Messages), Messages::DisplayEnclosuresInMessage, m_ui->m_cbShowEnclosuresDirectly->isChecked()); diff --git a/src/librssguard/gui/settings/settingsfeedsmessages.ui b/src/librssguard/gui/settings/settingsfeedsmessages.ui index 396e58100..d54523a8c 100644 --- a/src/librssguard/gui/settings/settingsfeedsmessages.ui +++ b/src/librssguard/gui/settings/settingsfeedsmessages.ui @@ -131,17 +131,57 @@ true - false + true - + + + + 1 + 0 + + + + + 1971 + 1 + 1 + + true - + + + + + 1 + 0 + + + + 10000.000000000000000 + + + + + + + Absolute date/time + + + + + + + Relative time + + + + Qt::Horizontal @@ -154,6 +194,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -656,17 +709,17 @@ + + TimeSpinBox + QDoubleSpinBox +
timespinbox.h
+
HelpSpoiler QWidget
helpspoiler.h
1
- - TimeSpinBox - QDoubleSpinBox -
timespinbox.h
-
m_checkUpdateAllFeedsOnStartup @@ -706,8 +759,40 @@ m_gbFeedListFont m_gbArticleListFont m_gbAvoidOldArticles - m_dtDateTimeToAvoid - + + + m_rbAvoidAbsolute + toggled(bool) + m_dtDateTimeToAvoid + setEnabled(bool) + + + 92 + 215 + + + 326 + 215 + + + + + m_rbAvoidRelative + toggled(bool) + m_spinHoursAvoid + setEnabled(bool) + + + 92 + 243 + + + 326 + 243 + + + + diff --git a/src/librssguard/miscellaneous/settings.cpp b/src/librssguard/miscellaneous/settings.cpp index d647ab9b9..c17a8092a 100644 --- a/src/librssguard/miscellaneous/settings.cpp +++ b/src/librssguard/miscellaneous/settings.cpp @@ -152,6 +152,9 @@ DVALUE(bool) Messages::AvoidOldArticlesDef = false; DKEY Messages::DateTimeToAvoidArticle = "datetime_to_avoid_article"; DVALUE(QDateTime) Messages::DateTimeToAvoidArticleDef = QDateTime::currentDateTime(); +DKEY Messages::HoursToAvoidArticle = "hours_to_avoid_article"; +DVALUE(int) Messages::HoursToAvoidArticleDef = 0; + DKEY Messages::AlwaysDisplayItemPreview = "always_display_preview"; DVALUE(bool) Messages::AlwaysDisplayItemPreviewDef = true; diff --git a/src/librssguard/miscellaneous/settings.h b/src/librssguard/miscellaneous/settings.h index 75d1cea2a..88ad16dcd 100644 --- a/src/librssguard/miscellaneous/settings.h +++ b/src/librssguard/miscellaneous/settings.h @@ -149,6 +149,9 @@ namespace Messages { KEY DateTimeToAvoidArticle; VALUE(QDateTime) DateTimeToAvoidArticleDef; + KEY HoursToAvoidArticle; + VALUE(int) HoursToAvoidArticleDef; + KEY AlwaysDisplayItemPreview; VALUE(bool) AlwaysDisplayItemPreviewDef; diff --git a/src/librssguard/network-web/basenetworkaccessmanager.cpp b/src/librssguard/network-web/basenetworkaccessmanager.cpp index e1d18cd3a..50821df41 100644 --- a/src/librssguard/network-web/basenetworkaccessmanager.cpp +++ b/src/librssguard/network-web/basenetworkaccessmanager.cpp @@ -77,5 +77,15 @@ QNetworkReply* BaseNetworkAccessManager::createRequest(QNetworkAccessManager::Op } auto reply = QNetworkAccessManager::createRequest(op, new_request, outgoingData); + + auto ssl_conf = reply->sslConfiguration(); + + auto aa = ssl_conf.backendConfiguration(); + + ssl_conf.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone); + ssl_conf.setSslOption(QSsl::SslOption::SslOptionDisableLegacyRenegotiation, false); + + reply->setSslConfiguration(ssl_conf); + return reply; } diff --git a/src/librssguard/services/abstract/feed.cpp b/src/librssguard/services/abstract/feed.cpp index 1957cb347..0193251ae 100644 --- a/src/librssguard/services/abstract/feed.cpp +++ b/src/librssguard/services/abstract/feed.cpp @@ -16,8 +16,8 @@ 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(TextFactory::parseDateTime(0)), m_messageFilters(QList>()) { + m_openArticlesDirectly(false), m_isRtl(false), m_addAnyDatetimeArticles(false), m_datetimeToAvoid(QDateTime()), + m_hoursToAvoid(0), m_messageFilters(QList>()) { setKind(RootItem::Kind::Feed); } @@ -41,6 +41,7 @@ Feed::Feed(const Feed& other) : RootItem(other) { setOpenArticlesDirectly(other.openArticlesDirectly()); setAddAnyDatetimeArticles(other.addAnyDatetimeArticles()); setDatetimeToAvoid(other.datetimeToAvoid()); + setHoursToAvoid(other.hoursToAvoid()); setIsRtl(other.isRtl()); setIsSwitchedOff(other.isSwitchedOff()); setIsQuiet(other.isQuiet()); @@ -312,6 +313,14 @@ QString Feed::getStatusDescription() const { } } +int Feed::hoursToAvoid() const { + return m_hoursToAvoid; +} + +void Feed::setHoursToAvoid(int hours_to_avoid) { + m_hoursToAvoid = hours_to_avoid; +} + bool Feed::isQuiet() const { return m_isQuiet; } diff --git a/src/librssguard/services/abstract/feed.h b/src/librssguard/services/abstract/feed.h index 5a68b68f5..6dbff32b2 100644 --- a/src/librssguard/services/abstract/feed.h +++ b/src/librssguard/services/abstract/feed.h @@ -97,6 +97,9 @@ class Feed : public RootItem { QDateTime datetimeToAvoid() const; void setDatetimeToAvoid(const QDateTime& dt); + int hoursToAvoid() const; + void setHoursToAvoid(int hours_to_avoid); + public slots: virtual void updateCounts(bool including_total_count); @@ -115,9 +118,14 @@ class Feed : public RootItem { bool m_isQuiet; bool m_openArticlesDirectly; bool m_isRtl; - bool m_addAnyDatetimeArticles; + // 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; + int m_totalCount{}; int m_unreadCount{}; QList> m_messageFilters; diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.cpp b/src/librssguard/services/abstract/gui/formfeeddetails.cpp index 19dafd509..f3429e641 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.cpp +++ b/src/librssguard/services/abstract/gui/formfeeddetails.cpp @@ -60,8 +60,20 @@ void FormFeedDetails::apply() { } if (isChangeAllowed(m_ui.m_mcbAvoidOldArticles)) { - fd->setDatetimeToAvoid(m_ui.m_gbAvoidOldArticles->isChecked() ? m_ui.m_dtDateTimeToAvoid->dateTime() - : TextFactory::parseDateTime(0)); + if (m_ui.m_gbAvoidOldArticles->isChecked()) { + if (m_ui.m_rbAvoidAbsolute->isChecked()) { + fd->setDatetimeToAvoid(m_ui.m_dtDateTimeToAvoid->dateTime()); + fd->setHoursToAvoid(0); + } + else { + fd->setDatetimeToAvoid({}); + fd->setHoursToAvoid(m_ui.m_spinHoursAvoid->value()); + } + } + else { + fd->setDatetimeToAvoid({}); + fd->setHoursToAvoid(0); + } } if (isChangeAllowed(m_ui.m_mcbDisableFeed)) { @@ -158,10 +170,20 @@ void FormFeedDetails::loadFeedData() { m_ui.m_cbOpenArticlesAutomatically->setChecked(fd->openArticlesDirectly()); m_ui.m_cbFeedRTL->setChecked(fd->isRtl()); m_ui.m_cbAddAnyDateArticles->setChecked(fd->addAnyDatetimeArticles()); - m_ui.m_gbAvoidOldArticles->setChecked(fd->datetimeToAvoid().toMSecsSinceEpoch() > 0); + m_ui.m_gbAvoidOldArticles->setChecked((fd->datetimeToAvoid().isValid() && + fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) || + fd->hoursToAvoid() > 0); m_ui.m_dtDateTimeToAvoid->setDateTime(fd->datetimeToAvoid()); + m_ui.m_spinHoursAvoid->setValue(fd->hoursToAvoid()); m_ui.m_cbDisableFeed->setChecked(fd->isSwitchedOff()); m_ui.m_cbSuppressFeed->setChecked(fd->isQuiet()); + + if (fd->datetimeToAvoid().isValid() && fd->datetimeToAvoid().toMSecsSinceEpoch() > 0) { + m_ui.m_rbAvoidAbsolute->setChecked(true); + } + else { + m_ui.m_rbAvoidRelative->setChecked(true); + } } void FormFeedDetails::acceptIfPossible() { @@ -183,6 +205,9 @@ void FormFeedDetails::acceptIfPossible() { void FormFeedDetails::initialize() { m_ui.setupUi(this); + m_ui.m_dtDateTimeToAvoid->setEnabled(false); + m_ui.m_spinHoursAvoid->setEnabled(false); + m_ui.m_spinHoursAvoid->setMode(TimeSpinBox::Mode::DaysHours); m_ui.m_dtDateTimeToAvoid ->setDisplayFormat(qApp->localization()->loadedLocale().dateTimeFormat(QLocale::FormatType::ShortFormat)); diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.ui b/src/librssguard/services/abstract/gui/formfeeddetails.ui index fd5538426..2f924a859 100644 --- a/src/librssguard/services/abstract/gui/formfeeddetails.ui +++ b/src/librssguard/services/abstract/gui/formfeeddetails.ui @@ -125,23 +125,60 @@ true - Avoid adding articles before this date into the database + Avoid adding articles before this date/time into the database true - - false - - + + + + 1 + 0 + + + + + 1971 + 1 + 1 + + true - + + + + Absolute date/time + + + + + + + + 1 + 0 + + + + 10000.000000000000000 + + + + + + + Relative time + + + + Qt::Horizontal @@ -154,6 +191,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -266,5 +316,37 @@ + + m_rbAvoidAbsolute + toggled(bool) + m_dtDateTimeToAvoid + setEnabled(bool) + + + 112 + 487 + + + 233 + 487 + + + + + m_rbAvoidRelative + toggled(bool) + m_spinHoursAvoid + setEnabled(bool) + + + 112 + 515 + + + 233 + 515 + + + diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 104e23e8c..2e4b87469 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -493,7 +493,10 @@ QMap ServiceRoot::storeCustomFeedsData() { 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("datetime_to_avoid"), feed->datetimeToAvoid().toMSecsSinceEpoch()); + 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 @@ -545,10 +548,15 @@ void ServiceRoot::restoreCustomFeedsData(const QMap& data, feed->setOpenArticlesDirectly(feed_custom_data.value(QSL("open_articles_directly")).toBool()); feed->setIsRtl(feed_custom_data.value(QSL("is_rtl")).toBool()); feed->setAddAnyDatetimeArticles(feed_custom_data.value(QSL("add_any_datetime_articles")).toBool()); - feed->setDatetimeToAvoid(TextFactory::parseDateTime(feed_custom_data.value(QSL("datetime_to_avoid")) - .value())); - // qDebugNN << feed->datetimeToAvoid().toString(); + qint64 time_to_avoid = feed_custom_data.value(QSL("datetime_to_avoid")).value(); + + if (time_to_avoid > 10000) { + feed->setDatetimeToAvoid(TextFactory::parseDateTime(time_to_avoid)); + } + else { + feed->setHoursToAvoid(time_to_avoid); + } } } }