From 66d70f2b7fea1ec121bbbe3da3c94251a83c04f4 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 22 May 2024 09:59:58 +0200 Subject: [PATCH] fix #1415 --- src/librssguard/core/messagesmodel.cpp | 15 +++++++++------ src/librssguard/core/messagesmodel.h | 2 +- src/librssguard/core/messagesmodelsqllayer.cpp | 13 +++++++++++-- src/librssguard/core/messagesmodelsqllayer.h | 2 +- src/librssguard/core/messagesproxymodel.cpp | 17 ++++++++++++++++- src/librssguard/core/messagesproxymodel.h | 4 ++++ src/librssguard/gui/messagesview.cpp | 10 +++++++--- src/librssguard/gui/messagesview.h | 3 ++- 8 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 95914a8e3..03e6ef86b 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -142,21 +142,24 @@ MessagesModelCache* MessagesModel::cache() const { return m_cache; } -void MessagesModel::repopulate() { +void MessagesModel::repopulate(int additional_article_id) { m_cache->clear(); - setQuery(selectStatement(), m_db); + + QString statemnt = selectStatement(additional_article_id); + + setQuery(statemnt, m_db); if (lastError().isValid()) { - qCriticalNN << LOGSEC_MESSAGEMODEL << "Error when setting new msg view query: '" << lastError().text() << "'."; - qCriticalNN << LOGSEC_MESSAGEMODEL << "Used SQL select statement: '" << selectStatement() << "'."; + qCriticalNN << LOGSEC_MESSAGEMODEL + << "Error when setting new msg view query:" << QUOTE_W_SPACE_DOT(lastError().text()); + qCriticalNN << LOGSEC_MESSAGEMODEL << "Used SQL select statement:" << QUOTE_W_SPACE_DOT(statemnt); } while (canFetchMore()) { fetchMore(); } - qDebugNN << LOGSEC_MESSAGEMODEL << "Repopulated model, SQL statement is now:\n" - << QUOTE_W_SPACE_DOT(selectStatement()); + qDebugNN << LOGSEC_MESSAGEMODEL << "Repopulated model, SQL statement is now:\n" << QUOTE_W_SPACE_DOT(statemnt); } bool MessagesModel::setData(const QModelIndex& idx, const QVariant& value, int role) { diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index c32a55f58..c5a79067e 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -41,7 +41,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { // Fetches ALL available data to the model. // NOTE: This activates the SQL query and populates the model with new data. - void repopulate(); + void repopulate(int additional_article_id = 0); // Model implementation. bool setData(const QModelIndex& idx, const QVariant& value, int role = Qt::EditRole); diff --git a/src/librssguard/core/messagesmodelsqllayer.cpp b/src/librssguard/core/messagesmodelsqllayer.cpp index a3cbe2ae0..5dba04672 100644 --- a/src/librssguard/core/messagesmodelsqllayer.cpp +++ b/src/librssguard/core/messagesmodelsqllayer.cpp @@ -96,12 +96,21 @@ bool MessagesModelSqlLayer::isColumnNumeric(int column_id) const { return m_numericColumns.contains(column_id); } -QString MessagesModelSqlLayer::selectStatement() const { +QString MessagesModelSqlLayer::selectStatement(int additional_article_id) const { + QString fltr; + + if (additional_article_id <= 0) { + fltr = m_filter; + } + else { + fltr = QSL("(%1) OR Messages.id = %2").arg(m_filter, QString::number(additional_article_id)); + } + return QL1S("SELECT ") + formatFields() + QL1C(' ') + QL1S("FROM Messages LEFT JOIN Feeds ON Messages.feed = Feeds.custom_id AND Messages.account_id = " "Feeds.account_id " "WHERE ") + - m_filter + orderByClause() + QL1C(';'); + fltr + orderByClause() + QL1C(';'); } QString MessagesModelSqlLayer::orderByClause() const { diff --git a/src/librssguard/core/messagesmodelsqllayer.h b/src/librssguard/core/messagesmodelsqllayer.h index 249f2ba13..0193b4ae1 100644 --- a/src/librssguard/core/messagesmodelsqllayer.h +++ b/src/librssguard/core/messagesmodelsqllayer.h @@ -27,7 +27,7 @@ class MessagesModelSqlLayer { protected: QString orderByClause() const; - QString selectStatement() const; + QString selectStatement(int additional_article_id = -1) const; QString formatFields() const; bool isColumnNumeric(int column_id) const; diff --git a/src/librssguard/core/messagesproxymodel.cpp b/src/librssguard/core/messagesproxymodel.cpp index 682021044..78ffacab1 100644 --- a/src/librssguard/core/messagesproxymodel.cpp +++ b/src/librssguard/core/messagesproxymodel.cpp @@ -11,7 +11,8 @@ #include MessagesProxyModel::MessagesProxyModel(MessagesModel* source_model, QObject* parent) - : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_filter(MessageListFilter::NoFiltering) { + : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_filter(MessageListFilter::NoFiltering), + m_additionalArticleId(0) { setObjectName(QSL("MessagesProxyModel")); initializeFilters(); @@ -118,6 +119,11 @@ bool MessagesProxyModel::filterAcceptsMessage(int msg_row_index) const { if (m_filter == MessageListFilter::NoFiltering) { return true; } + else if (m_additionalArticleId > 0 && + m_sourceModel->data(msg_row_index, MSG_DB_ID_INDEX, Qt::ItemDataRole::EditRole).toInt() == + m_additionalArticleId) { + return true; + } for (MessageListFilter val : m_filterKeys) { if (Globals::hasFlag(m_filter, val) && m_filters[val](msg_row_index)) { @@ -225,8 +231,17 @@ bool MessagesProxyModel::filterAcceptsRow(int source_row, const QModelIndex& sou (m_sourceModel->cache()->containsData(source_row) || filterAcceptsMessage(source_row)); } +int MessagesProxyModel::additionalArticleId() const { + return m_additionalArticleId; +} + +void MessagesProxyModel::setAdditionalArticleId(int newAdditionalArticleId) { + m_additionalArticleId = newAdditionalArticleId; +} + void MessagesProxyModel::setMessageListFilter(MessageListFilter filter) { m_filter = filter; + m_additionalArticleId = 0; } QModelIndexList MessagesProxyModel::mapListFromSource(const QModelIndexList& indexes, bool deep) const { diff --git a/src/librssguard/core/messagesproxymodel.h b/src/librssguard/core/messagesproxymodel.h index ff1075651..9349ee622 100644 --- a/src/librssguard/core/messagesproxymodel.h +++ b/src/librssguard/core/messagesproxymodel.h @@ -52,6 +52,9 @@ class MessagesProxyModel : public QSortFilterProxyModel { // Performs sort of items. virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); + int additionalArticleId() const; + void setAdditionalArticleId(int newAdditionalArticleId); + private: void initializeFilters(); @@ -68,6 +71,7 @@ class MessagesProxyModel : public QSortFilterProxyModel { MessageListFilter m_filter; QMap> m_filters; QList m_filterKeys; + int m_additionalArticleId; }; Q_DECLARE_METATYPE(MessagesProxyModel::MessageListFilter) diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index 34b96b14b..fe7fac94f 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -175,15 +175,17 @@ void MessagesView::sort(int column, bool repopulate_data, bool change_header, bool emit_changed_from_header, - bool ignore_multicolumn_sorting) { + bool ignore_multicolumn_sorting, + int additional_article_id) { if (change_header && !emit_changed_from_header) { header()->blockSignals(true); } m_sourceModel->addSortState(column, order, ignore_multicolumn_sorting); + m_proxyModel->setAdditionalArticleId(additional_article_id); if (repopulate_data) { - m_sourceModel->repopulate(); + m_sourceModel->repopulate(additional_article_id); } if (change_header) { @@ -209,6 +211,8 @@ void MessagesView::keyboardSearch(const QString& search) { } void MessagesView::reloadSelections() { + bool force_load_currently_selected_article = true; + const QDateTime dt1 = QDateTime::currentDateTime(); QModelIndex current_index = selectionModel()->currentIndex(); const bool is_current_selected = @@ -221,7 +225,7 @@ void MessagesView::reloadSelections() { bool do_not_mark_read_on_select = false; // Reload the model now. - sort(col, ord, true, false, false, true); + sort(col, ord, true, false, false, true, force_load_currently_selected_article ? selected_message_id : 0); // Now, we must find the same previously focused message. if (selected_message_id > 0) { diff --git a/src/librssguard/gui/messagesview.h b/src/librssguard/gui/messagesview.h index b7dc31a83..af0d4f30f 100644 --- a/src/librssguard/gui/messagesview.h +++ b/src/librssguard/gui/messagesview.h @@ -120,7 +120,8 @@ class MessagesView : public BaseTreeView { bool repopulate_data, bool change_header, bool emit_changed_from_header, - bool ignore_multicolumn_sorting); + bool ignore_multicolumn_sorting, + int additional_article_id = 0); // Creates needed connections. void createConnections();