mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 11:35:06 +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