1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:07:45 +00:00

LibGUI: Let Widgets track their focus proxy delegators

And update them on relevant events.
This commit is contained in:
thankyouverycool 2022-11-17 11:15:34 -05:00 committed by Andreas Kling
parent 4aa608aa71
commit 3b18226fcb
2 changed files with 31 additions and 1 deletions

View file

@ -633,6 +633,11 @@ void Widget::update()
if (rect().is_empty())
return;
update(rect());
for (auto& it : m_focus_delegators) {
if (!it.is_null() && !it->rect().is_empty())
it->update(it->rect());
}
}
void Widget::update(Gfx::IntRect const& rect)
@ -726,10 +731,28 @@ void Widget::set_focus_proxy(Widget* proxy)
{
if (m_focus_proxy == proxy)
return;
if (proxy)
proxy->add_focus_delegator(this);
else if (m_focus_proxy)
m_focus_proxy->remove_focus_delegator(this);
m_focus_proxy = proxy;
}
void Widget::add_focus_delegator(Widget* delegator)
{
m_focus_delegators.remove_all_matching([&](auto& entry) {
return entry.is_null() || entry == delegator;
});
m_focus_delegators.append(delegator);
}
void Widget::remove_focus_delegator(Widget* delegator)
{
m_focus_delegators.remove_first_matching([&](auto& entry) {
return entry == delegator;
});
}
FocusPolicy Widget::focus_policy() const
{
if (m_focus_proxy)