From 521d6418fbcad448d2b9c3400a43b06d31fe2d50 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 14 Feb 2022 15:10:28 +0100 Subject: [PATCH] fix #608 --- src/librssguard/core/messagesmodel.cpp | 36 +++++++++++-- src/librssguard/core/messagesmodel.h | 1 + src/librssguard/gui/dialogs/formmain.cpp | 4 ++ .../gui/settings/settingsfeedsmessages.cpp | 22 ++++++++ .../gui/settings/settingsfeedsmessages.ui | 51 ++++++++++++------- src/librssguard/miscellaneous/settings.cpp | 3 ++ src/librssguard/miscellaneous/settings.h | 3 ++ 7 files changed, 100 insertions(+), 20 deletions(-) diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 992f86ad8..0294f1a13 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -23,7 +23,8 @@ MessagesModel::MessagesModel(QObject* parent) : QSqlQueryModel(parent), m_view(nullptr), m_cache(new MessagesModelCache(this)), m_messageHighlighter(MessageHighlighter::NoHighlighting), - m_customDateFormat(QString()), m_customTimeFormat(QString()), m_selectedItem(nullptr), m_displayFeedIcons(false), + m_customDateFormat(QString()), m_customTimeFormat(QString()), m_newerArticlesRelativeTime(-1), + m_selectedItem(nullptr), m_displayFeedIcons(false), m_multilineListItems(qApp->settings()->value(GROUP(Messages), SETTING(Messages::MultilineArticleList)).toBool()) { setupFonts(); setupIcons(); @@ -203,6 +204,9 @@ void MessagesModel::updateDateFormat() { else { m_customTimeFormat = QString(); } + + m_newerArticlesRelativeTime = qApp->settings()->value(GROUP(Messages), + SETTING(Messages::RelativeTimeForNewerArticles)).toInt(); } void MessagesModel::updateFeedIconsDisplay() { @@ -305,9 +309,35 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const { int index_column = idx.column(); if (index_column == MSG_DB_DCREATED_INDEX) { - QDateTime dt = TextFactory::parseDateTime(QSqlQueryModel::data(idx, role).value()).toLocalTime(); + QDateTime dt = TextFactory::parseDateTime(QSqlQueryModel::data(idx, + Qt::ItemDataRole::EditRole).value()).toLocalTime(); - if (dt.date() == QDate::currentDate() && !m_customTimeFormat.isEmpty()) { + if (m_newerArticlesRelativeTime > 0 && + dt.daysTo(QDateTime::currentDateTime()) <= m_newerArticlesRelativeTime) { + auto secs_difference = dt.secsTo(QDateTime::currentDateTime()); + + if (secs_difference >= 604800) { + // More than 1 week. + return tr("%1 weeks ago").arg(secs_difference / 604800); + } + else if (secs_difference >= 172800) { + // At least 2 days. + return tr("%1 days ago").arg(secs_difference / 86400); + } + else if (secs_difference >= 86400) { + // 1 day. + return tr("1 day ago"); + } + else if (secs_difference >= 3600) { + // Less than a day. + return tr("%1 hours ago").arg(secs_difference / 3600); + } + else { + // Less then 1 hour ago. + return tr("%1 minutes ago").arg(secs_difference / 60); + } + } + else if (dt.date() == QDate::currentDate() && !m_customTimeFormat.isEmpty()) { return dt.toString(m_customTimeFormat); } else if (m_customDateFormat.isEmpty()) { diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index b03055a5f..05a9a7c7c 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -97,6 +97,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { MessageHighlighter m_messageHighlighter; QString m_customDateFormat; QString m_customTimeFormat; + int m_newerArticlesRelativeTime; RootItem* m_selectedItem; QList m_headerData; QList m_tooltipData; diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 577537ec8..11becc9de 100644 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -88,6 +88,10 @@ FormMain::FormMain(QWidget* parent, Qt::WindowFlags f) m_actionToolbarMainMenu->setText(tr("Open &main menu")); m_actionToolbarMainMenu->setObjectName("m_actionToolbarMainMenu"); + connect(m_actionToolbarMainMenu, &QWidgetAction::triggered, this, [this]() { + qobject_cast(m_actionToolbarMainMenu->defaultWidget())->menu()->exec(); + }); + #if defined(USE_WEBENGINE) m_ui->m_menuWebBrowserTabs->addAction(qApp->web()->adBlock()->adBlockIcon()); m_ui->m_menuWebBrowserTabs->addAction(qApp->web()->engineSettingsAction()); diff --git a/src/librssguard/gui/settings/settingsfeedsmessages.cpp b/src/librssguard/gui/settings/settingsfeedsmessages.cpp index b24d106f0..53e148aab 100644 --- a/src/librssguard/gui/settings/settingsfeedsmessages.cpp +++ b/src/librssguard/gui/settings/settingsfeedsmessages.cpp @@ -52,6 +52,15 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent connect(m_ui->m_checkDisplayPlaceholders, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings); #endif + connect(m_ui->m_spinRelativeArticleTime, QOverload::of(&QSpinBox::valueChanged), this, [=](int value) { + if (value <= 0) { + m_ui->m_spinRelativeArticleTime->setSuffix(QSL(" ") + tr("days (turned off)")); + } + else { + m_ui->m_spinRelativeArticleTime->setSuffix(QSL(" ") + tr("day(s)", nullptr, value)); + } + }); + connect(m_ui->m_cbListsRestrictedShortcuts, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_cmbIgnoreContentsChanges, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_cbHideCountsIfNoUnread, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings); @@ -73,18 +82,27 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_spinStartupUpdateDelay, static_cast(&QDoubleSpinBox::valueChanged), this, &SettingsFeedsMessages::dirtifySettings); + connect(m_ui->m_spinHeightRowsMessages, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_spinHeightRowsMessages, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::requireRestart); + connect(m_ui->m_spinHeightRowsFeeds, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_spinHeightRowsFeeds, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::requireRestart); + connect(m_ui->m_spinPaddingRowsMessages, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::dirtifySettings); connect(m_ui->m_spinPaddingRowsMessages, static_cast(&QSpinBox::valueChanged), this, &SettingsFeedsMessages::requireRestart); + + connect(m_ui->m_spinRelativeArticleTime, static_cast(&QSpinBox::valueChanged), + this, &SettingsFeedsMessages::dirtifySettings); + connect(m_ui->m_spinRelativeArticleTime, static_cast(&QSpinBox::valueChanged), + this, &SettingsFeedsMessages::requireRestart); + connect(m_ui->m_checkAutoUpdate, &QCheckBox::toggled, m_ui->m_spinAutoUpdateInterval, &TimeSpinBox::setEnabled); connect(m_ui->m_checkUpdateAllFeedsOnStartup, &QCheckBox::toggled, m_ui->m_spinStartupUpdateDelay, &TimeSpinBox::setEnabled); connect(m_ui->m_spinFeedUpdateTimeout, static_cast(&QSpinBox::valueChanged), this, @@ -125,6 +143,8 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent if (!m_ui->m_spinFeedUpdateTimeout->suffix().startsWith(' ')) { m_ui->m_spinFeedUpdateTimeout->setSuffix(QSL(" ") + m_ui->m_spinFeedUpdateTimeout->suffix()); } + + m_ui->m_spinRelativeArticleTime->setValue(-1); } SettingsFeedsMessages::~SettingsFeedsMessages() { @@ -162,6 +182,7 @@ void SettingsFeedsMessages::changeFont(QLabel& lbl) { void SettingsFeedsMessages::loadSettings() { onBeginLoadSettings(); + m_ui->m_spinRelativeArticleTime->setValue(settings()->value(GROUP(Messages), SETTING(Messages::RelativeTimeForNewerArticles)).toInt()); m_ui->m_spinPaddingRowsMessages->setValue(settings()->value(GROUP(Messages), SETTING(Messages::ArticleListPadding)).toInt()); m_ui->m_spinHeightRowsMessages->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowMessages)).toInt()); m_ui->m_spinHeightRowsFeeds->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowFeeds)).toInt()); @@ -234,6 +255,7 @@ void SettingsFeedsMessages::loadSettings() { void SettingsFeedsMessages::saveSettings() { onBeginSaveSettings(); + settings()->setValue(GROUP(Messages), Messages::RelativeTimeForNewerArticles, m_ui->m_spinRelativeArticleTime->value()); settings()->setValue(GROUP(Messages), Messages::ArticleListPadding, m_ui->m_spinPaddingRowsMessages->value()); settings()->setValue(GROUP(GUI), GUI::HeightRowMessages, m_ui->m_spinHeightRowsMessages->value()); settings()->setValue(GROUP(GUI), GUI::HeightRowFeeds, m_ui->m_spinHeightRowsFeeds->value()); diff --git a/src/librssguard/gui/settings/settingsfeedsmessages.ui b/src/librssguard/gui/settings/settingsfeedsmessages.ui index f96f9c413..f570f286e 100644 --- a/src/librssguard/gui/settings/settingsfeedsmessages.ui +++ b/src/librssguard/gui/settings/settingsfeedsmessages.ui @@ -418,6 +418,13 @@ + + + + Enable multiline items + + + @@ -538,20 +545,7 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - - + Article list font @@ -577,10 +571,33 @@ - - + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - Enable multiline items + Show relative time for articles not older than + + + + + + + -1 + + + 300 diff --git a/src/librssguard/miscellaneous/settings.cpp b/src/librssguard/miscellaneous/settings.cpp index e671cd59c..98037cadf 100644 --- a/src/librssguard/miscellaneous/settings.cpp +++ b/src/librssguard/miscellaneous/settings.cpp @@ -130,6 +130,9 @@ DVALUE(bool) Messages::UseCustomDateDef = false; DKEY Messages::CustomDateFormat = "custom_date_format"; DVALUE(char*) Messages::CustomDateFormatDef = ""; +DKEY Messages::RelativeTimeForNewerArticles = "relative_time_for_new_articles"; +DVALUE(int) Messages::RelativeTimeForNewerArticlesDef = -1; + DKEY Messages::ArticleListPadding = "article_list_padding"; DVALUE(int) Messages::ArticleListPaddingDef = -1; diff --git a/src/librssguard/miscellaneous/settings.h b/src/librssguard/miscellaneous/settings.h index d1e9a840a..72fb1d76a 100644 --- a/src/librssguard/miscellaneous/settings.h +++ b/src/librssguard/miscellaneous/settings.h @@ -138,6 +138,9 @@ namespace Messages { KEY UseCustomTime; VALUE(bool) UseCustomTimeDef; + KEY RelativeTimeForNewerArticles; + VALUE(int) RelativeTimeForNewerArticlesDef; + KEY ArticleListPadding; VALUE(int) ArticleListPaddingDef;