fix: 节点列表改用双击切换模式\n\n- TCA9535 不支持长按事件,改用双击检测(400ms内连续两次按键)\n- 双击 UP:切换到上一个模式\n- 双击 DOWN:切换到下一个模式\n- 单击:保持原有行为(滚动界面)"
This commit is contained in:
@@ -1597,16 +1597,20 @@ int Screen::handleInputEvent(const InputEvent *event)
|
|||||||
} else if (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS) {
|
} else if (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS) {
|
||||||
showNextFrame();
|
showNextFrame();
|
||||||
} else if (event->inputEvent == INPUT_BROKER_UP) {
|
} else if (event->inputEvent == INPUT_BROKER_UP) {
|
||||||
// 在节点列表界面,记录按键按下时间,由渲染函数检测长按
|
// 在节点列表界面,双击切换到上一个模式
|
||||||
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) {
|
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) {
|
||||||
graphics::NodeListRenderer::onUpPressed();
|
if (graphics::NodeListRenderer::handleUpDoubleClick()) {
|
||||||
setFastFramerate();
|
setFastFramerate();
|
||||||
|
ui->update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (event->inputEvent == INPUT_BROKER_DOWN) {
|
} else if (event->inputEvent == INPUT_BROKER_DOWN) {
|
||||||
// 在节点列表界面,记录按键按下时间,由渲染函数检测长按
|
// 在节点列表界面,双击切换到下一个模式
|
||||||
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) {
|
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) {
|
||||||
graphics::NodeListRenderer::onDownPressed();
|
if (graphics::NodeListRenderer::handleDownDoubleClick()) {
|
||||||
setFastFramerate();
|
setFastFramerate();
|
||||||
|
ui->update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (event->inputEvent == INPUT_BROKER_SELECT) {
|
} else if (event->inputEvent == INPUT_BROKER_SELECT) {
|
||||||
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.home) {
|
if (this->ui->getUiState()->currentFrame == framesetInfo.positions.home) {
|
||||||
|
|||||||
@@ -50,12 +50,10 @@ static NodeListMode currentMode = MODE_LAST_HEARD;
|
|||||||
static int scrollIndex = 0;
|
static int scrollIndex = 0;
|
||||||
static bool autoCycleEnabled = false; // 禁用自动切换,改为手动按键控制
|
static bool autoCycleEnabled = false; // 禁用自动切换,改为手动按键控制
|
||||||
|
|
||||||
// 长按检测变量
|
// 双击检测变量(用于切换模式)
|
||||||
static unsigned long lastUpPressTime = 0;
|
static unsigned long lastUpPressTime = 0;
|
||||||
static unsigned long lastDownPressTime = 0;
|
static unsigned long lastDownPressTime = 0;
|
||||||
static bool upLongPressHandled = false;
|
#define DOUBLE_CLICK_THRESHOLD_MS 400
|
||||||
static bool downLongPressHandled = false;
|
|
||||||
#define LONG_PRESS_THRESHOLD_MS 500
|
|
||||||
|
|
||||||
// =============================
|
// =============================
|
||||||
// Mode Control Functions (manual UP/DOWN control)
|
// Mode Control Functions (manual UP/DOWN control)
|
||||||
@@ -76,70 +74,38 @@ void switchToPrevMode()
|
|||||||
currentMode = static_cast<NodeListMode>((currentMode + MODE_COUNT - 1) % MODE_COUNT);
|
currentMode = static_cast<NodeListMode>((currentMode + MODE_COUNT - 1) % MODE_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理 UP 按键(短按滚动,长按切换模式)
|
// 处理 UP 按键双击检测(从 Screen.cpp 调用)
|
||||||
void handleUpKey(bool isLongPress)
|
// 返回 true 表示检测到双击,需要切换模式
|
||||||
{
|
bool handleUpDoubleClick()
|
||||||
if (isLongPress) {
|
|
||||||
switchToPrevMode();
|
|
||||||
}
|
|
||||||
// 短按不做任何事(让 Screen.cpp 处理滚动)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理 DOWN 按键(短按滚动,长按切换模式)
|
|
||||||
void handleDownKey(bool isLongPress)
|
|
||||||
{
|
|
||||||
if (isLongPress) {
|
|
||||||
switchToNextMode();
|
|
||||||
}
|
|
||||||
// 短按不做任何事(让 Screen.cpp 处理滚动)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定时器函数,检查长按状态(在 runOnce 中调用)
|
|
||||||
void checkLongPress()
|
|
||||||
{
|
{
|
||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
|
|
||||||
// 检查 UP 长按
|
if (lastUpPressTime > 0 && (now - lastUpPressTime) < DOUBLE_CLICK_THRESHOLD_MS) {
|
||||||
if (lastUpPressTime > 0 && !upLongPressHandled) {
|
// 双击触发:切换到上一个模式
|
||||||
if (now - lastUpPressTime > LONG_PRESS_THRESHOLD_MS) {
|
|
||||||
switchToPrevMode();
|
switchToPrevMode();
|
||||||
upLongPressHandled = true;
|
lastUpPressTime = 0; // 重置,防止三次点击触发两次
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查 DOWN 长按
|
lastUpPressTime = now;
|
||||||
if (lastDownPressTime > 0 && !downLongPressHandled) {
|
return false;
|
||||||
if (now - lastDownPressTime > LONG_PRESS_THRESHOLD_MS) {
|
}
|
||||||
|
|
||||||
|
// 处理 DOWN 按键双击检测(从 Screen.cpp 调用)
|
||||||
|
// 返回 true 表示检测到双击,需要切换模式
|
||||||
|
bool handleDownDoubleClick()
|
||||||
|
{
|
||||||
|
unsigned long now = millis();
|
||||||
|
|
||||||
|
if (lastDownPressTime > 0 && (now - lastDownPressTime) < DOUBLE_CLICK_THRESHOLD_MS) {
|
||||||
|
// 双击触发:切换到下一个模式
|
||||||
switchToNextMode();
|
switchToNextMode();
|
||||||
downLongPressHandled = true;
|
lastDownPressTime = 0; // 重置,防止三次点击触发两次
|
||||||
}
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 标记按键按下(从 Screen.cpp 调用)
|
lastDownPressTime = now;
|
||||||
void onUpPressed()
|
return false;
|
||||||
{
|
|
||||||
lastUpPressTime = millis();
|
|
||||||
upLongPressHandled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void onDownPressed()
|
|
||||||
{
|
|
||||||
lastDownPressTime = millis();
|
|
||||||
downLongPressHandled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 标记按键释放(从 Screen.cpp 调用)
|
|
||||||
void onUpReleased()
|
|
||||||
{
|
|
||||||
lastUpPressTime = 0;
|
|
||||||
upLongPressHandled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void onDownReleased()
|
|
||||||
{
|
|
||||||
lastDownPressTime = 0;
|
|
||||||
downLongPressHandled = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============================
|
// =============================
|
||||||
@@ -615,9 +581,6 @@ void drawDynamicNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state,
|
|||||||
|
|
||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
|
|
||||||
// 检查长按并切换模式
|
|
||||||
checkLongPress();
|
|
||||||
|
|
||||||
// 如果模式改变了,强制刷新显示
|
// 如果模式改变了,强制刷新显示
|
||||||
if (previousMode != currentMode) {
|
if (previousMode != currentMode) {
|
||||||
previousMode = currentMode;
|
previousMode = currentMode;
|
||||||
|
|||||||
@@ -59,12 +59,9 @@ void switchToNextMode();
|
|||||||
void switchToPrevMode();
|
void switchToPrevMode();
|
||||||
NodeListMode getCurrentMode();
|
NodeListMode getCurrentMode();
|
||||||
|
|
||||||
// Long press detection for UP/DOWN keys
|
// Double-click detection for UP/DOWN keys (returns true if double-click detected)
|
||||||
void onUpPressed();
|
bool handleUpDoubleClick();
|
||||||
void onDownPressed();
|
bool handleDownDoubleClick();
|
||||||
void onUpReleased();
|
|
||||||
void onDownReleased();
|
|
||||||
void checkLongPress();
|
|
||||||
|
|
||||||
// Bitmap drawing function
|
// Bitmap drawing function
|
||||||
void drawScaledXBitmap16x16(int x, int y, int width, int height, const uint8_t *bitmapXBM, OLEDDisplay *display);
|
void drawScaledXBitmap16x16(int x, int y, int width, int height, const uint8_t *bitmapXBM, OLEDDisplay *display);
|
||||||
|
|||||||
Reference in New Issue
Block a user