@tool extends Control const EMBEDDED_PANEL = preload("res://themes/layout_embedded_panel.tres") @export var panel_id := "panel" @export var element_type := "" @export var cell_rect := Rect2i(0, 0, 6, 4) @export var minimum_cells := Vector2i(4, 3) @export var reference_size := Vector2(600, 440) @export var fill_allocation := false @export var padding := 8.0 @export_node_path("Control") var background_path := NodePath("") func _ready() -> void: clip_contents = true resized.connect(arrange_content) if has_node("Content") and $Content is PanelContainer: $Content.add_theme_stylebox_override("panel", EMBEDDED_PANEL) if not background_path.is_empty(): var background := get_node_or_null(background_path) as Control if background != null: background.add_theme_stylebox_override("panel", EMBEDDED_PANEL) if has_node("Content") and $Content.has_method("set_frame_host"): $Content.set_frame_host($Background) arrange_content.call_deferred() func arrange_content() -> void: if not has_node("Content"): return var content: Control = $Content var available := (size - Vector2.ONE * padding * 2).max(Vector2.ZERO) $Background.position = Vector2.ONE * padding $Background.size = available content.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT) if fill_allocation: content.scale = Vector2.ONE content.position = Vector2.ONE * padding content.size = available else: content.size = reference_size var factor := maxf(0.01, minf(available.x / reference_size.x, available.y / reference_size.y)) content.scale = Vector2.ONE * factor content.position = (size - reference_size * factor) / 2