/src/serenity/Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2022, Andreas Kling <kling@serenityos.org> |
3 | | * Copyright (c) 2022, sin-ack <sin-ack@protonmail.com> |
4 | | * |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #include <LibWeb/HTML/BrowsingContext.h> |
9 | | #include <LibWeb/Layout/Label.h> |
10 | | #include <LibWeb/Painting/LabelablePaintable.h> |
11 | | #include <LibWeb/UIEvents/MouseButton.h> |
12 | | |
13 | | namespace Web::Painting { |
14 | | |
15 | | LabelablePaintable::LabelablePaintable(Layout::LabelableNode const& layout_node) |
16 | 0 | : PaintableBox(layout_node) |
17 | 0 | { |
18 | 0 | } |
19 | | |
20 | | void LabelablePaintable::set_being_pressed(bool being_pressed) |
21 | 0 | { |
22 | 0 | if (m_being_pressed == being_pressed) |
23 | 0 | return; |
24 | 0 | m_being_pressed = being_pressed; |
25 | 0 | set_needs_display(); |
26 | 0 | } |
27 | | |
28 | | Layout::FormAssociatedLabelableNode const& LabelablePaintable::layout_box() const |
29 | 0 | { |
30 | 0 | return static_cast<Layout::FormAssociatedLabelableNode const&>(PaintableBox::layout_box()); |
31 | 0 | } |
32 | | |
33 | | Layout::FormAssociatedLabelableNode& LabelablePaintable::layout_box() |
34 | 0 | { |
35 | 0 | return static_cast<Layout::FormAssociatedLabelableNode&>(PaintableBox::layout_box()); |
36 | 0 | } |
37 | | |
38 | | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousedown(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned) |
39 | 0 | { |
40 | 0 | if (button != UIEvents::MouseButton::Primary || !layout_box().dom_node().enabled()) |
41 | 0 | return DispatchEventOfSameName::No; |
42 | | |
43 | 0 | set_being_pressed(true); |
44 | 0 | m_tracking_mouse = true; |
45 | 0 | navigable()->event_handler().set_mouse_event_tracking_paintable(this); |
46 | 0 | return DispatchEventOfSameName::Yes; |
47 | 0 | } |
48 | | |
49 | | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mouseup(Badge<EventHandler>, CSSPixelPoint position, unsigned button, unsigned) |
50 | 0 | { |
51 | 0 | if (!m_tracking_mouse || button != UIEvents::MouseButton::Primary || !layout_box().dom_node().enabled()) |
52 | 0 | return DispatchEventOfSameName::No; |
53 | | |
54 | 0 | bool is_inside_node_or_label = absolute_rect().contains(position); |
55 | 0 | if (!is_inside_node_or_label) |
56 | 0 | is_inside_node_or_label = Layout::Label::is_inside_associated_label(layout_box(), position); |
57 | |
|
58 | 0 | set_being_pressed(false); |
59 | 0 | m_tracking_mouse = false; |
60 | 0 | navigable()->event_handler().set_mouse_event_tracking_paintable(nullptr); |
61 | 0 | return DispatchEventOfSameName::Yes; |
62 | 0 | } |
63 | | |
64 | | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousemove(Badge<EventHandler>, CSSPixelPoint position, unsigned, unsigned) |
65 | 0 | { |
66 | 0 | if (!m_tracking_mouse || !layout_box().dom_node().enabled()) |
67 | 0 | return DispatchEventOfSameName::No; |
68 | | |
69 | 0 | bool is_inside_node_or_label = absolute_rect().contains(position); |
70 | 0 | if (!is_inside_node_or_label) |
71 | 0 | is_inside_node_or_label = Layout::Label::is_inside_associated_label(layout_box(), position); |
72 | |
|
73 | 0 | set_being_pressed(is_inside_node_or_label); |
74 | 0 | return DispatchEventOfSameName::Yes; |
75 | 0 | } |
76 | | |
77 | | void LabelablePaintable::handle_associated_label_mousedown(Badge<Layout::Label>) |
78 | 0 | { |
79 | 0 | set_being_pressed(true); |
80 | 0 | } |
81 | | |
82 | | void LabelablePaintable::handle_associated_label_mouseup(Badge<Layout::Label>) |
83 | 0 | { |
84 | 0 | set_being_pressed(false); |
85 | 0 | } |
86 | | |
87 | | void LabelablePaintable::handle_associated_label_mousemove(Badge<Layout::Label>, bool is_inside_node_or_label) |
88 | 0 | { |
89 | 0 | if (being_pressed() == is_inside_node_or_label) |
90 | 0 | return; |
91 | | |
92 | 0 | set_being_pressed(is_inside_node_or_label); |
93 | 0 | } |
94 | | |
95 | | } |