Prechádzať zdrojové kódy

GWidget: Add a flag to ignore greediness in GWidget::hit_test()

Normally if a GWidget has the is_greedy_for_hits() flag set, all hit
tests will hit the widget itself instead of its descendants.

Sometimes it may be desirable to override this behavior, and so this
flag now allows you to do that.
Andreas Kling 5 rokov pred
rodič
commit
ce44d9a32f

+ 2 - 2
Libraries/LibGUI/GWidget.cpp

@@ -333,9 +333,9 @@ GWidget* GWidget::child_at(const Point& point) const
     return nullptr;
 }
 
-GWidget::HitTestResult GWidget::hit_test(const Point& position)
+GWidget::HitTestResult GWidget::hit_test(const Point& position, ShouldRespectGreediness should_respect_greediness)
 {
-    if (is_greedy_for_hits())
+    if (should_respect_greediness == ShouldRespectGreediness::Yes && is_greedy_for_hits())
         return { this, position };
     if (auto* child = child_at(position))
         return child->hit_test(position - child->relative_position());

+ 2 - 1
Libraries/LibGUI/GWidget.h

@@ -119,11 +119,12 @@ public:
     bool is_focused() const;
     void set_focus(bool);
 
+    enum class ShouldRespectGreediness { No = 0, Yes };
     struct HitTestResult {
         GWidget* widget { nullptr };
         Point local_position;
     };
-    HitTestResult hit_test(const Point&);
+    HitTestResult hit_test(const Point&, ShouldRespectGreediness = ShouldRespectGreediness::Yes);
     GWidget* child_at(const Point&) const;
 
     void set_relative_rect(const Rect&);