make sure selected item does not disappear in some cases when filtering

This commit is contained in:
Martin Rotter 2022-01-03 09:05:09 +01:00
parent af19e5376a
commit 4de3db8000
3 changed files with 20 additions and 3 deletions

View File

@ -4,6 +4,7 @@
#include "core/feedsmodel.h" #include "core/feedsmodel.h"
#include "definitions/definitions.h" #include "definitions/definitions.h"
#include "gui/feedsview.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/regexfactory.h" #include "miscellaneous/regexfactory.h"
#include "services/abstract/rootitem.h" #include "services/abstract/rootitem.h"
@ -11,7 +12,8 @@
#include <QTimer> #include <QTimer>
FeedsProxyModel::FeedsProxyModel(FeedsModel* source_model, QObject* parent) FeedsProxyModel::FeedsProxyModel(FeedsModel* source_model, QObject* parent)
: QSortFilterProxyModel(parent), m_sourceModel(source_model), m_selectedItem(nullptr), m_showUnreadOnly(false) { : QSortFilterProxyModel(parent), m_sourceModel(source_model), m_view(nullptr),
m_selectedItem(nullptr), m_showUnreadOnly(false) {
setObjectName(QSL("FeedsProxyModel")); setObjectName(QSL("FeedsProxyModel"));
setSortRole(Qt::ItemDataRole::EditRole); setSortRole(Qt::ItemDataRole::EditRole);
@ -243,12 +245,22 @@ bool FeedsProxyModel::filterAcceptsRowInternal(int source_row, const QModelIndex
else { else {
// NOTE: If item has < 0 of unread message it may mean, that the count // NOTE: If item has < 0 of unread message it may mean, that the count
// of unread messages is not (yet) known, display that item too. // of unread messages is not (yet) known, display that item too.
//
// Also, the actual selected item should not be filtered out too.
// This is primarily to make sure that the selection does not "vanish", this
// particularly manifests itself if user uses "next unread item" action and
// "show unread only" is enabled too and user for example selects last unread
// article in a feed -> then the feed would disappear from list suddenly.
return return
item->countOfUnreadMessages() != 0 && m_selectedItem == item || (item->countOfUnreadMessages() != 0 &&
QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent));
} }
} }
void FeedsProxyModel::setView(FeedsView* newView) {
m_view = newView;
}
const RootItem* FeedsProxyModel::selectedItem() const { const RootItem* FeedsProxyModel::selectedItem() const {
return m_selectedItem; return m_selectedItem;
} }

View File

@ -8,6 +8,7 @@
#include "services/abstract/rootitem.h" #include "services/abstract/rootitem.h"
class FeedsModel; class FeedsModel;
class FeedsView;
class FeedsProxyModel : public QSortFilterProxyModel { class FeedsProxyModel : public QSortFilterProxyModel {
Q_OBJECT Q_OBJECT
@ -29,6 +30,7 @@ class FeedsProxyModel : public QSortFilterProxyModel {
const RootItem* selectedItem() const; const RootItem* selectedItem() const;
void setSelectedItem(const RootItem* selected_item); void setSelectedItem(const RootItem* selected_item);
void setView(FeedsView* newView);
public slots: public slots:
void invalidateReadFeedsFilter(bool set_new_value = false, bool show_unread_only = false); void invalidateReadFeedsFilter(bool set_new_value = false, bool show_unread_only = false);
@ -45,6 +47,7 @@ class FeedsProxyModel : public QSortFilterProxyModel {
// Source model pointer. // Source model pointer.
FeedsModel* m_sourceModel; FeedsModel* m_sourceModel;
FeedsView* m_view;
const RootItem* m_selectedItem; const RootItem* m_selectedItem;
bool m_showUnreadOnly; bool m_showUnreadOnly;
QList<QPair<int, QModelIndex>> m_hiddenIndices; QList<QPair<int, QModelIndex>> m_hiddenIndices;

View File

@ -37,6 +37,8 @@ FeedsView::FeedsView(QWidget* parent)
m_sourceModel = qApp->feedReader()->feedsModel(); m_sourceModel = qApp->feedReader()->feedsModel();
m_proxyModel = qApp->feedReader()->feedsProxyModel(); m_proxyModel = qApp->feedReader()->feedsProxyModel();
m_proxyModel->setView(this);
// Connections. // Connections.
connect(m_sourceModel, &FeedsModel::requireItemValidationAfterDragDrop, this, &FeedsView::validateItemAfterDragDrop); connect(m_sourceModel, &FeedsModel::requireItemValidationAfterDragDrop, this, &FeedsView::validateItemAfterDragDrop);
connect(m_sourceModel, &FeedsModel::itemExpandRequested, this, &FeedsView::onItemExpandRequested); connect(m_sourceModel, &FeedsModel::itemExpandRequested, this, &FeedsView::onItemExpandRequested);