From c1c196ebeef9a17defe8a3070e8f10d548ffdf40 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Mon, 14 Sep 2026 14:11:18 +0200 Subject: fix: keep the message bar populated on a spam reply The spam branch of populateMessageBar() was keyed on the path predicate alone, but its only action is hidden on a reply, so a reply inside an expanded spam conversation lost Reply, Forward and Star. Skip the branch when the reply guard is set, so the ordinary branch populates instead. Extend notSpamIsOfferedInTheSpamView with the message-bar assertions the QAction-only check missed, waiting for the reply row to load first, and mark Task 9's step checkboxes done in the plan. --- src/mainwindow.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 68cdde7..2443ead 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2467,11 +2467,18 @@ void MainWindow::populateMessageBar() // need no colour to tell them from each other, only from this one. tinted = { m_actions.value(QStringLiteral("restore")) }; } else if (everySelectedRowIsInASpamFolder() + && !m_replySelectionHidesDelete && !m_threadView->selectionModel()->selectedRows().isEmpty()) { // Item 201. Mail in a spam folder affords one thing the ordinary bar // cannot offer: a way back out. Ordered after the trash branch and // before the draft one, because a draft thrown into the spam folder is // no more useful to edit than one thrown into the trash. + // + // NOT taken on a reply row. The only action here is not_spam and + // refreshTrashActions() hides it on a reply, so taking the branch left + // the bar EMPTY: a reply inside an expanded spam conversation lost + // Reply, Forward and Star. The trash branch needs no such guard because + // purge and empty_trash stay visible on a reply. messageActions = { m_actions.value(QStringLiteral("not_spam")) }; } else if (currentMessageIsADraft()) { messageActions = { m_actions.value(QStringLiteral("edit_draft")) }; -- cgit v1.2.3