some preps for select next imp article
This commit is contained in:
parent
0cf226f9fe
commit
7fa4488fb9
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue