45 lines
1.6 KiB
GDScript
45 lines
1.6 KiB
GDScript
@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
|