From 0861448de9ab71cf9851398d880606a5b5668717 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Thu, 2 Oct 2025 20:49:22 -0500 Subject: [PATCH] feat(ui): implement handling for key down repeat events --- src/ui/CSimpleEditBox.cpp | 17 +++++++++++++++++ src/ui/CSimpleEditBox.hpp | 1 + src/ui/CSimpleFrame.cpp | 4 ++++ src/ui/CSimpleFrame.hpp | 2 ++ src/ui/CSimpleTop.cpp | 21 ++++++++++++++++++--- src/ui/CSimpleTop.hpp | 2 +- 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/ui/CSimpleEditBox.cpp b/src/ui/CSimpleEditBox.cpp index 6945ce9..122026f 100644 --- a/src/ui/CSimpleEditBox.cpp +++ b/src/ui/CSimpleEditBox.cpp @@ -879,6 +879,23 @@ int32_t CSimpleEditBox::OnLayerKeyDown(const CKeyEvent& evt) { } } +int32_t CSimpleEditBox::OnLayerKeyDownRepeat(const CKeyEvent& evt) { + if (!this->m_visible) { + return 0; + } + + if (!CSimpleEditBox::s_currentFocus && this->m_autoFocus) { + CSimpleEditBox::SetKeyboardFocus(this); + return this->OnLayerKeyDown(evt); + } + + if (this->IsCurrentFocus()) { + return this->OnLayerKeyDown(evt); + } + + return 0; +} + int32_t CSimpleEditBox::OnLayerMouseDown(const CMouseEvent& evt, const char* btn) { int32_t eaten = CSimpleFrame::OnLayerMouseDown(evt, btn); diff --git a/src/ui/CSimpleEditBox.hpp b/src/ui/CSimpleEditBox.hpp index 5fb7e26..1272e8f 100644 --- a/src/ui/CSimpleEditBox.hpp +++ b/src/ui/CSimpleEditBox.hpp @@ -69,6 +69,7 @@ class CSimpleEditBox : public CSimpleFrame, CSimpleFontedFrame { virtual void LoadXML(XMLNode* node, CStatus* status); virtual void OnLayerUpdate(float elapsedSec); virtual void OnFrameSizeChanged(float width, float height); + virtual int32_t OnLayerKeyDownRepeat(const CKeyEvent& evt); virtual int32_t OnLayerChar(const CCharEvent& evt); virtual int32_t OnLayerKeyDown(const CKeyEvent& evt); virtual int32_t OnLayerMouseDown(const CMouseEvent& evt, const char* btn); diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index f0ef022..63fa796 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -1080,6 +1080,10 @@ int32_t CSimpleFrame::OnLayerKeyDown(const CKeyEvent& evt) { return 1; } +int32_t CSimpleFrame::OnLayerKeyDownRepeat(const CKeyEvent& evt) { + return 0; +} + int32_t CSimpleFrame::OnLayerKeyUp(const CKeyEvent& evt) { if (!this->m_visible || !this->m_onKeyUp.luaRef) { return 0; diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index 02eb4ab..ce3e45f 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -1,6 +1,7 @@ #ifndef UI_C_SIMPLE_FRAME_HPP #define UI_C_SIMPLE_FRAME_HPP +#include "event/CEvent.hpp" #include "ui/CRenderBatch.hpp" #include "ui/CScriptRegion.hpp" #include "ui/CSimpleRegion.hpp" @@ -97,6 +98,7 @@ class CSimpleFrame : public CScriptRegion { virtual void OnFrameSizeChanged(float width, float height); virtual void OnLayerCursorEnter(int32_t a2); virtual void OnLayerCursorExit(int32_t a2, int32_t a3); + virtual int32_t OnLayerKeyDownRepeat(const CKeyEvent& evt); virtual int32_t OnLayerChar(const CCharEvent& evt); virtual int32_t OnLayerKeyDown(const CKeyEvent& evt); virtual int32_t OnLayerKeyUp(const CKeyEvent& evt); diff --git a/src/ui/CSimpleTop.cpp b/src/ui/CSimpleTop.cpp index 78d0596..4db99bd 100644 --- a/src/ui/CSimpleTop.cpp +++ b/src/ui/CSimpleTop.cpp @@ -123,9 +123,24 @@ int32_t CSimpleTop::OnKeyDown(const EVENT_DATA_KEY* pKeyData, void* param) { return eaten == 0; } -int32_t CSimpleTop::OnKeyDownRepeat(const void* a1, void* a2) { - // TODO - return 0; +int32_t CSimpleTop::OnKeyDownRepeat(const EVENT_DATA_KEY* pKeyData, void* param) { + auto top = static_cast(param); + + int32_t eaten = 0; + + CSimpleFrame* frame = top->m_keydownCapture[pKeyData->key]; + + if (frame) { + CKeyEvent keyEvent; + keyEvent = *pKeyData; + keyEvent.id = 0x40060065; + + frame->OnLayerKeyDownRepeat(keyEvent); + + eaten = 1; + } + + return eaten == 0; } int32_t CSimpleTop::OnKeyUp(const EVENT_DATA_KEY* pKeyData, void* param) { diff --git a/src/ui/CSimpleTop.hpp b/src/ui/CSimpleTop.hpp index 6368742..eaa6f7a 100644 --- a/src/ui/CSimpleTop.hpp +++ b/src/ui/CSimpleTop.hpp @@ -36,7 +36,7 @@ class CSimpleTop : public CLayoutFrame { static int32_t OnFocusChanged(const void* a1, void* a2); static int32_t OnIme(const void* a1, void* a2); static int32_t OnKeyDown(const EVENT_DATA_KEY* pKeyData, void* param); - static int32_t OnKeyDownRepeat(const void* a1, void* a2); + static int32_t OnKeyDownRepeat(const EVENT_DATA_KEY* pKeyData, void* param); static int32_t OnKeyUp(const EVENT_DATA_KEY* pKeyData, void* param); static int32_t OnMouseDown(const EVENT_DATA_MOUSE* pMouseData, void* param); static int32_t OnMouseMove(const EVENT_DATA_MOUSE* pMouseData, void* param);