mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-08-03 10:46:12 +00:00
feat(ui): Favourites phase 3 — in-place pin picker on empty tile
Enter on an empty Favourites slot opens a PopupMenu listing candidate contacts. Sourced first from upstream-favourited chat contacts (those flagged with c.flags & 0x01), then from recent DM contacts (resolved from the 4-byte _dm_hist prefix to a full 6-byte pub_key via the contact list), deduped against the favourites list. Capped at 12 entries. Selection writes the chosen 6-byte prefix into the target slot; if the contact is already pinned elsewhere, the previous slot is vacated first (one contact per dial, per the agreed pin-only semantics). savePrefs commits to flash and a brief alert confirms. Plumbing: - New QuickMsgScreen::getRecentDMContacts() resolves recent DM senders to 6-byte pub_key prefixes, deduped, newest first - UITask::getRecentDMContacts() wraps it so HomeScreen doesn't reach into the QuickMsg screen directly - HomeScreen gains its own PopupMenu + per-entry pub_key / label buffers (12 × 6 B keys + 12 × 22 B labels), no shared state with QuickMsg's Contact-options menu Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
c5faaf0afe
commit
e1cbd959b2
@@ -475,6 +475,32 @@ public:
|
||||
_viewing_max_seen = 0;
|
||||
}
|
||||
|
||||
// Recent DM contacts, newest first, deduped. Resolves the 4-byte
|
||||
// _dm_hist prefix to a 6-byte pub_key prefix by walking the contact
|
||||
// list once per unique sender. Returns the number filled.
|
||||
int getRecentDMContacts(uint8_t out[][NodePrefs::FAVOURITE_PREFIX_LEN], int max) const {
|
||||
int n = 0;
|
||||
for (int i = _dm_hist_count - 1; i >= 0 && n < max; i--) {
|
||||
int pos = (_dm_hist_head + i) % DM_HIST_MAX;
|
||||
const uint8_t* p4 = _dm_hist[pos].prefix;
|
||||
// Skip if already collected.
|
||||
bool dup = false;
|
||||
for (int j = 0; j < n; j++) if (memcmp(out[j], p4, 4) == 0) { dup = true; break; }
|
||||
if (dup) continue;
|
||||
// Find a real contact whose pub_key starts with this 4-byte prefix.
|
||||
for (int idx = 0; ; idx++) {
|
||||
ContactInfo c;
|
||||
if (!the_mesh.getContactByIdx(idx, c)) break;
|
||||
if (memcmp(c.id.pub_key, p4, 4) == 0) {
|
||||
memcpy(out[n], c.id.pub_key, NodePrefs::FAVOURITE_PREFIX_LEN);
|
||||
n++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
// Jump straight into a contact's DM history (used by the Favourites dial).
|
||||
// Caller must have already reset() the screen. Marks the entry so KEY_CANCEL
|
||||
// from DM_HIST returns to the home screen instead of falling back through
|
||||
|
||||
Reference in New Issue
Block a user