diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp b/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp index 0db0505..5144264 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp +++ b/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp @@ -1597,17 +1597,19 @@ int Screen::handleInputEvent(const InputEvent *event) } else if (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS) { showNextFrame(); } else if (event->inputEvent == INPUT_BROKER_UP) { - // 在节点列表界面,双击切换到上一个模式 + // 在节点列表界面,单击滚动,双击切换模式 if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) { - if (graphics::NodeListRenderer::handleUpDoubleClick()) { + int result = graphics::NodeListRenderer::handleUpKey(); + if (result > 0) { setFastFramerate(); ui->update(); } } } else if (event->inputEvent == INPUT_BROKER_DOWN) { - // 在节点列表界面,双击切换到下一个模式 + // 在节点列表界面,单击滚动,双击切换模式 if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) { - if (graphics::NodeListRenderer::handleDownDoubleClick()) { + int result = graphics::NodeListRenderer::handleDownKey(); + if (result > 0) { setFastFramerate(); ui->update(); } 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 0c6c46a..573ebbe 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 @@ -74,38 +74,57 @@ void switchToPrevMode() currentMode = static_cast((currentMode + MODE_COUNT - 1) % MODE_COUNT); } -// 处理 UP 按键双击检测(从 Screen.cpp 调用) -// 返回 true 表示检测到双击,需要切换模式 -bool handleUpDoubleClick() +// 滚动控制函数 +void scrollUp() +{ + scrollIndex--; + if (scrollIndex < 0) { + scrollIndex = 0; + } +} + +void scrollDown() +{ + scrollIndex++; + // 最大滚动值在渲染时计算,这里只做简单限制 +} + +// 处理 UP 按键:单击滚动,双击切换模式 +// 返回 0: 无操作, 1: 滚动触发, 2: 模式切换触发 +int handleUpKey() { unsigned long now = millis(); if (lastUpPressTime > 0 && (now - lastUpPressTime) < DOUBLE_CLICK_THRESHOLD_MS) { // 双击触发:切换到上一个模式 switchToPrevMode(); - lastUpPressTime = 0; // 重置,防止三次点击触发两次 - return true; + lastUpPressTime = 0; + return 2; } + // 单击触发:滚动 + scrollUp(); lastUpPressTime = now; - return false; + return 1; } -// 处理 DOWN 按键双击检测(从 Screen.cpp 调用) -// 返回 true 表示检测到双击,需要切换模式 -bool handleDownDoubleClick() +// 处理 DOWN 按键:单击滚动,双击切换模式 +// 返回 0: 无操作, 1: 滚动触发, 2: 模式切换触发 +int handleDownKey() { unsigned long now = millis(); if (lastDownPressTime > 0 && (now - lastDownPressTime) < DOUBLE_CLICK_THRESHOLD_MS) { // 双击触发:切换到下一个模式 switchToNextMode(); - lastDownPressTime = 0; // 重置,防止三次点击触发两次 - return true; + lastDownPressTime = 0; + return 2; } + // 单击触发:滚动 + scrollDown(); lastDownPressTime = now; - return false; + return 1; } // ============================= diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h index 5b4ee33..814150c 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h +++ b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h @@ -59,9 +59,14 @@ void switchToNextMode(); void switchToPrevMode(); NodeListMode getCurrentMode(); -// Double-click detection for UP/DOWN keys (returns true if double-click detected) -bool handleUpDoubleClick(); -bool handleDownDoubleClick(); +// Scroll control functions +void scrollUp(); +void scrollDown(); + +// UP/DOWN key handler: single click = scroll, double click = switch mode +// Returns: 0=no action, 1=scroll triggered, 2=mode switch triggered +int handleUpKey(); +int handleDownKey(); // Bitmap drawing function void drawScaledXBitmap16x16(int x, int y, int width, int height, const uint8_t *bitmapXBM, OLEDDisplay *display);