瀏覽代碼

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().
Andreas Kling 4 年之前
父節點
當前提交
a265d40d6e
共有 2 個文件被更改,包括 9 次插入1 次删除
  1. 7 1
      Libraries/LibGUI/Widget.cpp
  2. 2 0
      Libraries/LibGUI/Widget.h

+ 7 - 1
Libraries/LibGUI/Widget.cpp

@@ -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();
+}
+
 }

+ 2 - 0
Libraries/LibGUI/Widget.h

@@ -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();