From ef99939d6f3e544d68eda33629531b6169189b83 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:43:21 -0500 Subject: [PATCH] Pagination fix for Latest to oldest per page --- src/graphics/Screen.cpp | 3 +- src/graphics/draw/NodeListRenderer.cpp | 38 ++++++++++++++++---------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 880cd3553..52b26a72b 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1665,8 +1665,7 @@ int Screen::handleInputEvent(const InputEvent *event) ui->getUiState()->currentFrame == framesetInfo.positions.nodelist_lastheard || ui->getUiState()->currentFrame == framesetInfo.positions.nodelist_hopsignal || ui->getUiState()->currentFrame == framesetInfo.positions.nodelist_distance || - ui->getUiState()->currentFrame == framesetInfo.positions.nodelist_bearings) - { + ui->getUiState()->currentFrame == framesetInfo.positions.nodelist_bearings) { if (event->inputEvent == INPUT_BROKER_UP) { graphics::NodeListRenderer::scrollUp(); setFastFramerate(); diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index ab6ac4c04..564bae8ee 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -500,30 +500,40 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t int totalRowsAvailable = (display->getHeight() - y) / rowYOffset; int numskipped = 0; int visibleNodeRows = totalRowsAvailable; - int startIndex = scrollIndex * visibleNodeRows * totalColumns; - if (nodeDB->getMeshNodeByIndex(startIndex)->num == nodeDB->getNodeNum()) { - startIndex++; // skip own node - } - int endIndex = std::min(startIndex + visibleNodeRows * totalColumns, totalEntries); + // Build filtered + ordered list + std::vector drawList; + drawList.reserve(totalEntries); + for (int i = 0; i < totalEntries; i++) { + auto *n = nodeDB->getMeshNodeByIndex(i); + + if (!n) continue; + if (n->num == nodeDB->getNodeNum()) + continue; + if (locationScreen && !n->has_position) + continue; + + drawList.push_back(n->num); + } + totalEntries = drawList.size(); + int startIndex = scrollIndex * visibleNodeRows * totalColumns; + int endIndex = std::min(startIndex + visibleNodeRows * totalColumns, totalEntries); int yOffset = 0; int col = 0; int lastNodeY = y; int shownCount = 0; int rowCount = 0; - for (int i = startIndex; i < endIndex; ++i) { - if (locationScreen && !nodeDB->getMeshNodeByIndex(i)->has_position) { - numskipped++; - continue; - } + for (int idx = startIndex; idx < endIndex; idx++) { + uint32_t nodeNum = drawList[idx]; + auto *node = nodeDB->getMeshNode(nodeNum); int xPos = x + (col * columnWidth); int yPos = y + yOffset; - renderer(display, nodeDB->getMeshNodeByIndex(i), xPos, yPos, columnWidth); - if (extras) { - extras(display, nodeDB->getMeshNodeByIndex(i), xPos, yPos, columnWidth, heading, lat, lon); - } + renderer(display, node, xPos, yPos, columnWidth); + + if (extras) + extras(display, node, xPos, yPos, columnWidth, heading, lat, lon); lastNodeY = std::max(lastNodeY, yPos + FONT_HEIGHT_SMALL); yOffset += rowYOffset;