From c30eb4b659d4ec3455db58cde3e525067334a767 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Mon, 10 Nov 2025 00:42:49 -0500 Subject: [PATCH] More delete options and cleanup of code --- src/MessageStore.cpp | 34 +++++++-- src/MessageStore.h | 12 +-- src/graphics/draw/MenuHandler.cpp | 123 ++++++++++++++++++++++++------ src/graphics/draw/MenuHandler.h | 2 + 4 files changed, 135 insertions(+), 36 deletions(-) diff --git a/src/MessageStore.cpp b/src/MessageStore.cpp index 3152cb7c6..727e3b4e9 100644 --- a/src/MessageStore.cpp +++ b/src/MessageStore.cpp @@ -315,23 +315,45 @@ template static void eraseIf(std::deque &deq } } -// Dismiss oldest message (RAM + persisted queue) -void MessageStore::dismissOldestMessage() +// Delete oldest message (RAM + persisted queue) +void MessageStore::deleteOldestMessage() { eraseIf(liveMessages, [](StoredMessage &) { return true; }); saveToFlash(); } -// Dismiss oldest message in a specific channel -void MessageStore::dismissOldestMessageInChannel(uint8_t channel) +// Delete oldest message in a specific channel +void MessageStore::deleteOldestMessageInChannel(uint8_t channel) { auto pred = [channel](const StoredMessage &m) { return m.type == MessageType::BROADCAST && m.channelIndex == channel; }; eraseIf(liveMessages, pred); saveToFlash(); } -// Dismiss oldest message in a direct chat with a node -void MessageStore::dismissOldestMessageWithPeer(uint32_t peer) +void MessageStore::deleteAllMessagesInChannel(uint8_t channel) +{ + auto pred = [channel](const StoredMessage &m) { + return m.type == MessageType::BROADCAST && m.channelIndex == channel; + }; + eraseIf(liveMessages, pred, false /* delete ALL, not just first */); + saveToFlash(); +} + +void MessageStore::deleteAllMessagesWithPeer(uint32_t peer) +{ + uint32_t local = nodeDB->getNodeNum(); + auto pred = [&](const StoredMessage &m) { + if (m.type != MessageType::DM_TO_US) + return false; + uint32_t other = (m.sender == local) ? m.dest : m.sender; + return other == peer; + }; + eraseIf(liveMessages, pred, false); + saveToFlash(); +} + +// Delete oldest message in a direct chat with a node +void MessageStore::deleteOldestMessageWithPeer(uint32_t peer) { auto pred = [peer](const StoredMessage &m) { if (m.type != MessageType::DM_TO_US) diff --git a/src/MessageStore.h b/src/MessageStore.h index 6ca2e3c13..41eb56b66 100644 --- a/src/MessageStore.h +++ b/src/MessageStore.h @@ -94,12 +94,12 @@ class MessageStore // Clear all messages (RAM + persisted queue + text pool) void clearAllMessages(); - // Dismiss helpers - void dismissOldestMessage(); // remove oldest from RAM (and flash on save) - - // New targeted dismiss helpers - void dismissOldestMessageInChannel(uint8_t channel); - void dismissOldestMessageWithPeer(uint32_t peer); + // Delete helpers + void deleteOldestMessage(); // remove oldest from RAM (and flash on save) + void deleteOldestMessageInChannel(uint8_t channel); + void deleteOldestMessageWithPeer(uint32_t peer); + void deleteAllMessagesInChannel(uint8_t channel); + void deleteAllMessagesWithPeer(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 0d8ddf49e..842346802 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -407,10 +407,9 @@ void menuHandler::clockMenu() }; screen->showOverlayBanner(bannerOptions); } - void menuHandler::messageResponseMenu() { - enum optionsNumbers { Back = 0, ViewMode, DismissAll, DismissOldest, Preset, Freetext, Aloud, enumEnd }; + enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, Preset, Freetext, Aloud, enumEnd }; static const char *optionsArray[enumEnd]; static int optionsEnumArray[enumEnd]; @@ -436,20 +435,9 @@ void menuHandler::messageResponseMenu() optionsArray[options] = "View Chats"; optionsEnumArray[options++] = ViewMode; - // Only show Dismiss All in View All mode -#if defined(M5STACK_UNITC6L) - optionsArray[options] = "Delete All"; -#else - optionsArray[options] = "Delete All Chats"; -#endif - optionsEnumArray[options++] = DismissAll; - - if (isHighResolution) { - optionsArray[options] = "Delete Oldest Message"; - } else { - optionsArray[options] = "Delete Oldest Msg"; - } - optionsEnumArray[options++] = DismissOldest; + // Delete submenu + optionsArray[options] = "Delete"; + optionsEnumArray[options++] = 900; #ifdef HAS_I2S optionsArray[options] = "Read Aloud"; @@ -477,25 +465,35 @@ void menuHandler::messageResponseMenu() if (selected == ViewMode) { menuHandler::menuQueue = menuHandler::message_viewmode_menu; screen->runNow(); - } else if (selected == DismissAll) { - messageStore.clearAllMessages(); - graphics::MessageRenderer::clearThreadRegistries(); - graphics::MessageRenderer::clearMessageCache(); - } else if (selected == DismissOldest) { + + // Delete submenu + } else if (selected == 900) { + menuHandler::menuQueue = menuHandler::delete_messages_menu; + screen->runNow(); + + // Delete oldest FIRST (only change) + } else if (selected == DeleteOldest) { 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(); + messageStore.deleteOldestMessage(); } else if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { // Oldest in current channel - messageStore.dismissOldestMessageInChannel(ch); + messageStore.deleteOldestMessageInChannel(ch); } else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) { // Oldest in current DM - messageStore.dismissOldestMessageWithPeer(peer); + messageStore.deleteOldestMessageWithPeer(peer); } + + // Delete all messages + } else if (selected == DeleteAll) { + messageStore.clearAllMessages(); + graphics::MessageRenderer::clearThreadRegistries(); + graphics::MessageRenderer::clearMessageCache(); + } else if (selected == Preset || selected == Freetext) { if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { LOG_DEBUG("Replying to CHANNEL %d", ch); @@ -534,6 +532,80 @@ void menuHandler::messageResponseMenu() }; screen->showOverlayBanner(bannerOptions); } +void menuHandler::deleteMessagesMenu() +{ + enum optionsNumbers { Back = 0, DeleteOldest, DeleteThis, DeleteAll, enumEnd }; + +#if defined(M5STACK_UNITC6L) + static const char *optionsArray[] = { + "Back", + "Delete Oldest", + "Delete This Chat", + "Delete All" + }; +#else + static const char *optionsArray[] = { + "Back", + "Delete Oldest", + "Delete This Chat", + "Delete All Chats" + }; +#endif + + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Delete Messages"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + + bannerOptions.bannerCallback = [](int selected) -> void { + + auto mode = graphics::MessageRenderer::getThreadMode(); + int ch = graphics::MessageRenderer::getThreadChannel(); + uint32_t peer = graphics::MessageRenderer::getThreadPeer(); + + if (selected == Back) { + menuHandler::menuQueue = menuHandler::message_response_menu; + screen->runNow(); + return; + } + + if (selected == DeleteAll) { + messageStore.clearAllMessages(); + graphics::MessageRenderer::clearThreadRegistries(); + graphics::MessageRenderer::clearMessageCache(); + return; + } + + if (selected == DeleteOldest) { + + if (mode == graphics::MessageRenderer::ThreadMode::ALL) { + messageStore.deleteOldestMessage(); + } + else if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { + messageStore.deleteOldestMessageInChannel(ch); + } + else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) { + messageStore.deleteOldestMessageWithPeer(peer); + } + + return; + } + + if (selected == DeleteThis) { + + if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) { + messageStore.deleteAllMessagesInChannel(ch); + } + else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) { + messageStore.deleteAllMessagesWithPeer(peer); + } + + return; + } + }; + + screen->showOverlayBanner(bannerOptions); +} void menuHandler::messageViewModeMenu() { @@ -1979,6 +2051,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case message_response_menu: messageResponseMenu(); break; + case delete_messages_menu: + deleteMessagesMenu(); + break; case message_viewmode_menu: messageViewModeMenu(); break; diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 6fbc5d1e3..7b5696ed8 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -45,6 +45,7 @@ class menuHandler throttle_message, message_response_menu, message_viewmode_menu, + delete_messages_menu, node_name_length_menu, FrameToggles, DisplayUnits @@ -64,6 +65,7 @@ class menuHandler static void ClockFacePicker(); static void messageResponseMenu(); static void messageViewModeMenu(); + static void deleteMessagesMenu(); static void homeBaseMenu(); static void textMessageBaseMenu(); static void systemBaseMenu();