diff --git a/src/dusk/ui/component.cpp b/src/dusk/ui/component.cpp index fc9e7f147a..ae49f7a8c3 100644 --- a/src/dusk/ui/component.cpp +++ b/src/dusk/ui/component.cpp @@ -49,13 +49,24 @@ void Component::set_disabled(bool value) { if (Component::disabled() == value) { return; } + auto* context = mRoot->GetContext(); if (value) { + if (context != nullptr && context->GetFocusElement() == mRoot) { + // RmlUi moves focus to the parent when a focused control is disabled. + mDisabledFocusFallback = mRoot->GetParentNode(); + } mRoot->SetAttribute("disabled", ""); mRoot->SetPseudoClass("disabled", true); mRoot->Blur(); } else { + const bool restoreFocus = mDisabledFocusFallback != nullptr && context != nullptr && + context->GetFocusElement() == mDisabledFocusFallback; mRoot->RemoveAttribute("disabled"); mRoot->SetPseudoClass("disabled", false); + mDisabledFocusFallback = nullptr; + if (restoreFocus) { + focus(); + } } } diff --git a/src/dusk/ui/component.hpp b/src/dusk/ui/component.hpp index 4af1212955..f45bbf6a56 100644 --- a/src/dusk/ui/component.hpp +++ b/src/dusk/ui/component.hpp @@ -54,6 +54,7 @@ protected: void clear_children(); Rml::Element* mRoot = nullptr; + Rml::Element* mDisabledFocusFallback = nullptr; std::vector> mChildren; std::vector> mListeners; };