non-flex div background (padding, corner radius)
This commit is contained in:
117
Scripts/Utils/BackgroundUtils.gd
Normal file
117
Scripts/Utils/BackgroundUtils.gd
Normal file
@@ -0,0 +1,117 @@
|
||||
class_name BackgroundUtils
|
||||
extends RefCounted
|
||||
|
||||
static func create_stylebox_from_styles(styles: Dictionary = {}, container: Control = null) -> StyleBoxFlat:
|
||||
var style_box = StyleBoxFlat.new()
|
||||
|
||||
# Background color
|
||||
var bg_color = null
|
||||
if styles.has("background-color"):
|
||||
bg_color = styles["background-color"]
|
||||
elif container and container.has_meta("custom_css_background_color"):
|
||||
bg_color = container.get_meta("custom_css_background_color")
|
||||
|
||||
if bg_color:
|
||||
style_box.bg_color = bg_color
|
||||
else:
|
||||
style_box.bg_color = Color.TRANSPARENT
|
||||
|
||||
# Border radius
|
||||
var border_radius = null
|
||||
if styles.has("border-radius"):
|
||||
border_radius = styles["border-radius"]
|
||||
elif container and container.has_meta("custom_css_border_radius"):
|
||||
border_radius = container.get_meta("custom_css_border_radius")
|
||||
|
||||
if border_radius:
|
||||
var radius = StyleManager.parse_radius(border_radius)
|
||||
style_box.corner_radius_top_left = radius
|
||||
style_box.corner_radius_top_right = radius
|
||||
style_box.corner_radius_bottom_left = radius
|
||||
style_box.corner_radius_bottom_right = radius
|
||||
|
||||
# Padding as content margins
|
||||
var has_padding = false
|
||||
if styles.size() > 0:
|
||||
has_padding = styles.has("padding") or styles.has("padding-top") or styles.has("padding-right") or styles.has("padding-bottom") or styles.has("padding-left")
|
||||
elif container:
|
||||
has_padding = container.has_meta("padding") or container.has_meta("padding-top") or container.has_meta("padding-right") or container.has_meta("padding-bottom") or container.has_meta("padding-left")
|
||||
|
||||
if has_padding:
|
||||
# General padding
|
||||
var padding_val = null
|
||||
if styles.has("padding"):
|
||||
padding_val = StyleManager.parse_size(styles["padding"])
|
||||
elif container and container.has_meta("padding"):
|
||||
padding_val = StyleManager.parse_size(container.get_meta("padding"))
|
||||
|
||||
if padding_val:
|
||||
style_box.content_margin_left = padding_val
|
||||
style_box.content_margin_right = padding_val
|
||||
style_box.content_margin_top = padding_val
|
||||
style_box.content_margin_bottom = padding_val
|
||||
|
||||
# Individual padding values override general padding
|
||||
var padding_keys = [["padding-left", "content_margin_left"], ["padding-right", "content_margin_right"], ["padding-top", "content_margin_top"], ["padding-bottom", "content_margin_bottom"]]
|
||||
|
||||
for pair in padding_keys:
|
||||
var key = pair[0]
|
||||
var property = pair[1]
|
||||
var val = null
|
||||
|
||||
if styles.has(key):
|
||||
val = StyleManager.parse_size(styles[key])
|
||||
elif container and container.has_meta(key):
|
||||
val = StyleManager.parse_size(container.get_meta(key))
|
||||
|
||||
if val:
|
||||
style_box.set(property, val)
|
||||
|
||||
return style_box
|
||||
|
||||
# for AutoSizingFlexContainer
|
||||
static func update_background_panel(container: Control) -> void:
|
||||
var needs_background = container.has_meta("custom_css_background_color") or container.has_meta("custom_css_border_radius")
|
||||
var needs_padding = container.has_meta("padding") or container.has_meta("padding-top") or container.has_meta("padding-right") or container.has_meta("padding-bottom") or container.has_meta("padding-left")
|
||||
var background_panel = get_background_panel(container)
|
||||
|
||||
if needs_background or needs_padding:
|
||||
if not background_panel:
|
||||
background_panel = Panel.new()
|
||||
background_panel.name = "BackgroundPanel"
|
||||
background_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
background_panel.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
container.add_child(background_panel)
|
||||
container.move_child(background_panel, 0) # first child
|
||||
|
||||
var style_box = create_stylebox_from_styles({}, container)
|
||||
background_panel.add_theme_stylebox_override("panel", style_box)
|
||||
|
||||
elif background_panel:
|
||||
background_panel.queue_free()
|
||||
|
||||
# Helper methods for AutoSizingFlexContainer
|
||||
static func get_background_panel(container: Control) -> Panel:
|
||||
for child in container.get_children():
|
||||
if child.name == "BackgroundPanel" and child is Panel:
|
||||
return child
|
||||
return null
|
||||
|
||||
static func is_background_panel(node: Node) -> bool:
|
||||
return node.name == "BackgroundPanel" and node is Panel
|
||||
|
||||
# for any other tag
|
||||
static func create_panel_container_with_background(styles: Dictionary) -> PanelContainer:
|
||||
var panel_container = PanelContainer.new()
|
||||
panel_container.name = "Div"
|
||||
|
||||
var vbox = VBoxContainer.new()
|
||||
vbox.name = "VBoxContainer"
|
||||
panel_container.add_child(vbox)
|
||||
|
||||
var style_box = create_stylebox_from_styles(styles)
|
||||
panel_container.add_theme_stylebox_override("panel", style_box)
|
||||
return panel_container
|
||||
|
||||
static func needs_background_wrapper(styles: Dictionary) -> bool:
|
||||
return styles.has("background-color") or styles.has("border-radius") or styles.has("padding") or styles.has("padding-top") or styles.has("padding-right") or styles.has("padding-bottom") or styles.has("padding-left")
|
||||
1
Scripts/Utils/BackgroundUtils.gd.uid
Normal file
1
Scripts/Utils/BackgroundUtils.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c2itd75f1j1n0
|
||||
Reference in New Issue
Block a user