This commit is contained in:
Martin Rotter 2022-06-21 07:50:53 +02:00
parent b26a2eef40
commit dfbaf3601d
2 changed files with 105 additions and 90 deletions

View File

@ -26,7 +26,7 @@
<url type="donation">https://github.com/sponsors/martinrotter</url> <url type="donation">https://github.com/sponsors/martinrotter</url>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="4.2.3" date="2022-06-06"/> <release version="4.2.3" date="2022-06-21"/>
</releases> </releases>
<content_rating type="oars-1.0"> <content_rating type="oars-1.0">
<content_attribute id="violence-cartoon">none</content_attribute> <content_attribute id="violence-cartoon">none</content_attribute>

View File

@ -27,11 +27,10 @@
#include <QProcess> #include <QProcess>
#include <QScrollBar> #include <QScrollBar>
#include <QTimer> #include <QTimer>
#include <QTimer>
MessagesView::MessagesView(QWidget* parent) MessagesView::MessagesView(QWidget* parent)
: BaseTreeView(parent), m_contextMenu(nullptr), m_columnsAdjusted(false), m_processingAnyMouseButton(false), : BaseTreeView(parent), m_contextMenu(nullptr), m_columnsAdjusted(false), m_processingAnyMouseButton(false),
m_processingRightMouseButton(false) { m_processingRightMouseButton(false) {
m_sourceModel = qApp->feedReader()->messagesModel(); m_sourceModel = qApp->feedReader()->messagesModel();
m_proxyModel = qApp->feedReader()->messagesProxyModel(); m_proxyModel = qApp->feedReader()->messagesProxyModel();
m_sourceModel->setView(this); m_sourceModel->setView(this);
@ -82,15 +81,18 @@ void MessagesView::restoreHeaderState(const QByteArray& dta) {
inn.setVersion(QDataStream::Version::Qt_4_7); inn.setVersion(QDataStream::Version::Qt_4_7);
int saved_header_count; inn >> saved_header_count; int saved_header_count;
inn >> saved_header_count;
if (std::abs(saved_header_count - header()->count()) > 10) { if (std::abs(saved_header_count - header()->count()) > 10) {
qWarningNN << LOGSEC_GUI << "Detected invalid state for list view."; qWarningNN << LOGSEC_GUI << "Detected invalid state for list view.";
return; return;
} }
int saved_sort_order; inn >> saved_sort_order; int saved_sort_order;
int saved_sort_column; inn >> saved_sort_column; inn >> saved_sort_order;
int saved_sort_column;
inn >> saved_sort_column;
for (int i = 0; i < saved_header_count && i < header()->count(); i++) { for (int i = 0; i < saved_header_count && i < header()->count(); i++) {
int vi, ss; int vi, ss;
@ -124,8 +126,8 @@ void MessagesView::copyUrlOfSelectedArticles() const {
QStringList urls; QStringList urls;
for (const auto article_idx : mapped_indexes) { for (const auto article_idx : mapped_indexes) {
urls << m_sourceModel->data(m_sourceModel->index(article_idx.row(), MSG_DB_URL_INDEX), urls << m_sourceModel->data(m_sourceModel->index(article_idx.row(), MSG_DB_URL_INDEX), Qt::ItemDataRole::EditRole)
Qt::ItemDataRole::EditRole).toString(); .toString();
} }
if (qApp->clipboard() != nullptr && !urls.isEmpty()) { if (qApp->clipboard() != nullptr && !urls.isEmpty()) {
@ -133,8 +135,10 @@ void MessagesView::copyUrlOfSelectedArticles() const {
} }
} }
void MessagesView::sort(int column, Qt::SortOrder order, void MessagesView::sort(int column,
bool repopulate_data, bool change_header, Qt::SortOrder order,
bool repopulate_data,
bool change_header,
bool emit_changed_from_header, bool emit_changed_from_header,
bool ignore_multicolumn_sorting) { bool ignore_multicolumn_sorting) {
if (change_header && !emit_changed_from_header) { if (change_header && !emit_changed_from_header) {
@ -172,21 +176,20 @@ void MessagesView::keyboardSearch(const QString& search) {
void MessagesView::reloadSelections() { void MessagesView::reloadSelections() {
const QDateTime dt1 = QDateTime::currentDateTime(); const QDateTime dt1 = QDateTime::currentDateTime();
QModelIndex current_index = selectionModel()->currentIndex(); QModelIndex current_index = selectionModel()->currentIndex();
const bool is_current_selected = selectionModel()->selectedRows().contains(m_proxyModel->index(current_index.row(), const bool is_current_selected =
0, selectionModel()->selectedRows().contains(m_proxyModel->index(current_index.row(), 0, current_index.parent()));
current_index.parent()));
const QModelIndex mapped_current_index = m_proxyModel->mapToSource(current_index); const QModelIndex mapped_current_index = m_proxyModel->mapToSource(current_index);
const Message selected_message = m_sourceModel->messageAt(mapped_current_index.row()); const Message selected_message = m_sourceModel->messageAt(mapped_current_index.row());
const int col = header()->sortIndicatorSection(); const int col = header()->sortIndicatorSection();
const Qt::SortOrder ord = header()->sortIndicatorOrder(); const Qt::SortOrder ord = header()->sortIndicatorOrder();
bool do_not_mark_read_on_select = false;
// Reload the model now. // Reload the model now.
sort(col, ord, true, false, false, true); sort(col, ord, true, false, false, true);
// Now, we must find the same previously focused message. // Now, we must find the same previously focused message.
if (selected_message.m_id > 0) { if (selected_message.m_id > 0) {
if (m_proxyModel->rowCount() == 0 || if (m_proxyModel->rowCount() == 0 || !is_current_selected) {
!is_current_selected) {
current_index = QModelIndex(); current_index = QModelIndex();
} }
else { else {
@ -196,6 +199,11 @@ void MessagesView::reloadSelections() {
if (msg.m_id == selected_message.m_id) { if (msg.m_id == selected_message.m_id) {
current_index = msg_idx; current_index = msg_idx;
if (!msg.m_isRead /* && selected_message.m_isRead */) {
do_not_mark_read_on_select = true;
}
break; break;
} }
@ -208,8 +216,13 @@ void MessagesView::reloadSelections() {
if (current_index.isValid()) { if (current_index.isValid()) {
scrollTo(current_index); scrollTo(current_index);
m_processingRightMouseButton = do_not_mark_read_on_select;
setCurrentIndex(current_index); setCurrentIndex(current_index);
reselectIndexes(QModelIndexList() << current_index); reselectIndexes(QModelIndexList() << current_index);
m_processingRightMouseButton = false;
} }
else { else {
// Messages were probably removed from the model, nothing can // Messages were probably removed from the model, nothing can
@ -219,10 +232,7 @@ void MessagesView::reloadSelections() {
const QDateTime dt2 = QDateTime::currentDateTime(); const QDateTime dt2 = QDateTime::currentDateTime();
qDebugNN << LOGSEC_GUI qDebugNN << LOGSEC_GUI << "Reloading of msg selections took " << dt1.msecsTo(dt2) << " miliseconds.";
<< "Reloading of msg selections took "
<< dt1.msecsTo(dt2)
<< " miliseconds.";
} }
void MessagesView::setupAppearance() { void MessagesView::setupAppearance() {
@ -251,10 +261,12 @@ void MessagesView::setupAppearance() {
setSortingEnabled(true); setSortingEnabled(true);
setAllColumnsShowFocus(false); setAllColumnsShowFocus(false);
setSelectionMode(QAbstractItemView::SelectionMode::ExtendedSelection); setSelectionMode(QAbstractItemView::SelectionMode::ExtendedSelection);
setItemDelegate(new StyledItemDelegateWithoutFocus(qApp->settings()->value(GROUP(GUI), setItemDelegate(new StyledItemDelegateWithoutFocus(qApp->settings()
SETTING(GUI::HeightRowMessages)).toInt(), ->value(GROUP(GUI), SETTING(GUI::HeightRowMessages))
qApp->settings()->value(GROUP(Messages), .toInt(),
SETTING(Messages::ArticleListPadding)).toInt(), qApp->settings()
->value(GROUP(Messages), SETTING(Messages::ArticleListPadding))
.toInt(),
this)); this));
header()->setDefaultSectionSize(MESSAGES_VIEW_DEFAULT_COL); header()->setDefaultSectionSize(MESSAGES_VIEW_DEFAULT_COL);
@ -267,15 +279,13 @@ void MessagesView::setupAppearance() {
void MessagesView::focusInEvent(QFocusEvent* event) { void MessagesView::focusInEvent(QFocusEvent* event) {
QTreeView::focusInEvent(event); QTreeView::focusInEvent(event);
qDebugNN << LOGSEC_GUI qDebugNN << LOGSEC_GUI << "Message list got focus with reason" << QUOTE_W_SPACE_DOT(event->reason());
<< "Message list got focus with reason"
<< QUOTE_W_SPACE_DOT(event->reason());
if ((event->reason()== Qt::FocusReason::TabFocusReason || if ((event->reason() == Qt::FocusReason::TabFocusReason || event->reason() == Qt::FocusReason::BacktabFocusReason ||
event->reason()== Qt::FocusReason::BacktabFocusReason || event->reason() == Qt::FocusReason::ShortcutFocusReason) &&
event->reason()== Qt::FocusReason::ShortcutFocusReason) &&
currentIndex().isValid()) { currentIndex().isValid()) {
selectionModel()->select(currentIndex(), QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows); selectionModel()->select(currentIndex(),
QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows);
} }
} }
@ -316,9 +326,11 @@ void MessagesView::initializeContextMenu() {
if (m_sourceModel->loadedItem() != nullptr) { if (m_sourceModel->loadedItem() != nullptr) {
QModelIndexList selected_indexes = selectionModel()->selectedRows(); QModelIndexList selected_indexes = selectionModel()->selectedRows();
const QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); const QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes);
auto rows = boolinq::from(mapped_indexes).select([](const QModelIndex& idx) { auto rows = boolinq::from(mapped_indexes)
return idx.row(); .select([](const QModelIndex& idx) {
}).toStdList(); return idx.row();
})
.toStdList();
selected_messages = m_sourceModel->messagesAt(FROM_STD_LIST(QList<int>, rows)); selected_messages = m_sourceModel->messagesAt(FROM_STD_LIST(QList<int>, rows));
} }
@ -350,15 +362,16 @@ void MessagesView::initializeContextMenu() {
// Labels. // Labels.
auto labels = m_sourceModel->loadedItem() != nullptr auto labels = m_sourceModel->loadedItem() != nullptr
? m_sourceModel->loadedItem()->getParentServiceRoot()->labelsNode()->labels() ? m_sourceModel->loadedItem()->getParentServiceRoot()->labelsNode()->labels()
: QList<Label*>(); : QList<Label*>();
LabelsMenu* menu_labels = new LabelsMenu(selected_messages, labels, m_contextMenu); LabelsMenu* menu_labels = new LabelsMenu(selected_messages, labels, m_contextMenu);
connect(menu_labels, &LabelsMenu::labelsChanged, this, [this]() { connect(menu_labels, &LabelsMenu::labelsChanged, this, [this]() {
QModelIndex current_index = selectionModel()->currentIndex(); QModelIndex current_index = selectionModel()->currentIndex();
if (current_index.isValid()) { if (current_index.isValid()) {
emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()), m_sourceModel->loadedItem()); emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()),
m_sourceModel->loadedItem());
} }
else { else {
emit currentMessageRemoved(); emit currentMessageRemoved();
@ -368,24 +381,23 @@ void MessagesView::initializeContextMenu() {
// Rest. // Rest.
m_contextMenu->addMenu(menu_ext_tools); m_contextMenu->addMenu(menu_ext_tools);
m_contextMenu->addMenu(menu_labels); m_contextMenu->addMenu(menu_labels);
m_contextMenu->addActions( m_contextMenu->addActions(QList<QAction*>() << qApp->mainForm()->m_ui->m_actionSendMessageViaEmail
QList<QAction*>() << qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally
<< qApp->mainForm()->m_ui->m_actionSendMessageViaEmail << qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally
<< qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally << qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternallyNoTab
<< qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally << qApp->mainForm()->m_ui->m_actionCopyUrlSelectedArticles
<< qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternallyNoTab << qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead
<< qApp->mainForm()->m_ui->m_actionCopyUrlSelectedArticles << qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread
<< qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead << qApp->mainForm()->m_ui->m_actionSwitchImportanceOfSelectedMessages
<< qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread << qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages);
<< qApp->mainForm()->m_ui->m_actionSwitchImportanceOfSelectedMessages
<< qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages);
if (m_sourceModel->loadedItem() != nullptr) { if (m_sourceModel->loadedItem() != nullptr) {
if (m_sourceModel->loadedItem()->kind() == RootItem::Kind::Bin) { if (m_sourceModel->loadedItem()->kind() == RootItem::Kind::Bin) {
m_contextMenu->addAction(qApp->mainForm()->m_ui->m_actionRestoreSelectedMessages); m_contextMenu->addAction(qApp->mainForm()->m_ui->m_actionRestoreSelectedMessages);
} }
auto extra_context_menu = m_sourceModel->loadedItem()->getParentServiceRoot()->contextMenuMessagesList(selected_messages); auto extra_context_menu =
m_sourceModel->loadedItem()->getParentServiceRoot()->contextMenuMessagesList(selected_messages);
if (!extra_context_menu.isEmpty()) { if (!extra_context_menu.isEmpty()) {
m_contextMenu->addSeparator(); m_contextMenu->addSeparator();
@ -453,10 +465,8 @@ void MessagesView::selectionChanged(const QItemSelection& selected, const QItemS
const QModelIndex current_index = currentIndex(); const QModelIndex current_index = currentIndex();
const QModelIndex mapped_current_index = m_proxyModel->mapToSource(current_index); const QModelIndex mapped_current_index = m_proxyModel->mapToSource(current_index);
qDebugNN << LOGSEC_GUI qDebugNN << LOGSEC_GUI << "Current row changed - proxy '" << current_index << "', source '" << mapped_current_index
<< "Current row changed - proxy '" << "'.";
<< current_index << "', source '"
<< mapped_current_index << "'.";
if (mapped_current_index.isValid() && selected_rows.size() == 1) { if (mapped_current_index.isValid() && selected_rows.size() == 1) {
Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()); Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row());
@ -509,8 +519,7 @@ void MessagesView::openSelectedSourceMessagesExternally() {
for (const QModelIndex& index : qAsConst(rws)) { for (const QModelIndex& index : qAsConst(rws)) {
QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row()) QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row())
.m_url .m_url.replace(QRegularExpression(QSL("[\\t\\n]")), QString());
.replace(QRegularExpression(QSL("[\\t\\n]")), QString());
qApp->web()->openUrlInExternalBrowser(link); qApp->web()->openUrlInExternalBrowser(link);
} }
@ -520,7 +529,9 @@ void MessagesView::openSelectedSourceMessagesExternally() {
QTimer::singleShot(0, this, &MessagesView::markSelectedMessagesRead); QTimer::singleShot(0, this, &MessagesView::markSelectedMessagesRead);
} }
if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::BringAppToFrontAfterMessageOpenedExternally)).toBool()) { if (qApp->settings()
->value(GROUP(Messages), SETTING(Messages::BringAppToFrontAfterMessageOpenedExternally))
.toBool()) {
QTimer::singleShot(1000, this, []() { QTimer::singleShot(1000, this, []() {
qApp->mainForm()->display(); qApp->mainForm()->display();
}); });
@ -554,10 +565,13 @@ void MessagesView::openSelectedMessageUrl() {
void MessagesView::sendSelectedMessageViaEmail() { void MessagesView::sendSelectedMessageViaEmail() {
if (selectionModel()->selectedRows().size() == 1) { if (selectionModel()->selectedRows().size() == 1) {
const Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(selectionModel()->selectedRows().at(0)).row()); const Message message =
m_sourceModel->messageAt(m_proxyModel->mapToSource(selectionModel()->selectedRows().at(0)).row());
if (!qApp->web()->sendMessageViaEmail(message)) { if (!qApp->web()->sendMessageViaEmail(message)) {
MsgBox::show(this, QMessageBox::Critical, tr("Problem with starting external e-mail client"), MsgBox::show(this,
QMessageBox::Critical,
tr("Problem with starting external e-mail client"),
tr("External e-mail client could not be started.")); tr("External e-mail client could not be started."));
} }
} }
@ -584,7 +598,8 @@ void MessagesView::setSelectedMessagesReadStatus(RootItem::ReadStatus read) {
QModelIndex current_index = selectionModel()->currentIndex(); QModelIndex current_index = selectionModel()->currentIndex();
if (current_index.isValid() && selected_indexes.size() == 1) { if (current_index.isValid() && selected_indexes.size() == 1) {
emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()), m_sourceModel->loadedItem()); emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()),
m_sourceModel->loadedItem());
} }
else { else {
emit currentMessageRemoved(); emit currentMessageRemoved();
@ -601,9 +616,9 @@ void MessagesView::deleteSelectedMessages() {
const QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); const QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes);
m_sourceModel->setBatchMessagesDeleted(mapped_indexes); m_sourceModel->setBatchMessagesDeleted(mapped_indexes);
QModelIndex current_index = currentIndex().isValid() QModelIndex current_index =
? moveCursor(QAbstractItemView::CursorAction::MoveDown, Qt::KeyboardModifier::NoModifier) currentIndex().isValid() ? moveCursor(QAbstractItemView::CursorAction::MoveDown, Qt::KeyboardModifier::NoModifier)
: currentIndex(); : currentIndex();
if (current_index.isValid() && selected_indexes.size() == 1) { if (current_index.isValid() && selected_indexes.size() == 1) {
setCurrentIndex(current_index); setCurrentIndex(current_index);
@ -627,7 +642,8 @@ void MessagesView::restoreSelectedMessages() {
current_index = m_proxyModel->index(current_index.row(), current_index.column()); current_index = m_proxyModel->index(current_index.row(), current_index.column());
if (current_index.isValid()) { if (current_index.isValid()) {
emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()), m_sourceModel->loadedItem()); emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()),
m_sourceModel->loadedItem());
} }
else { else {
emit currentMessageRemoved(); emit currentMessageRemoved();
@ -647,7 +663,8 @@ void MessagesView::switchSelectedMessagesImportance() {
QModelIndex current_index = selectionModel()->currentIndex(); QModelIndex current_index = selectionModel()->currentIndex();
if (current_index.isValid() && selected_indexes.size() == 1) { if (current_index.isValid() && selected_indexes.size() == 1) {
emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()), m_sourceModel->loadedItem()); emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()),
m_sourceModel->loadedItem());
} }
else { else {
// Messages were probably removed from the model, nothing can // Messages were probably removed from the model, nothing can
@ -683,13 +700,13 @@ void MessagesView::selectItemWithCursorAction(CursorAction act) {
setCurrentIndex(index_previous); setCurrentIndex(index_previous);
scrollTo(index_previous, scrollTo(index_previous,
!m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() !m_processingAnyMouseButton &&
? QAbstractItemView::ScrollHint::PositionAtCenter qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()
: QAbstractItemView::ScrollHint::PositionAtTop); ? QAbstractItemView::ScrollHint::PositionAtCenter
: QAbstractItemView::ScrollHint::PositionAtTop);
selectionModel()->select(index_previous, selectionModel()->select(index_previous,
QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows);
QItemSelectionModel::SelectionFlag::Rows);
setFocus(); setFocus();
} }
} }
@ -717,13 +734,13 @@ void MessagesView::selectNextUnreadItem() {
qApp->processEvents(); qApp->processEvents();
scrollTo(next_unread, scrollTo(next_unread,
!m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() !m_processingAnyMouseButton &&
? QAbstractItemView::ScrollHint::PositionAtCenter qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()
: QAbstractItemView::ScrollHint::PositionAtTop); ? QAbstractItemView::ScrollHint::PositionAtCenter
: QAbstractItemView::ScrollHint::PositionAtTop);
selectionModel()->select(next_unread, selectionModel()->select(next_unread,
QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows);
QItemSelectionModel::SelectionFlag::Rows);
setFocus(); setFocus();
} }
} }
@ -751,21 +768,19 @@ void MessagesView::selectNextImportantItem() {
qApp->processEvents(); qApp->processEvents();
scrollTo(next_important, scrollTo(next_important,
!m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() !m_processingAnyMouseButton &&
? QAbstractItemView::ScrollHint::PositionAtCenter qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()
: QAbstractItemView::ScrollHint::PositionAtTop); ? QAbstractItemView::ScrollHint::PositionAtCenter
: QAbstractItemView::ScrollHint::PositionAtTop);
selectionModel()->select(next_important, selectionModel()->select(next_important,
QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows);
QItemSelectionModel::SelectionFlag::Rows);
setFocus(); setFocus();
} }
} }
void MessagesView::searchMessages(const QString& pattern) { void MessagesView::searchMessages(const QString& pattern) {
qDebugNN << LOGSEC_GUI qDebugNN << LOGSEC_GUI << "Running search of messages with pattern" << QUOTE_W_SPACE_DOT(pattern);
<< "Running search of messages with pattern"
<< QUOTE_W_SPACE_DOT(pattern);
m_proxyModel->setFilterRegularExpression(pattern.toLower()); m_proxyModel->setFilterRegularExpression(pattern.toLower());
@ -775,9 +790,10 @@ void MessagesView::searchMessages(const QString& pattern) {
else { else {
// Scroll to selected message, it could become scrolled out due to filter change. // Scroll to selected message, it could become scrolled out due to filter change.
scrollTo(selectionModel()->selectedRows().at(0), scrollTo(selectionModel()->selectedRows().at(0),
!m_processingAnyMouseButton && qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool() !m_processingAnyMouseButton &&
? QAbstractItemView::ScrollHint::PositionAtCenter qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()
: QAbstractItemView::ScrollHint::EnsureVisible); ? QAbstractItemView::ScrollHint::PositionAtCenter
: QAbstractItemView::ScrollHint::EnsureVisible);
} }
} }
@ -794,15 +810,14 @@ void MessagesView::openSelectedMessagesWithExternalTool() {
for (const QModelIndex& index : qAsConst(rws)) { for (const QModelIndex& index : qAsConst(rws)) {
const QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row()) const QString link = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row())
.m_url .m_url.replace(QRegularExpression(QSL("[\\t\\n]")), QString());
.replace(QRegularExpression(QSL("[\\t\\n]")), QString());
if (!link.isEmpty()) { if (!link.isEmpty()) {
if (!tool.run(link)) { if (!tool.run(link)) {
qApp->showGuiMessage(Notification::Event::GeneralEvent, { qApp->showGuiMessage(Notification::Event::GeneralEvent,
tr("Cannot run external tool"), {tr("Cannot run external tool"),
tr("External tool '%1' could not be started.").arg(tool.executable()), tr("External tool '%1' could not be started.").arg(tool.executable()),
QSystemTrayIcon::MessageIcon::Critical }); QSystemTrayIcon::MessageIcon::Critical});
} }
} }
} }