Newer
Older
browserjam / scripts / document.gd
extends Node2D

@export var http_request: HTTPRequest
@export var address_box: TextEdit

func _create_block_node(block: Layout.BlockNode) -> Node:
	var box = Control.new()
	box.name = block.dom_node.tag_name + "-" + str(randi_range(0, 1000))
	box.position = block.rect.position
	box.size = block.rect.size
	return box

func _apply_label_style(label: Label, fragment: Layout.TextFragment):
	var style = fragment.dom_node.style
	label.set('theme_override_font_sizes/font_size', style.font_size)
	label.set('theme_override_colors/font_color', style.text_color)

func _create_text_fragment_with_rigid_body(parent: Node, fragment: Layout.TextFragment) -> Node:
	var rigid_body = RigidBody2D.new()
	rigid_body.name = fragment.dom_node.tag_name + "-" + str(randi_range(0, 1000))
	rigid_body.position = fragment.rect.position
	rigid_body.input_pickable = true

	var shape = CollisionShape2D.new()
	shape.shape = RectangleShape2D.new()
	shape.shape.size = fragment.rect.size
	shape.translate(fragment.rect.size / 2)

	var label = Label.new()
	label.text = fragment.text
	label.size = fragment.rect.size
	_apply_label_style(label, fragment)

	rigid_body.add_child(label)
	rigid_body.add_child(shape)
	parent.add_child(rigid_body)
	return rigid_body

func _create_block(parent: Node, block: Layout.BlockNode):
	var box = _create_block_node(block)
	parent.add_child(box, true)

	for block_child in block.block_children:
		_create_block(box, block_child)
	for text_fragment in block.text_fragments:
		# _create_text_fragment(box, text_fragment)
		_create_text_fragment_with_rigid_body(box, text_fragment)

func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray):
	var source = body.get_string_from_utf8()

	var parser = Parser.new(source)
	var dom_tree = DOM.build_dom_tree(parser)
	var layout_tree = Layout.build_layout_tree(dom_tree)
	layout_tree.layout(1000)
	_create_block(self, layout_tree)

func on_refresh() -> void:
	for child in get_children():
		remove_child(child)
	http_request.request(address_box.text)

func _ready():
	http_request.request_completed.connect(_on_request_completed)
	on_refresh()