From 7fa4488fb97c2a6fbec287328fc7d5c16190c5c2 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 1 Jan 2022 17:36:52 +0100 Subject: [PATCH] some preps for select next imp article --- src/librssguard/core/messagesproxymodel.cpp | 35 ++++++++++++- src/librssguard/core/messagesproxymodel.h | 2 + src/librssguard/gui/messagesview.cpp | 58 +++++++++++++++------ src/librssguard/gui/messagesview.h | 3 ++ 4 files changed, 82 insertions(+), 16 deletions(-) diff --git a/src/librssguard/core/messagesproxymodel.cpp b/src/librssguard/core/messagesproxymodel.cpp index 50f80b723..a540dcd79 100644 --- a/src/librssguard/core/messagesproxymodel.cpp +++ b/src/librssguard/core/messagesproxymodel.cpp @@ -28,6 +28,18 @@ MessagesProxyModel::~MessagesProxyModel() { qDebugNN << LOGSEC_MESSAGEMODEL << "Destroying MessagesProxyModel instance."; } +QModelIndex MessagesProxyModel::getNextPreviousImportantItemIndex(int default_row) { + const bool started_from_zero = default_row == 0; + QModelIndex next_index = getNextImportantItemIndex(default_row, rowCount() - 1); + + // There is no next message, check previous. + if (!next_index.isValid() && !started_from_zero) { + next_index = getNextImportantItemIndex(0, default_row - 1); + } + + return next_index; +} + QModelIndex MessagesProxyModel::getNextPreviousUnreadItemIndex(int default_row) { const bool started_from_zero = default_row == 0; QModelIndex next_index = getNextUnreadItemIndex(default_row, rowCount() - 1); @@ -40,12 +52,33 @@ QModelIndex MessagesProxyModel::getNextPreviousUnreadItemIndex(int default_row) return next_index; } +QModelIndex MessagesProxyModel::getNextImportantItemIndex(int default_row, int max_row) const { + while (default_row <= max_row) { + // Get info if the message is read or not. + const QModelIndex proxy_index = index(default_row, MSG_DB_IMPORTANT_INDEX); + const bool is_important = m_sourceModel->data(mapToSource(proxy_index).row(), + MSG_DB_IMPORTANT_INDEX, + Qt::ItemDataRole::EditRole).toInt() == 1; + + if (!is_important) { + // We found unread message, mark it. + return proxy_index; + } + else { + default_row++; + } + } + + return QModelIndex(); +} + QModelIndex MessagesProxyModel::getNextUnreadItemIndex(int default_row, int max_row) const { while (default_row <= max_row) { // Get info if the message is read or not. const QModelIndex proxy_index = index(default_row, MSG_DB_READ_INDEX); const bool is_read = m_sourceModel->data(mapToSource(proxy_index).row(), - MSG_DB_READ_INDEX, Qt::EditRole).toInt() == 1; + MSG_DB_READ_INDEX, + Qt::ItemDataRole::EditRole).toInt() == 1; if (!is_read) { // We found unread message, mark it. diff --git a/src/librssguard/core/messagesproxymodel.h b/src/librssguard/core/messagesproxymodel.h index 8af97e4e4..4920285c4 100644 --- a/src/librssguard/core/messagesproxymodel.h +++ b/src/librssguard/core/messagesproxymodel.h @@ -14,6 +14,7 @@ class MessagesProxyModel : public QSortFilterProxyModel { explicit MessagesProxyModel(MessagesModel* source_model, QObject* parent = nullptr); virtual ~MessagesProxyModel(); + QModelIndex getNextPreviousImportantItemIndex(int default_row); QModelIndex getNextPreviousUnreadItemIndex(int default_row); // Maps list of indexes. @@ -30,6 +31,7 @@ class MessagesProxyModel : public QSortFilterProxyModel { void setShowUnreadOnly(bool show_unread_only); private: + QModelIndex getNextImportantItemIndex(int default_row, int max_row) const; QModelIndex getNextUnreadItemIndex(int default_row, int max_row) const; bool lessThan(const QModelIndex& left, const QModelIndex& right) const; diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index 00b9dd667..f84cef96c 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -617,23 +617,15 @@ void MessagesView::reselectIndexes(const QModelIndexList& indexes) { } void MessagesView::selectNextItem() { - const QModelIndex index_next = moveCursor(QAbstractItemView::MoveDown, Qt::NoModifier); - - if (index_next.isValid()) { - setCurrentIndex(index_next); - - scrollTo(index_next, - !m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() - ? QAbstractItemView::ScrollHint::PositionAtCenter - : QAbstractItemView::ScrollHint::PositionAtTop); - - selectionModel()->select(index_next, QItemSelectionModel::Select | QItemSelectionModel::Rows); - setFocus(); - } + selectItemWithCursorAction(QAbstractItemView::CursorAction::MoveDown); } void MessagesView::selectPreviousItem() { - const QModelIndex index_previous = moveCursor(QAbstractItemView::MoveUp, Qt::NoModifier); + selectItemWithCursorAction(QAbstractItemView::CursorAction::MoveUp); +} + +void MessagesView::selectItemWithCursorAction(CursorAction act) { + const QModelIndex index_previous = moveCursor(act, Qt::KeyboardModifier::NoModifier); if (index_previous.isValid()) { setCurrentIndex(index_previous); @@ -643,7 +635,9 @@ void MessagesView::selectPreviousItem() { ? QAbstractItemView::ScrollHint::PositionAtCenter : QAbstractItemView::ScrollHint::PositionAtTop); - selectionModel()->select(index_previous, QItemSelectionModel::Select | QItemSelectionModel::Rows); + selectionModel()->select(index_previous, + QItemSelectionModel::SelectionFlag::Select | + QItemSelectionModel::SelectionFlag::Rows); setFocus(); } } @@ -682,6 +676,40 @@ void MessagesView::selectNextUnreadItem() { } } +void MessagesView::selectNextImportantItem() { + const QModelIndexList selected_rows = selectionModel()->selectedRows(); + int active_row; + + if (!selected_rows.isEmpty()) { + // Okay, something is selected, start from it. + active_row = selected_rows.at(0).row(); + } + else { + active_row = 0; + } + + const QModelIndex next_important = m_proxyModel->getNextPreviousImportantItemIndex(active_row); + + if (next_important.isValid()) { + // We found unread message, mark it. + setCurrentIndex(next_important); + + // Make sure that item is properly visible even if + // message previewer was hidden and shows up. + qApp->processEvents(); + + scrollTo(next_important, + !m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() + ? QAbstractItemView::ScrollHint::PositionAtCenter + : QAbstractItemView::ScrollHint::PositionAtTop); + + selectionModel()->select(next_important, + QItemSelectionModel::SelectionFlag::Select | + QItemSelectionModel::SelectionFlag::Rows); + setFocus(); + } +} + void MessagesView::searchMessages(const QString& pattern) { qDebugNN << LOGSEC_GUI << "Running search of messages with pattern" diff --git a/src/librssguard/gui/messagesview.h b/src/librssguard/gui/messagesview.h index f7f6896e4..10e4c54a9 100644 --- a/src/librssguard/gui/messagesview.h +++ b/src/librssguard/gui/messagesview.h @@ -52,7 +52,10 @@ class MessagesView : public BaseTreeView { void selectNextItem(); void selectPreviousItem(); + void selectItemWithCursorAction(QAbstractItemView::CursorAction act); + void selectNextUnreadItem(); + void selectNextImportantItem(); // Searchs the visible message according to given pattern. void searchMessages(const QString& pattern);