diff options
author | Andreas Kling <kling@serenityos.org> | 2020-04-24 18:55:29 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-24 19:05:02 +0200 |
commit | 42f0b2522b6e24e0269265597cebfda9f0b7b329 (patch) | |
tree | ccdabd18cf6bee50fde21912d2204cfff4394728 /Libraries/LibGUI/Widget.cpp | |
parent | 9badcff1bab051e0dfb50d6dd9c7775a4f1d3af3 (diff) | |
download | serenity-42f0b2522b6e24e0269265597cebfda9f0b7b329.zip |
LibGUI: Introduce widget content margins + improve splitters
A GUI::Widget can now set an optional content margin (4x0 by default.)
Pixels in the content margin will be ignored for hit testing purposes.
Use this to allow frame-like widgets (like GUI::Frame!) to ignore any
mouse events in the frame area, and instead let those go to parent.
This allows GUI::Splitter to react "sooner" to mouse events that were
previously swallowed by the child widgets instead of ending up in the
splitter. The net effect is that 2 more pixels on each side of a
splitter handle are now interactive and usable for splitting! :^)
Diffstat (limited to 'Libraries/LibGUI/Widget.cpp')
-rw-r--r-- | Libraries/LibGUI/Widget.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/Libraries/LibGUI/Widget.cpp b/Libraries/LibGUI/Widget.cpp index 00b107a5f4..ceee7e37f3 100644 --- a/Libraries/LibGUI/Widget.cpp +++ b/Libraries/LibGUI/Widget.cpp @@ -472,7 +472,7 @@ Widget* Widget::child_at(const Gfx::Point& point) const auto& child = Core::to<Widget>(children()[i]); if (!child.is_visible()) continue; - if (child.relative_rect().contains(point)) + if (child.content_rect().contains(point)) return const_cast<Widget*>(&child); } return nullptr; @@ -811,4 +811,21 @@ void Widget::did_end_inspection() update(); } +void Widget::set_content_margins(const Margins& margins) +{ + if (m_content_margins == margins) + return; + m_content_margins = margins; + invalidate_layout(); +} + +Gfx::Rect Widget::content_rect() const +{ + auto rect = relative_rect(); + rect.move_by(m_content_margins.left(), m_content_margins.top()); + rect.set_width(rect.width() - (m_content_margins.left() + m_content_margins.right())); + rect.set_height(rect.height() - (m_content_margins.top() + m_content_margins.bottom())); + return rect; +} + } |