some preps for select next imp article

This commit is contained in:
Martin Rotter 2022-01-01 17:36:52 +01:00
parent 0cf226f9fe
commit 7fa4488fb9
4 changed files with 82 additions and 16 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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"

View File

@ -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);