mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibHTML: Paint a magenta rectangle around the currently inspected node
Document now tracks one "inspected" node, set by set_inspected_node() which is called by Browser's DOM inspector view on_selection callback.
This commit is contained in:
		
							parent
							
								
									7fcb21c935
								
							
						
					
					
						commit
						70a4678d77
					
				
					 5 changed files with 30 additions and 0 deletions
				
			
		|  | @ -141,6 +141,10 @@ int main(int argc, char** argv) | ||||||
|             dom_inspector_window->set_rect(100, 100, 300, 500); |             dom_inspector_window->set_rect(100, 100, 300, 500); | ||||||
|             dom_inspector_window->set_title("DOM inspector"); |             dom_inspector_window->set_title("DOM inspector"); | ||||||
|             dom_tree_view = GTreeView::construct(nullptr); |             dom_tree_view = GTreeView::construct(nullptr); | ||||||
|  |             dom_tree_view->on_selection = [](auto& index) { | ||||||
|  |                 auto* node = static_cast<Node*>(index.internal_data()); | ||||||
|  |                 node->document().set_inspected_node(node); | ||||||
|  |             }; | ||||||
|             dom_inspector_window->set_main_widget(dom_tree_view); |             dom_inspector_window->set_main_widget(dom_tree_view); | ||||||
|         } |         } | ||||||
|         if (html_widget->document()) |         if (html_widget->document()) | ||||||
|  |  | ||||||
|  | @ -244,6 +244,20 @@ LayoutDocument* Document::layout_node() | ||||||
|     return static_cast<LayoutDocument*>(Node::layout_node()); |     return static_cast<LayoutDocument*>(Node::layout_node()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Document::set_inspected_node(Node* node) | ||||||
|  | { | ||||||
|  |     if (m_inspected_node == node) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (m_inspected_node && m_inspected_node->layout_node()) | ||||||
|  |         m_inspected_node->layout_node()->set_needs_display(); | ||||||
|  | 
 | ||||||
|  |     m_inspected_node = node; | ||||||
|  | 
 | ||||||
|  |     if (m_inspected_node && m_inspected_node->layout_node()) | ||||||
|  |         m_inspected_node->layout_node()->set_needs_display(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Document::set_hovered_node(Node* node) | void Document::set_hovered_node(Node* node) | ||||||
| { | { | ||||||
|     if (m_hovered_node == node) |     if (m_hovered_node == node) | ||||||
|  |  | ||||||
|  | @ -44,6 +44,10 @@ public: | ||||||
|     Node* hovered_node() { return m_hovered_node; } |     Node* hovered_node() { return m_hovered_node; } | ||||||
|     const Node* hovered_node() const { return m_hovered_node; } |     const Node* hovered_node() const { return m_hovered_node; } | ||||||
| 
 | 
 | ||||||
|  |     void set_inspected_node(Node*); | ||||||
|  |     Node* inspected_node() { return m_inspected_node; } | ||||||
|  |     const Node* inspected_node() const { return m_inspected_node; } | ||||||
|  | 
 | ||||||
|     const HTMLHtmlElement* document_element() const; |     const HTMLHtmlElement* document_element() const; | ||||||
|     const HTMLHeadElement* head() const; |     const HTMLHeadElement* head() const; | ||||||
|     const HTMLBodyElement* body() const; |     const HTMLBodyElement* body() const; | ||||||
|  | @ -91,6 +95,7 @@ private: | ||||||
|     OwnPtr<StyleResolver> m_style_resolver; |     OwnPtr<StyleResolver> m_style_resolver; | ||||||
|     NonnullRefPtrVector<StyleSheet> m_sheets; |     NonnullRefPtrVector<StyleSheet> m_sheets; | ||||||
|     RefPtr<Node> m_hovered_node; |     RefPtr<Node> m_hovered_node; | ||||||
|  |     RefPtr<Node> m_inspected_node; | ||||||
|     WeakPtr<Frame> m_frame; |     WeakPtr<Frame> m_frame; | ||||||
|     URL m_url; |     URL m_url; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,6 +21,9 @@ void LayoutBox::render(RenderingContext& context) | ||||||
|         context.painter().draw_rect(m_rect, Color::Red); |         context.painter().draw_rect(m_rect, Color::Red); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |     if (node() && document().inspected_node() == node()) | ||||||
|  |         context.painter().draw_rect(m_rect, Color::Magenta); | ||||||
|  | 
 | ||||||
|     Rect padded_rect; |     Rect padded_rect; | ||||||
|     padded_rect.set_x(x() - box_model().padding().left.to_px()); |     padded_rect.set_x(x() - box_model().padding().left.to_px()); | ||||||
|     padded_rect.set_width(width() + box_model().padding().left.to_px() + box_model().padding().right.to_px()); |     padded_rect.set_width(width() + box_model().padding().left.to_px() + box_model().padding().right.to_px()); | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| #include <LibCore/CDirIterator.h> | #include <LibCore/CDirIterator.h> | ||||||
| #include <LibDraw/Font.h> | #include <LibDraw/Font.h> | ||||||
| #include <LibGUI/GPainter.h> | #include <LibGUI/GPainter.h> | ||||||
|  | #include <LibHTML/DOM/Document.h> | ||||||
| #include <LibHTML/Layout/LayoutBlock.h> | #include <LibHTML/Layout/LayoutBlock.h> | ||||||
| #include <LibHTML/Layout/LayoutText.h> | #include <LibHTML/Layout/LayoutText.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
|  | @ -44,6 +45,9 @@ void LayoutText::render_fragment(RenderingContext& context, const LineBoxFragmen | ||||||
|     auto color = style().color_or_fallback(CSS::PropertyID::Color, document(), Color::Black); |     auto color = style().color_or_fallback(CSS::PropertyID::Color, document(), Color::Black); | ||||||
|     auto text_decoration = style().string_or_fallback(CSS::PropertyID::TextDecoration, "none"); |     auto text_decoration = style().string_or_fallback(CSS::PropertyID::TextDecoration, "none"); | ||||||
| 
 | 
 | ||||||
|  |     if (document().inspected_node() == &node()) | ||||||
|  |         context.painter().draw_rect(enclosing_int_rect(fragment.rect()), Color::Magenta); | ||||||
|  | 
 | ||||||
|     bool is_underline = text_decoration == "underline"; |     bool is_underline = text_decoration == "underline"; | ||||||
|     if (is_underline) |     if (is_underline) | ||||||
|         painter.draw_line(enclosing_int_rect(fragment.rect()).bottom_left().translated(0, -1), enclosing_int_rect(fragment.rect()).bottom_right().translated(0, -1), color); |         painter.draw_line(enclosing_int_rect(fragment.rect()).bottom_left().translated(0, -1), enclosing_int_rect(fragment.rect()).bottom_right().translated(0, -1), color); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling