mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-20 09:43:03 +00:00
More delete options and cleanup of code
This commit is contained in:
@@ -315,23 +315,45 @@ template <typename Predicate> static void eraseIf(std::deque<StoredMessage> &deq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dismiss oldest message (RAM + persisted queue)
|
// Delete oldest message (RAM + persisted queue)
|
||||||
void MessageStore::dismissOldestMessage()
|
void MessageStore::deleteOldestMessage()
|
||||||
{
|
{
|
||||||
eraseIf(liveMessages, [](StoredMessage &) { return true; });
|
eraseIf(liveMessages, [](StoredMessage &) { return true; });
|
||||||
saveToFlash();
|
saveToFlash();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dismiss oldest message in a specific channel
|
// Delete oldest message in a specific channel
|
||||||
void MessageStore::dismissOldestMessageInChannel(uint8_t channel)
|
void MessageStore::deleteOldestMessageInChannel(uint8_t channel)
|
||||||
{
|
{
|
||||||
auto pred = [channel](const StoredMessage &m) { return m.type == MessageType::BROADCAST && m.channelIndex == channel; };
|
auto pred = [channel](const StoredMessage &m) { return m.type == MessageType::BROADCAST && m.channelIndex == channel; };
|
||||||
eraseIf(liveMessages, pred);
|
eraseIf(liveMessages, pred);
|
||||||
saveToFlash();
|
saveToFlash();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dismiss oldest message in a direct chat with a node
|
void MessageStore::deleteAllMessagesInChannel(uint8_t channel)
|
||||||
void MessageStore::dismissOldestMessageWithPeer(uint32_t peer)
|
{
|
||||||
|
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) {
|
auto pred = [peer](const StoredMessage &m) {
|
||||||
if (m.type != MessageType::DM_TO_US)
|
if (m.type != MessageType::DM_TO_US)
|
||||||
|
|||||||
@@ -94,12 +94,12 @@ class MessageStore
|
|||||||
// Clear all messages (RAM + persisted queue + text pool)
|
// Clear all messages (RAM + persisted queue + text pool)
|
||||||
void clearAllMessages();
|
void clearAllMessages();
|
||||||
|
|
||||||
// Dismiss helpers
|
// Delete helpers
|
||||||
void dismissOldestMessage(); // remove oldest from RAM (and flash on save)
|
void deleteOldestMessage(); // remove oldest from RAM (and flash on save)
|
||||||
|
void deleteOldestMessageInChannel(uint8_t channel);
|
||||||
// New targeted dismiss helpers
|
void deleteOldestMessageWithPeer(uint32_t peer);
|
||||||
void dismissOldestMessageInChannel(uint8_t channel);
|
void deleteAllMessagesInChannel(uint8_t channel);
|
||||||
void dismissOldestMessageWithPeer(uint32_t peer);
|
void deleteAllMessagesWithPeer(uint32_t peer);
|
||||||
|
|
||||||
// Unified accessor (for UI code, defaults to RAM buffer)
|
// Unified accessor (for UI code, defaults to RAM buffer)
|
||||||
const std::deque<StoredMessage> &getMessages() const { return liveMessages; }
|
const std::deque<StoredMessage> &getMessages() const { return liveMessages; }
|
||||||
|
|||||||
@@ -407,10 +407,9 @@ void menuHandler::clockMenu()
|
|||||||
};
|
};
|
||||||
screen->showOverlayBanner(bannerOptions);
|
screen->showOverlayBanner(bannerOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menuHandler::messageResponseMenu()
|
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 const char *optionsArray[enumEnd];
|
||||||
static int optionsEnumArray[enumEnd];
|
static int optionsEnumArray[enumEnd];
|
||||||
@@ -436,20 +435,9 @@ void menuHandler::messageResponseMenu()
|
|||||||
optionsArray[options] = "View Chats";
|
optionsArray[options] = "View Chats";
|
||||||
optionsEnumArray[options++] = ViewMode;
|
optionsEnumArray[options++] = ViewMode;
|
||||||
|
|
||||||
// Only show Dismiss All in View All mode
|
// Delete submenu
|
||||||
#if defined(M5STACK_UNITC6L)
|
optionsArray[options] = "Delete";
|
||||||
optionsArray[options] = "Delete All";
|
optionsEnumArray[options++] = 900;
|
||||||
#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;
|
|
||||||
|
|
||||||
#ifdef HAS_I2S
|
#ifdef HAS_I2S
|
||||||
optionsArray[options] = "Read Aloud";
|
optionsArray[options] = "Read Aloud";
|
||||||
@@ -477,25 +465,35 @@ void menuHandler::messageResponseMenu()
|
|||||||
if (selected == ViewMode) {
|
if (selected == ViewMode) {
|
||||||
menuHandler::menuQueue = menuHandler::message_viewmode_menu;
|
menuHandler::menuQueue = menuHandler::message_viewmode_menu;
|
||||||
screen->runNow();
|
screen->runNow();
|
||||||
} else if (selected == DismissAll) {
|
|
||||||
messageStore.clearAllMessages();
|
// Delete submenu
|
||||||
graphics::MessageRenderer::clearThreadRegistries();
|
} else if (selected == 900) {
|
||||||
graphics::MessageRenderer::clearMessageCache();
|
menuHandler::menuQueue = menuHandler::delete_messages_menu;
|
||||||
} else if (selected == DismissOldest) {
|
screen->runNow();
|
||||||
|
|
||||||
|
// Delete oldest FIRST (only change)
|
||||||
|
} else if (selected == DeleteOldest) {
|
||||||
auto mode = graphics::MessageRenderer::getThreadMode();
|
auto mode = graphics::MessageRenderer::getThreadMode();
|
||||||
int ch = graphics::MessageRenderer::getThreadChannel();
|
int ch = graphics::MessageRenderer::getThreadChannel();
|
||||||
uint32_t peer = graphics::MessageRenderer::getThreadPeer();
|
uint32_t peer = graphics::MessageRenderer::getThreadPeer();
|
||||||
|
|
||||||
if (mode == graphics::MessageRenderer::ThreadMode::ALL) {
|
if (mode == graphics::MessageRenderer::ThreadMode::ALL) {
|
||||||
// Global oldest
|
// Global oldest
|
||||||
messageStore.dismissOldestMessage();
|
messageStore.deleteOldestMessage();
|
||||||
} else if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
|
} else if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
|
||||||
// Oldest in current channel
|
// Oldest in current channel
|
||||||
messageStore.dismissOldestMessageInChannel(ch);
|
messageStore.deleteOldestMessageInChannel(ch);
|
||||||
} else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
|
} else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
|
||||||
// Oldest in current DM
|
// 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) {
|
} else if (selected == Preset || selected == Freetext) {
|
||||||
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
|
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
|
||||||
LOG_DEBUG("Replying to CHANNEL %d", ch);
|
LOG_DEBUG("Replying to CHANNEL %d", ch);
|
||||||
@@ -534,6 +532,80 @@ void menuHandler::messageResponseMenu()
|
|||||||
};
|
};
|
||||||
screen->showOverlayBanner(bannerOptions);
|
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()
|
void menuHandler::messageViewModeMenu()
|
||||||
{
|
{
|
||||||
@@ -1979,6 +2051,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display)
|
|||||||
case message_response_menu:
|
case message_response_menu:
|
||||||
messageResponseMenu();
|
messageResponseMenu();
|
||||||
break;
|
break;
|
||||||
|
case delete_messages_menu:
|
||||||
|
deleteMessagesMenu();
|
||||||
|
break;
|
||||||
case message_viewmode_menu:
|
case message_viewmode_menu:
|
||||||
messageViewModeMenu();
|
messageViewModeMenu();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class menuHandler
|
|||||||
throttle_message,
|
throttle_message,
|
||||||
message_response_menu,
|
message_response_menu,
|
||||||
message_viewmode_menu,
|
message_viewmode_menu,
|
||||||
|
delete_messages_menu,
|
||||||
node_name_length_menu,
|
node_name_length_menu,
|
||||||
FrameToggles,
|
FrameToggles,
|
||||||
DisplayUnits
|
DisplayUnits
|
||||||
@@ -64,6 +65,7 @@ class menuHandler
|
|||||||
static void ClockFacePicker();
|
static void ClockFacePicker();
|
||||||
static void messageResponseMenu();
|
static void messageResponseMenu();
|
||||||
static void messageViewModeMenu();
|
static void messageViewModeMenu();
|
||||||
|
static void deleteMessagesMenu();
|
||||||
static void homeBaseMenu();
|
static void homeBaseMenu();
|
||||||
static void textMessageBaseMenu();
|
static void textMessageBaseMenu();
|
||||||
static void systemBaseMenu();
|
static void systemBaseMenu();
|
||||||
|
|||||||
Reference in New Issue
Block a user