Message menu cleanup

This commit is contained in:
HarukiToreda
2025-11-10 01:32:45 -05:00
parent b3f4e81827
commit 9441f0c143
2 changed files with 126 additions and 40 deletions

View File

@@ -409,7 +409,7 @@ void menuHandler::clockMenu()
} }
void menuHandler::messageResponseMenu() void menuHandler::messageResponseMenu()
{ {
enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, Preset, Freetext, Aloud, enumEnd }; enum optionsNumbers { Back = 0, ViewMode, DeleteAll, DeleteOldest, ReplyMenu, Aloud, enumEnd };
static const char *optionsArray[enumEnd]; static const char *optionsArray[enumEnd];
static int optionsEnumArray[enumEnd]; static int optionsEnumArray[enumEnd];
@@ -420,17 +420,9 @@ void menuHandler::messageResponseMenu()
optionsArray[options] = "Back"; optionsArray[options] = "Back";
optionsEnumArray[options++] = Back; optionsEnumArray[options++] = Back;
#if defined(M5STACK_UNITC6L) // New Reply submenu (replaces Preset and Freetext directly in this menu)
optionsArray[options] = "Respond Preset"; optionsArray[options] = "Reply";
#else optionsEnumArray[options++] = ReplyMenu;
optionsArray[options] = "Respond via Preset";
#endif
optionsEnumArray[options++] = Preset;
if (kb_found) {
optionsArray[options] = "Respond via Freetext";
optionsEnumArray[options++] = Freetext;
}
optionsArray[options] = "View Chats"; optionsArray[options] = "View Chats";
optionsEnumArray[options++] = ViewMode; optionsEnumArray[options++] = ViewMode;
@@ -466,6 +458,11 @@ void menuHandler::messageResponseMenu()
menuHandler::menuQueue = menuHandler::message_viewmode_menu; menuHandler::menuQueue = menuHandler::message_viewmode_menu;
screen->runNow(); screen->runNow();
// Reply submenu
} else if (selected == ReplyMenu) {
menuHandler::menuQueue = menuHandler::reply_menu;
screen->runNow();
// Delete submenu // Delete submenu
} else if (selected == 900) { } else if (selected == 900) {
menuHandler::menuQueue = menuHandler::delete_messages_menu; menuHandler::menuQueue = menuHandler::delete_messages_menu;
@@ -494,34 +491,6 @@ void menuHandler::messageResponseMenu()
graphics::MessageRenderer::clearThreadRegistries(); graphics::MessageRenderer::clearThreadRegistries();
graphics::MessageRenderer::clearMessageCache(); graphics::MessageRenderer::clearMessageCache();
} else if (selected == Preset || selected == Freetext) {
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
LOG_DEBUG("Replying to CHANNEL %d", ch);
if (selected == Preset)
cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, ch);
else
cannedMessageModule->LaunchFreetextWithDestination(NODENUM_BROADCAST, ch);
} else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
LOG_DEBUG("Replying to DIRECT peer=0x%08x", peer);
if (selected == Preset)
cannedMessageModule->LaunchWithDestination(peer);
else
cannedMessageModule->LaunchFreetextWithDestination(peer);
} else {
LOG_DEBUG("Fallback reply using last rx_text_message");
if (devicestate.rx_text_message.to == NODENUM_BROADCAST) {
if (selected == Preset)
cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, devicestate.rx_text_message.channel);
else
cannedMessageModule->LaunchFreetextWithDestination(NODENUM_BROADCAST,
devicestate.rx_text_message.channel);
} else {
if (selected == Preset)
cannedMessageModule->LaunchWithDestination(devicestate.rx_text_message.from);
else
cannedMessageModule->LaunchFreetextWithDestination(devicestate.rx_text_message.from);
}
}
#ifdef HAS_I2S #ifdef HAS_I2S
} else if (selected == Aloud) { } else if (selected == Aloud) {
const meshtastic_MeshPacket &mp = devicestate.rx_text_message; const meshtastic_MeshPacket &mp = devicestate.rx_text_message;
@@ -532,6 +501,118 @@ void menuHandler::messageResponseMenu()
}; };
screen->showOverlayBanner(bannerOptions); screen->showOverlayBanner(bannerOptions);
} }
void menuHandler::replyMenu()
{
enum replyOptions { Back = 0, ReplyPreset, ReplyFreetext, enumEnd };
static const char *optionsArray[enumEnd];
static int optionsEnumArray[enumEnd];
int options = 0;
// Back
optionsArray[options] = "Back";
optionsEnumArray[options++] = Back;
// Preset reply
#if defined(M5STACK_UNITC6L)
optionsArray[options] = "With Preset";
#else
optionsArray[options] = "With Preset";
#endif
optionsEnumArray[options++] = ReplyPreset;
// Freetext reply (only when keyboard exists)
if (kb_found) {
optionsArray[options] = "With Freetext";
optionsEnumArray[options++] = ReplyFreetext;
}
BannerOverlayOptions bannerOptions;
// Dynamic title based on thread mode
auto mode = graphics::MessageRenderer::getThreadMode();
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
bannerOptions.message = "Reply to Channel";
}
else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
bannerOptions.message = "Reply to DM";
}
else {
// View All
bannerOptions.message = "Reply to Last Msg";
}
bannerOptions.optionsArrayPtr = optionsArray;
bannerOptions.optionsEnumPtr = optionsEnumArray;
bannerOptions.optionsCount = options;
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;
}
// Preset reply
if (selected == ReplyPreset) {
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST, ch);
} else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
cannedMessageModule->LaunchWithDestination(peer);
} else {
// Fallback for last received message
if (devicestate.rx_text_message.to == NODENUM_BROADCAST) {
cannedMessageModule->LaunchWithDestination(
NODENUM_BROADCAST,
devicestate.rx_text_message.channel
);
} else {
cannedMessageModule->LaunchWithDestination(
devicestate.rx_text_message.from
);
}
}
return;
}
// Freetext reply
if (selected == ReplyFreetext) {
if (mode == graphics::MessageRenderer::ThreadMode::CHANNEL) {
cannedMessageModule->LaunchFreetextWithDestination(NODENUM_BROADCAST, ch);
} else if (mode == graphics::MessageRenderer::ThreadMode::DIRECT) {
cannedMessageModule->LaunchFreetextWithDestination(peer);
} else {
// Fallback for last received message
if (devicestate.rx_text_message.to == NODENUM_BROADCAST) {
cannedMessageModule->LaunchFreetextWithDestination(
NODENUM_BROADCAST,
devicestate.rx_text_message.channel
);
} else {
cannedMessageModule->LaunchFreetextWithDestination(
devicestate.rx_text_message.from
);
}
}
return;
}
};
screen->showOverlayBanner(bannerOptions);
}
void menuHandler::deleteMessagesMenu() void menuHandler::deleteMessagesMenu()
{ {
enum optionsNumbers { Back = 0, DeleteOldest, DeleteThis, DeleteAll, enumEnd }; enum optionsNumbers { Back = 0, DeleteOldest, DeleteThis, DeleteAll, enumEnd };
@@ -2070,6 +2151,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display)
case message_response_menu: case message_response_menu:
messageResponseMenu(); messageResponseMenu();
break; break;
case reply_menu:
replyMenu();
break;
case delete_messages_menu: case delete_messages_menu:
deleteMessagesMenu(); deleteMessagesMenu();
break; break;

View File

@@ -45,6 +45,7 @@ class menuHandler
throttle_message, throttle_message,
message_response_menu, message_response_menu,
message_viewmode_menu, message_viewmode_menu,
reply_menu,
delete_messages_menu, delete_messages_menu,
node_name_length_menu, node_name_length_menu,
FrameToggles, FrameToggles,
@@ -65,6 +66,7 @@ class menuHandler
static void ClockFacePicker(); static void ClockFacePicker();
static void messageResponseMenu(); static void messageResponseMenu();
static void messageViewModeMenu(); static void messageViewModeMenu();
static void replyMenu();
static void deleteMessagesMenu(); static void deleteMessagesMenu();
static void homeBaseMenu(); static void homeBaseMenu();
static void textMessageBaseMenu(); static void textMessageBaseMenu();