From e3553c4eb33c1ce7ce5e77a66a6b7fdc0fc2b487 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 28 Sep 2025 01:31:32 -0400 Subject: [PATCH] Dismiss feature fixed --- src/MessageStore.cpp | 48 +++++++++++++++++++++++++++++++ src/MessageStore.h | 4 +++ src/graphics/draw/MenuHandler.cpp | 29 +++++++++++++++++-- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/MessageStore.cpp b/src/MessageStore.cpp index ff346f224..421d38d2b 100644 --- a/src/MessageStore.cpp +++ b/src/MessageStore.cpp @@ -254,6 +254,54 @@ void MessageStore::dismissOldestMessage() saveToFlash(); } +// Dismiss oldest message in a specific channel +void MessageStore::dismissOldestMessageInChannel(uint8_t channel) +{ + auto it = std::find_if(liveMessages.begin(), liveMessages.end(), [channel](const StoredMessage &m) { + return m.type == MessageType::BROADCAST && m.channelIndex == channel; + }); + if (it != liveMessages.end()) { + liveMessages.erase(it); + } + + auto it2 = std::find_if(messages.begin(), messages.end(), [channel](const StoredMessage &m) { + return m.type == MessageType::BROADCAST && m.channelIndex == channel; + }); + if (it2 != messages.end()) { + messages.erase(it2); + } + + saveToFlash(); +} + +// Dismiss oldest message in a direct conversation with a peer +void MessageStore::dismissOldestMessageWithPeer(uint32_t peer) +{ + auto it = std::find_if(liveMessages.begin(), liveMessages.end(), [peer](const StoredMessage &m) { + if (m.type == MessageType::DM_TO_US) { + uint32_t other = (m.sender == nodeDB->getNodeNum()) ? m.dest : m.sender; + return other == peer; + } + return false; + }); + if (it != liveMessages.end()) { + liveMessages.erase(it); + } + + auto it2 = std::find_if(messages.begin(), messages.end(), [peer](const StoredMessage &m) { + if (m.type == MessageType::DM_TO_US) { + uint32_t other = (m.sender == nodeDB->getNodeNum()) ? m.dest : m.sender; + return other == peer; + } + return false; + }); + if (it2 != messages.end()) { + messages.erase(it2); + } + + saveToFlash(); +} + // Dismiss newest message (RAM + persisted queue) void MessageStore::dismissNewestMessage() { diff --git a/src/MessageStore.h b/src/MessageStore.h index 9ef0c4153..e28f6e138 100644 --- a/src/MessageStore.h +++ b/src/MessageStore.h @@ -72,6 +72,10 @@ class MessageStore void dismissOldestMessage(); void dismissNewestMessage(); + // New targeted dismiss helpers + void dismissOldestMessageInChannel(uint8_t channel); + void dismissOldestMessageWithPeer(uint32_t peer); + // Unified accessor (for UI code, defaults to RAM buffer) const std::deque &getMessages() const { return liveMessages; } diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 5de25bf5c..338fb22d6 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -405,14 +405,21 @@ void menuHandler::messageResponseMenu() static int optionsEnumArray[enumEnd]; int options = 0; + auto mode = graphics::MessageRenderer::getThreadMode(); + int ch = graphics::MessageRenderer::getThreadChannel(); + uint32_t peer = graphics::MessageRenderer::getThreadPeer(); + optionsArray[options] = "Back"; optionsEnumArray[options++] = Back; optionsArray[options] = "Conversations"; optionsEnumArray[options++] = ViewMode; - optionsArray[options] = "Dismiss All"; - optionsEnumArray[options++] = DismissAll; + // Only show Dismiss All in View All mode + if (mode == graphics::MessageRenderer::ThreadMode::ALL) { + optionsArray[options] = "Dismiss All"; + optionsEnumArray[options++] = DismissAll; + } optionsArray[options] = "Dismiss Oldest"; optionsEnumArray[options++] = DismissOldest; @@ -458,8 +465,24 @@ void menuHandler::messageResponseMenu() } else if (selected == DismissAll) { messageStore.clearAllMessages(); graphics::MessageRenderer::clearThreadRegistries(); + + // Reset back to "View All" + graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::ALL); } else if (selected == DismissOldest) { - messageStore.dismissOldestMessage(); + auto mode = graphics::MessageRenderer::getThreadMode(); + int ch = graphics::MessageRenderer::getThreadChannel(); + uint32_t peer = graphics::MessageRenderer::getThreadPeer(); + + if (mode == graphics::MessageRenderer::ThreadMode::ALL) { + // Global oldest + messageStore.dismissOldestMessage(); + } else if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { + // Oldest in current channel + messageStore.dismissOldestMessageInChannel(ch); + } else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) { + // Oldest in current DM + messageStore.dismissOldestMessageWithPeer(peer); + } } else if (selected == Preset || selected == Freetext) { if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { LOG_DEBUG("Replying to CHANNEL %d", ch);