blob: 23c0a2f971208040788d5ac9108ac2af357a73e4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include <LibGUI/GPainter.h>
#include <LibGUI/GScrollBar.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/Dump.h>
#include <LibHTML/HtmlView.h>
#include <LibHTML/Layout/LayoutNode.h>
#include <LibHTML/RenderingContext.h>
#include <stdio.h>
HtmlView::HtmlView(GWidget* parent)
: GScrollableWidget(parent)
{
set_frame_shape(FrameShape::Container);
set_frame_shadow(FrameShadow::Sunken);
set_frame_thickness(2);
set_should_hide_unnecessary_scrollbars(true);
set_background_color(Color::White);
}
void HtmlView::set_document(Document* document)
{
if (document == m_document)
return;
m_document = document;
if (document == nullptr)
m_layout_root = nullptr;
else
m_layout_root = document->create_layout_tree(document->style_resolver(), nullptr);
#ifdef HTML_DEBUG
if (document != nullptr) {
printf("\033[33;1mLayout tree before layout:\033[0m\n");
::dump_tree(*m_layout_root);
}
#endif
layout_and_sync_size();
update();
}
void HtmlView::layout_and_sync_size()
{
if (!m_layout_root)
return;
m_layout_root->style().size().set_width(available_size().width());
m_layout_root->layout();
set_content_size(m_layout_root->rect().size());
#ifdef HTML_DEBUG
printf("\033[33;1mLayout tree after layout:\033[0m\n");
::dump_tree(*m_layout_root);
#endif
}
void HtmlView::resize_event(GResizeEvent& event)
{
GScrollableWidget::resize_event(event);
layout_and_sync_size();
}
void HtmlView::paint_event(GPaintEvent& event)
{
GFrame::paint_event(event);
GPainter painter(*this);
painter.add_clip_rect(widget_inner_rect());
painter.add_clip_rect(event.rect());
painter.fill_rect(event.rect(), background_color());
painter.translate(frame_thickness(), frame_thickness());
painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value());
if (!m_layout_root)
return;
RenderingContext context { painter };
m_layout_root->render(context);
}
void HtmlView::mousemove_event(GMouseEvent& event)
{
if (!m_layout_root)
return GScrollableWidget::mousemove_event(event);
auto result = m_layout_root->hit_test(event.position());
if (result.layout_node) {
if (auto* node = result.layout_node->node()) {
dbg() << "HtmlView: mousemove: " << node->tag_name() << "{" << node << "}";
}
}
event.accept();
}
|