diff --git a/modules/mainmenu/entergame.lua b/modules/mainmenu/entergame.lua index 2723a64c..c1b055fc 100644 --- a/modules/mainmenu/entergame.lua +++ b/modules/mainmenu/entergame.lua @@ -26,6 +26,17 @@ local function createCharactersWindow(characters, premDays) local charactersList = charactersWindow:getChildById('charactersList') local accountStatusLabel = charactersWindow:getChildById('accountStatusLabel') + function charactersWindow:onKeyPress(keyCode, keyChar, keyboardModifiers) + if keyboardModifiers == KeyboardNoModifier then + if keyCode == KeyUp or keyCode == KeyTab then + charactersList:focusPreviousChild(ActiveFocusReason) + elseif keyCode == KeyDown then + charactersList:focusNextChild(ActiveFocusReason) + end + end + return false + end + for i,characterInfo in ipairs(characters) do local characterName = characterInfo[1] local worldName = characterInfo[2] diff --git a/src/framework/luascript/luafunctions.cpp b/src/framework/luascript/luafunctions.cpp index 8187135d..f7780691 100644 --- a/src/framework/luascript/luafunctions.cpp +++ b/src/framework/luascript/luafunctions.cpp @@ -69,6 +69,8 @@ void LuaInterface::registerFunctions() g_lua.bindClassMemberFunction("removeChild", &UIWidget::removeChild); g_lua.bindClassMemberFunction("addChild", &UIWidget::addChild); g_lua.bindClassMemberFunction("focusChild", &UIWidget::focusChild); + g_lua.bindClassMemberFunction("focusNextChild", &UIWidget::focusNextChild); + g_lua.bindClassMemberFunction("focusPreviousChild", &UIWidget::focusPreviousChild); g_lua.bindClassMemberFunction("lockChild", &UIWidget::lockChild); g_lua.bindClassMemberFunction("updateLayout", &UIWidget::updateLayout); g_lua.bindClassMemberFunction("updateParentLayout", &UIWidget::updateParentLayout); diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index 5b5ee831..ed76b039 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -410,6 +410,32 @@ void UIWidget::focusNextChild(Fw::FocusReason reason) focusChild(toFocus, reason); } +void UIWidget::focusPreviousChild(Fw::FocusReason reason) +{ + UIWidgetPtr toFocus; + UIWidgetList rotatedChildren(m_children); + std::reverse(m_children.begin(), m_children.end()); + + if(m_focusedChild) { + auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(), m_focusedChild); + if(focusedIt != rotatedChildren.end()) { + std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end()); + rotatedChildren.pop_front(); + } + } + + // finds next child to focus + for(const UIWidgetPtr& child : rotatedChildren) { + if(child->isFocusable()) { + toFocus = child; + break; + } + } + + if(toFocus) + focusChild(toFocus, reason); +} + void UIWidget::moveChildToTop(const UIWidgetPtr& child) { if(!child) diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 5ffa5cb9..6a26eadc 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -128,6 +128,7 @@ public: void removeChild(const UIWidgetPtr& child); void focusChild(const UIWidgetPtr& child, Fw::FocusReason reason); void focusNextChild(Fw::FocusReason reason); + void focusPreviousChild(Fw::FocusReason reason); void moveChildToTop(const UIWidgetPtr& child); void lockChild(const UIWidgetPtr& child); void unlockChild(const UIWidgetPtr& child);