diff --git a/modules/core_styles/styles/labels.otui b/modules/core_styles/styles/labels.otui index 36fa65a8..56737203 100644 --- a/modules/core_styles/styles/labels.otui +++ b/modules/core_styles/styles/labels.otui @@ -2,6 +2,9 @@ Label < UILabel font: verdana-11px-antialised color: #aaaaaa + $disabled: + color: #aaaaaa88 + LargerLabel < Label diff --git a/modules/core_styles/styles/lineedits.otui b/modules/core_styles/styles/lineedits.otui index 6bf81f26..34d6198b 100644 --- a/modules/core_styles/styles/lineedits.otui +++ b/modules/core_styles/styles/lineedits.otui @@ -7,5 +7,8 @@ LineEdit < UILineEdit source: /core_styles/images/panel_flat.png border: 1 + $disabled: + color: #aaaaaa88 + PasswordLineEdit < LineEdit text hidden: true diff --git a/modules/core_styles/styles/windows.otui b/modules/core_styles/styles/windows.otui index 704f135d..9c9e1018 100644 --- a/modules/core_styles/styles/windows.otui +++ b/modules/core_styles/styles/windows.otui @@ -2,6 +2,7 @@ Window < UIWindow font: verdana-11px-antialised size: 200 200 opacity: 255 + color: white background-color: white head height: 20 head text align: center @@ -15,6 +16,9 @@ Window < UIWindow $pressed: opacity: 192 + $disabled: + color: #aaaaaa88 + MiniWindow < UIWindow font: verdana-11px-antialised size: 192 200 diff --git a/modules/entergame/entergame.lua b/modules/entergame/entergame.lua index 35ce11a9..6a4f395d 100644 --- a/modules/entergame/entergame.lua +++ b/modules/entergame/entergame.lua @@ -7,8 +7,17 @@ local motdNumber local motdMessage -- private functions +local function clearAccountFields() + enterGame:getChildById('accountNameLineEdit'):clearText() + enterGame:getChildById('accountPasswordLineEdit'):clearText() + enterGame:getChildById('accountNameLineEdit'):focus() + Configs.set('account', nil) + Configs.set('password', nil) +end + local function onError(protocol, error) loadBox:destroy() + clearAccountFields() local errorBox = displayErrorBox('Login Error', error) errorBox.onOk = EnterGame.show end @@ -25,10 +34,7 @@ local function onCharacterList(protocol, characters, premDays) Configs.set('password', EnterGame.password) Configs.set('autologin', tostring(enterGame:getChildById('autoLoginBox'):isChecked())) else - Configs.set('account', nil) - Configs.set('password', nil) - enterGame:getChildById('accountNameLineEdit'):clearText() - enterGame:getChildById('accountPasswordLineEdit'):clearText() + clearAccountFields() end loadBox:destroy() @@ -59,6 +65,7 @@ function EnterGame.create() enterGame:getChildById('serverPortLineEdit'):setText(port) enterGame:getChildById('autoLoginBox'):setChecked(autologin) enterGame:getChildById('rememberPasswordBox'):setChecked(#account > 0) + enterGame:getChildById('accountNameLineEdit'):focus() if #account > 0 and autologin then addEvent(EnterGame.doLogin) diff --git a/modules/game/game.lua b/modules/game/game.lua index 06555566..e40ec8c2 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -16,7 +16,7 @@ end function Game.createInterface() Background.hide() CharacterList.destroyLoadBox() - Game.gameUi = loadUI('/game/game.otui', UI.root) + Game.gameUi = UI.loadAndDisplay('/game/game.otui') UI.root:moveChildToIndex(Game.gameUi, 1) Game.gameMapPanel = Game.gameUi:getChildById('mapPanel') Game.gameRightPanel = Game.gameUi:getChildById('rightPanel') diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index 539c6031..35c8ed53 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -104,7 +104,7 @@ void UIWidget::renderChildren() { // draw children for(const UIWidgetPtr& child : m_children) { - // render only visible children with a valid rect + // render only visible children with a valid rect inside our rect if(child->isExplicitlyVisible() && child->getRect().isValid() && child->getRect().intersects(m_rect)) { // store current graphics opacity int oldOpacity = g_graphics.getOpacity(); @@ -125,12 +125,43 @@ void UIWidget::renderChildren() } } +void UIWidget::setEnabled(bool enabled) +{ + if(enabled != m_enabled) { + m_enabled = enabled; + + updateState(Fw::DisabledState); + updateState(Fw::ActiveState); + updateState(Fw::HoverState); + } +} + void UIWidget::setVisible(bool visible) { - m_visible = visible; - if(!visible && isFocused()) { - if(UIWidgetPtr parent = getParent()) - parent->focusNextChild(Fw::ActiveFocusReason); + if(m_visible != visible) { + m_visible = visible; + + // make parent focus another child + if(!visible && isFocused()) { + if(UIWidgetPtr parent = getParent()) + parent->focusPreviousChild(Fw::ActiveFocusReason); + } + + updateState(Fw::ActiveState); + updateState(Fw::HoverState); + } +} + +void UIWidget::setFocusable(bool focusable) +{ + if(m_focusable != focusable) { + m_focusable = focusable; + + // make parent focus another child + if(!focusable && isFocused()) { + if(UIWidgetPtr parent = getParent()) + parent->focusPreviousChild(Fw::ActiveFocusReason); + } } } @@ -208,6 +239,8 @@ void UIWidget::unlock() void UIWidget::focus() { + if(!m_focusable) + return; if(UIWidgetPtr parent = getParent()) parent->focusChild(asUIWidget(), Fw::ActiveFocusReason); } @@ -357,14 +390,6 @@ void UIWidget::addChild(const UIWidgetPtr& child) m_children.push_back(child); child->setParent(asUIWidget()); - // focus must be set after the style has been loaded - auto self = asUIWidget(); - g_dispatcher.addEvent([self,child]() { - // always focus new child - if(child->getParent() == self && child->isFocusable() && child->isExplicitlyVisible() && child->isExplicitlyEnabled()) - self->focusChild(child, Fw::ActiveFocusReason); - }); - // create default layout if(!m_layout) m_layout = UILayoutPtr(new UIAnchorLayout(asUIWidget())); @@ -670,7 +695,7 @@ void UIWidget::updateState(Fw::WidgetState state) UIWidgetPtr parent; do { parent = widget->getParent(); - if(!widget->isExplicitlyEnabled() || !widget->getRect().contains(mousePos) || + if(!widget->isExplicitlyEnabled() || !widget->isExplicitlyVisible() || !widget->getRect().contains(mousePos) || (parent && widget != parent->getChildByPos(mousePos))) { newStatus = false; break; @@ -760,6 +785,8 @@ void UIWidget::updateStyle() } } + //TODO: prevent setting already set proprieties + applyStyle(newStateStyle); m_stateStyle = newStateStyle; } @@ -904,6 +931,12 @@ void UIWidget::onStyleApply(const OTMLNodePtr& styleNode) } } + if(m_firstOnStyle) { + // always focus new child + if(isFocusable() && isExplicitlyVisible() && isExplicitlyEnabled()) + focus(); + } + m_firstOnStyle = false; } diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 11b80d3a..062ff144 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -44,10 +44,10 @@ public: void renderChildren(); void setVisible(bool visible); - void setEnabled(bool enabled) { m_enabled = enabled; updateState(Fw::DisabledState); } + void setEnabled(bool enabled); void setPressed(bool pressed) { m_pressed = pressed; updateState(Fw::PressedState); } void setId(const std::string& id) { m_id = id; } - void setFocusable(bool focusable) { m_focusable = focusable; } + void setFocusable(bool focusable); void setPhantom(bool phantom) { m_phantom = phantom; } void setStyle(const std::string& styleName); void setStyleFromNode(const OTMLNodePtr& styleNode);