| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2024-10-04 13:19:50 +02:00
										 |  |  |  * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org> | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |  * Copyright (c) 2022, sin-ack <sin-ack@protonmail.com> | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | #include <LibWeb/HTML/BrowsingContext.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Layout/Label.h>
 | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | #include <LibWeb/Painting/LabelablePaintable.h>
 | 
					
						
							| 
									
										
										
										
											2024-06-02 19:00:42 +02:00
										 |  |  | #include <LibWeb/UIEvents/MouseButton.h>
 | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::Painting { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | LabelablePaintable::LabelablePaintable(Layout::LabelableNode const& layout_node) | 
					
						
							|  |  |  |     : PaintableBox(layout_node) | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | void LabelablePaintable::set_being_pressed(bool being_pressed) | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     if (m_being_pressed == being_pressed) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     m_being_pressed = being_pressed; | 
					
						
							|  |  |  |     set_needs_display(); | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | Layout::FormAssociatedLabelableNode const& LabelablePaintable::layout_box() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-10-10 14:05:30 +02:00
										 |  |  |     return static_cast<Layout::FormAssociatedLabelableNode const&>(layout_node()); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Layout::FormAssociatedLabelableNode& LabelablePaintable::layout_box() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-10-10 14:05:30 +02:00
										 |  |  |     return static_cast<Layout::FormAssociatedLabelableNode&>(layout_node()); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 17:35:53 +00:00
										 |  |  | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousedown(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned) | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-06-02 19:00:42 +02:00
										 |  |  |     if (button != UIEvents::MouseButton::Primary || !layout_box().dom_node().enabled()) | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |         return DispatchEventOfSameName::No; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set_being_pressed(true); | 
					
						
							|  |  |  |     m_tracking_mouse = true; | 
					
						
							| 
									
										
										
										
											2024-04-26 16:59:04 +02:00
										 |  |  |     navigable()->event_handler().set_mouse_event_tracking_paintable(this); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     return DispatchEventOfSameName::Yes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 17:35:53 +00:00
										 |  |  | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mouseup(Badge<EventHandler>, CSSPixelPoint position, unsigned button, unsigned) | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-06-02 19:00:42 +02:00
										 |  |  |     if (!m_tracking_mouse || button != UIEvents::MouseButton::Primary || !layout_box().dom_node().enabled()) | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |         return DispatchEventOfSameName::No; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-31 19:46:55 +00:00
										 |  |  |     bool is_inside_node_or_label = absolute_rect().contains(position); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     if (!is_inside_node_or_label) | 
					
						
							|  |  |  |         is_inside_node_or_label = Layout::Label::is_inside_associated_label(layout_box(), position); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set_being_pressed(false); | 
					
						
							|  |  |  |     m_tracking_mouse = false; | 
					
						
							| 
									
										
										
										
											2024-04-26 16:59:04 +02:00
										 |  |  |     navigable()->event_handler().set_mouse_event_tracking_paintable(nullptr); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     return DispatchEventOfSameName::Yes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 17:35:53 +00:00
										 |  |  | LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousemove(Badge<EventHandler>, CSSPixelPoint position, unsigned, unsigned) | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!m_tracking_mouse || !layout_box().dom_node().enabled()) | 
					
						
							|  |  |  |         return DispatchEventOfSameName::No; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-31 19:46:55 +00:00
										 |  |  |     bool is_inside_node_or_label = absolute_rect().contains(position); | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     if (!is_inside_node_or_label) | 
					
						
							|  |  |  |         is_inside_node_or_label = Layout::Label::is_inside_associated_label(layout_box(), position); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set_being_pressed(is_inside_node_or_label); | 
					
						
							|  |  |  |     return DispatchEventOfSameName::Yes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void LabelablePaintable::handle_associated_label_mousedown(Badge<Layout::Label>) | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-03-14 23:05:55 +00:00
										 |  |  |     set_being_pressed(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void LabelablePaintable::handle_associated_label_mouseup(Badge<Layout::Label>) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     set_being_pressed(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void LabelablePaintable::handle_associated_label_mousemove(Badge<Layout::Label>, bool is_inside_node_or_label) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (being_pressed() == is_inside_node_or_label) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     set_being_pressed(is_inside_node_or_label); | 
					
						
							| 
									
										
										
										
											2022-03-10 22:46:35 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |