Dismiss feature fixed

This commit is contained in:
HarukiToreda 2025-09-28 01:31:32 -04:00
parent 3e4f654f58
commit e3553c4eb3
3 changed files with 78 additions and 3 deletions

View File

@ -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()
{

View File

@ -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<StoredMessage> &getMessages() const { return liveMessages; }

View File

@ -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);