LibGUI: Allow widgets to clip their child widgets

This patch adds Widget::children_clip_rect() which can be overridden
to tighten clipping of a widget's children. The default implementation
simply returns Widget::rect().
This commit is contained in:
Andreas Kling 2020-08-25 21:24:45 +02:00
parent 965ccf5242
commit a265d40d6e
2 changed files with 9 additions and 1 deletions

View file

@ -229,11 +229,12 @@ void Widget::handle_paint_event(PaintEvent& event)
painter.fill_rect(event.rect(), palette().color(background_role()));
}
paint_event(event);
auto children_clip_rect = this->children_clip_rect();
for_each_child_widget([&](auto& child) {
if (!child.is_visible())
return IterationDecision::Continue;
if (child.relative_rect().intersects(event.rect())) {
PaintEvent local_event(event.rect().intersected(child.relative_rect()).translated(-child.relative_position()));
PaintEvent local_event(event.rect().intersected(children_clip_rect).intersected(child.relative_rect()).translated(-child.relative_position()));
child.dispatch_event(local_event, this);
}
return IterationDecision::Continue;
@ -872,4 +873,9 @@ void Widget::show_tooltip()
Application::the()->show_tooltip(m_tooltip, screen_relative_rect().center().translated(0, height() / 2), this);
}
Gfx::IntRect Widget::children_clip_rect() const
{
return rect();
}
}

View file

@ -274,6 +274,8 @@ public:
void set_accepts_emoji_input(bool b) { m_accepts_emoji_input = b; }
bool accepts_emoji_input() const { return m_accepts_emoji_input; }
virtual Gfx::IntRect children_clip_rect() const;
protected:
Widget();