mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:27:35 +00:00
LibGUI: Add Widget focus proxies
A Widget can now have a focus proxy widget. Questions about focus are redirected to the proxy if present. This is useful if a widget could logically get focus, but wants one of its child widgets to actually handle it.
This commit is contained in:
parent
9ba3862ee9
commit
af16552624
2 changed files with 23 additions and 0 deletions
|
@ -499,8 +499,22 @@ void Widget::set_window(Window* window)
|
||||||
m_window = window;
|
m_window = window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::set_focus_proxy(Widget* proxy)
|
||||||
|
{
|
||||||
|
if (m_focus_proxy == proxy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (proxy)
|
||||||
|
m_focus_proxy = proxy->make_weak_ptr();
|
||||||
|
else
|
||||||
|
m_focus_proxy = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool Widget::is_focused() const
|
bool Widget::is_focused() const
|
||||||
{
|
{
|
||||||
|
if (m_focus_proxy)
|
||||||
|
return m_focus_proxy->is_focused();
|
||||||
|
|
||||||
auto* win = window();
|
auto* win = window();
|
||||||
if (!win)
|
if (!win)
|
||||||
return false;
|
return false;
|
||||||
|
@ -514,6 +528,9 @@ bool Widget::is_focused() const
|
||||||
|
|
||||||
void Widget::set_focus(bool focus, FocusSource source)
|
void Widget::set_focus(bool focus, FocusSource source)
|
||||||
{
|
{
|
||||||
|
if (m_focus_proxy)
|
||||||
|
return m_focus_proxy->set_focus(focus, source);
|
||||||
|
|
||||||
auto* win = window();
|
auto* win = window();
|
||||||
if (!win)
|
if (!win)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -150,6 +150,10 @@ public:
|
||||||
bool is_focused() const;
|
bool is_focused() const;
|
||||||
void set_focus(bool, FocusSource = FocusSource::Programmatic);
|
void set_focus(bool, FocusSource = FocusSource::Programmatic);
|
||||||
|
|
||||||
|
Widget* focus_proxy() { return m_focus_proxy; }
|
||||||
|
const Widget* focus_proxy() const { return m_focus_proxy; }
|
||||||
|
void set_focus_proxy(Widget*);
|
||||||
|
|
||||||
enum class ShouldRespectGreediness { No = 0,
|
enum class ShouldRespectGreediness { No = 0,
|
||||||
Yes };
|
Yes };
|
||||||
struct HitTestResult {
|
struct HitTestResult {
|
||||||
|
@ -340,6 +344,8 @@ private:
|
||||||
bool m_accepts_emoji_input { false };
|
bool m_accepts_emoji_input { false };
|
||||||
|
|
||||||
NonnullRefPtr<Gfx::PaletteImpl> m_palette;
|
NonnullRefPtr<Gfx::PaletteImpl> m_palette;
|
||||||
|
|
||||||
|
WeakPtr<Widget> m_focus_proxy;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Widget* Widget::parent_widget()
|
inline Widget* Widget::parent_widget()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue