mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-09 11:27:29 +00:00
Fix for DM threading
This commit is contained in:
@@ -444,7 +444,7 @@ void menuHandler::messageViewModeMenu()
|
||||
labels.push_back("View All");
|
||||
ids.push_back(-2);
|
||||
|
||||
// --- Add channels with live messages ---
|
||||
// Add channels with live messages
|
||||
for (int ch = 0; ch < 8; ++ch) {
|
||||
auto msgs = messageStore.getChannelMessages(ch);
|
||||
if (!msgs.empty()) {
|
||||
@@ -460,7 +460,7 @@ void menuHandler::messageViewModeMenu()
|
||||
}
|
||||
}
|
||||
|
||||
// --- Add channels from registry ---
|
||||
// Add channels from registry
|
||||
for (int ch : graphics::MessageRenderer::getSeenChannels()) {
|
||||
if (std::find(ids.begin(), ids.end(), 100 + ch) == ids.end()) {
|
||||
char buf[40];
|
||||
@@ -475,39 +475,40 @@ void menuHandler::messageViewModeMenu()
|
||||
}
|
||||
}
|
||||
|
||||
// --- Add DMs from live store ---
|
||||
// Add DMs from live store
|
||||
auto dms = messageStore.getDirectMessages();
|
||||
std::vector<uint32_t> uniqueSenders;
|
||||
std::vector<uint32_t> uniquePeers;
|
||||
for (auto &m : dms) {
|
||||
if (std::find(uniqueSenders.begin(), uniqueSenders.end(), m.sender) == uniqueSenders.end()) {
|
||||
uniqueSenders.push_back(m.sender);
|
||||
uint32_t peer = (m.sender == nodeDB->getNodeNum()) ? m.dest : m.sender;
|
||||
if (peer != nodeDB->getNodeNum() && std::find(uniquePeers.begin(), uniquePeers.end(), peer) == uniquePeers.end()) {
|
||||
uniquePeers.push_back(peer);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Add DMs from registry ---
|
||||
// Add DMs from registry
|
||||
for (uint32_t peer : graphics::MessageRenderer::getSeenPeers()) {
|
||||
if (std::find(uniqueSenders.begin(), uniqueSenders.end(), peer) == uniqueSenders.end()) {
|
||||
uniqueSenders.push_back(peer);
|
||||
if (peer != nodeDB->getNodeNum() && std::find(uniquePeers.begin(), uniquePeers.end(), peer) == uniquePeers.end()) {
|
||||
uniquePeers.push_back(peer);
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(uniqueSenders.begin(), uniqueSenders.end());
|
||||
std::sort(uniquePeers.begin(), uniquePeers.end());
|
||||
|
||||
for (auto sender : uniqueSenders) {
|
||||
auto node = nodeDB->getMeshNode(sender);
|
||||
for (auto peer : uniquePeers) {
|
||||
auto node = nodeDB->getMeshNode(peer);
|
||||
std::string name;
|
||||
if (node && node->has_user) {
|
||||
name = sanitizeString(node->user.long_name).substr(0, 15);
|
||||
} else {
|
||||
char buf[20];
|
||||
snprintf(buf, sizeof(buf), "Node %08X", sender);
|
||||
snprintf(buf, sizeof(buf), "Node %08X", peer);
|
||||
name = buf;
|
||||
}
|
||||
labels.push_back("DM: " + name);
|
||||
ids.push_back(sender);
|
||||
ids.push_back(peer);
|
||||
}
|
||||
|
||||
// --- Determine active ID ---
|
||||
// Determine active ID
|
||||
int activeId = -2;
|
||||
auto mode = graphics::MessageRenderer::getThreadMode();
|
||||
if (mode == graphics::MessageRenderer::ThreadMode::ALL) {
|
||||
|
||||
@@ -192,12 +192,12 @@ void resetScrollState()
|
||||
|
||||
didReset = false; // <-- now valid
|
||||
}
|
||||
// --- Current thread state ---
|
||||
// Current thread state
|
||||
static ThreadMode currentMode = ThreadMode::ALL;
|
||||
static int currentChannel = -1;
|
||||
static uint32_t currentPeer = 0;
|
||||
|
||||
// --- Registry of seen threads for manual toggle ---
|
||||
// Registry of seen threads for manual toggle
|
||||
static std::vector<int> seenChannels;
|
||||
static std::vector<uint32_t> seenPeers;
|
||||
|
||||
@@ -270,7 +270,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
||||
include = true;
|
||||
break;
|
||||
case ThreadMode::DIRECT:
|
||||
if (m.type == MessageType::DM_TO_US && m.sender == currentPeer)
|
||||
if (m.type == MessageType::DM_TO_US && (m.sender == currentPeer || m.dest == currentPeer))
|
||||
include = true;
|
||||
break;
|
||||
}
|
||||
@@ -344,7 +344,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
||||
for (auto it = filtered.rbegin(); it != filtered.rend(); ++it) {
|
||||
const auto &m = *it;
|
||||
|
||||
// --- Build header line for this message ---
|
||||
// Build header line for this message
|
||||
meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(m.sender);
|
||||
const char *sender = "???";
|
||||
#if defined(M5STACK_UNITC6L)
|
||||
@@ -408,7 +408,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
|
||||
isMine.push_back(mine);
|
||||
isHeader.push_back(true);
|
||||
|
||||
// --- Split message text into wrapped lines ---
|
||||
// Split message text into wrapped lines
|
||||
std::vector<std::string> wrapped = generateLines(display, "", m.text.c_str(), textWidth);
|
||||
for (auto &ln : wrapped) {
|
||||
allLines.push_back(ln);
|
||||
|
||||
Reference in New Issue
Block a user