summaryrefslogtreecommitdiff
path: root/Libraries/LibGUI/Widget.cpp
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-04-24 18:55:29 +0200
committerAndreas Kling <kling@serenityos.org>2020-04-24 19:05:02 +0200
commit42f0b2522b6e24e0269265597cebfda9f0b7b329 (patch)
treeccdabd18cf6bee50fde21912d2204cfff4394728 /Libraries/LibGUI/Widget.cpp
parent9badcff1bab051e0dfb50d6dd9c7775a4f1d3af3 (diff)
downloadserenity-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.cpp19
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;
+}
+
}