From c37b0d794f8e80c58bc8be37b4c99ef1af31e03e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Mon, 30 Mar 2026 21:02:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=BB=9A=E5=8A=A8=E6=95=B0=E7=BB=84=E8=B6=8A?= =?UTF-8?q?=E7=95=8C=E5=B4=A9=E6=BA=83\n\n-=20scrollDown()=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9C=80=E5=A4=A7=E8=BE=B9=E7=95=8C=E6=A3=80=E6=9F=A5?= =?UTF-8?q?\n-=20=E6=B8=B2=E6=9F=93=E5=87=BD=E6=95=B0=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20startIndex=20=E8=BE=B9=E7=95=8C=E6=A3=80=E6=9F=A5\n?= =?UTF-8?q?-=20=E5=88=87=E6=8D=A2=E6=A8=A1=E5=BC=8F=E6=97=B6=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E6=BB=9A=E5=8A=A8=E4=BD=8D=E7=BD=AE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/graphics/draw/NodeListRenderer.cpp | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp index 573ebbe..afc78c7 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp +++ b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp @@ -67,26 +67,33 @@ NodeListMode getCurrentMode() void switchToNextMode() { currentMode = static_cast((currentMode + 1) % MODE_COUNT); + scrollIndex = 0; // 切换模式时重置滚动位置 } void switchToPrevMode() { currentMode = static_cast((currentMode + MODE_COUNT - 1) % MODE_COUNT); + scrollIndex = 0; // 切换模式时重置滚动位置 } -// 滚动控制函数 +// 滚动控制函数(带边界检查) void scrollUp() { - scrollIndex--; - if (scrollIndex < 0) { - scrollIndex = 0; + if (scrollIndex > 0) { + scrollIndex--; } } void scrollDown() { - scrollIndex++; - // 最大滚动值在渲染时计算,这里只做简单限制 + // 获取节点数量并计算最大滚动值 + int totalEntries = nodeDB->getNumMeshNodes(); + int visibleNodeRows = 5; // 假设可见行数 + int maxScroll = calculateMaxScroll(totalEntries, visibleNodeRows); + + if (scrollIndex < maxScroll) { + scrollIndex++; + } } // 处理 UP 按键:单击滚动,双击切换模式 @@ -532,6 +539,13 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t int totalColumns = 2; #endif int startIndex = scrollIndex * visibleNodeRows * totalColumns; + + // 边界检查:确保 startIndex 不超出范围 + if (startIndex >= totalEntries) { + startIndex = 0; + scrollIndex = 0; // 重置滚动位置 + } + if (nodeDB->getMeshNodeByIndex(startIndex)->num == nodeDB->getNodeNum()) { startIndex++; // skip own node }