diff options
author | Andreas Kling <kling@serenityos.org> | 2022-03-21 11:11:05 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-03-21 13:03:33 +0100 |
commit | 0ba785894c80286c9d0374a585c2cb534b81bc55 (patch) | |
tree | 3e8bca04e2f65cb047e977a2c86148eb34c76c03 /Userland/Libraries/LibWeb/Painting/PaintableBox.cpp | |
parent | 8c88ee1165a538600c630f929b0b726d200c7dc7 (diff) | |
download | serenity-0ba785894c80286c9d0374a585c2cb534b81bc55.zip |
LibWeb: Make hit testing functions return Optional<HitTestResult>
Using "HitTestResult with null paintable" as a way to signal misses was
unnecessarily confusing. Let's use Optional instead. :^)
Diffstat (limited to 'Userland/Libraries/LibWeb/Painting/PaintableBox.cpp')
-rw-r--r-- | Userland/Libraries/LibWeb/Painting/PaintableBox.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 670aae965f..8e7f59d797 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -528,30 +528,31 @@ void PaintableBox::for_each_child_in_paint_order(Callback callback) const }); } -HitTestResult PaintableBox::hit_test(Gfx::FloatPoint const& position, HitTestType type) const +Optional<HitTestResult> PaintableBox::hit_test(Gfx::FloatPoint const& position, HitTestType type) const { if (layout_box().is_initial_containing_block_box()) { const_cast<Layout::InitialContainingBlock&>(static_cast<Layout::InitialContainingBlock const&>(layout_box())).build_stacking_context_tree_if_needed(); return stacking_context()->hit_test(position, type); } - HitTestResult result { absolute_border_box_rect().contains(position.x(), position.y()) ? this : nullptr }; + Optional<HitTestResult> result; + if (absolute_border_box_rect().contains(position.x(), position.y())) + result = HitTestResult { *this }; for_each_child_in_paint_order([&](auto& child) { if (child.paintable()) { - auto child_result = child.paintable()->hit_test(position, type); - if (child_result.paintable) - result = child_result; + if (auto child_result = child.paintable()->hit_test(position, type); child_result.has_value()) + result = move(child_result); } }); return result; } -HitTestResult PaintableWithLines::hit_test(const Gfx::FloatPoint& position, HitTestType type) const +Optional<HitTestResult> PaintableWithLines::hit_test(const Gfx::FloatPoint& position, HitTestType type) const { if (!layout_box().children_are_inline()) return PaintableBox::hit_test(position, type); - HitTestResult last_good_candidate; + Optional<HitTestResult> last_good_candidate; for (auto& line_box : m_line_boxes) { for (auto& fragment : line_box.fragments()) { if (is<Layout::Box>(fragment.layout_node()) && static_cast<Layout::Box const&>(fragment.layout_node()).paint_box()->stacking_context()) @@ -559,16 +560,18 @@ HitTestResult PaintableWithLines::hit_test(const Gfx::FloatPoint& position, HitT if (fragment.absolute_rect().contains(position)) { if (is<Layout::BlockContainer>(fragment.layout_node()) && fragment.layout_node().paintable()) return fragment.layout_node().paintable()->hit_test(position, type); - return { fragment.layout_node().paintable(), fragment.text_index_at(position.x()) }; + return HitTestResult { *fragment.layout_node().paintable(), fragment.text_index_at(position.x()) }; } if (fragment.absolute_rect().top() <= position.y()) - last_good_candidate = { fragment.layout_node().paintable(), fragment.text_index_at(position.x()) }; + last_good_candidate = HitTestResult { *fragment.layout_node().paintable(), fragment.text_index_at(position.x()) }; } } - if (type == HitTestType::TextCursor && last_good_candidate.paintable) + if (type == HitTestType::TextCursor && last_good_candidate.has_value()) return last_good_candidate; - return { absolute_border_box_rect().contains(position.x(), position.y()) ? this : nullptr }; + if (absolute_border_box_rect().contains(position.x(), position.y())) + return HitTestResult { *this }; + return {}; } } |