【Godot4】状态栏组件StatusBar

概述

一个包含多个水平排列文本的状态栏组件。

类设计

// 状态栏
StatusBar{
    items:Array[StatusBarItem]        // 项数据
    style:StyleBoxFlat                // 样式盒子
    add_item(text,pos:=-1,fill=false,h_aligin= left)   	// 添加文本项
} 

// 状态栏项[内部类]
StatusBarItem(Resource){
    text:String     // 文本
    fill:bool   // 书否水平拉伸
    aligin:left	// 文本对齐方式
}

实现

状态栏组件

# 状态栏组件
# 创建时间2025722日
@tool
extends PanelContainer

# 水平对齐方式
enum h_aligns{LEFT,CENTER,RIGHT}

# -------------------------- 参数 --------------------------
@export var items:Array[StatusBarItem]:        # 按行划分的项数据
	set(val):
		items = val
		if !is_node_ready():
			await ready
		load_items()

# 整个状态栏的背景样式盒子
@export var bg_style:StyleBoxFlat:               
	set(val):
		bg_style = val
		if !is_node_ready():
			await ready
		add_theme_stylebox_override("panel",val)

# 单个状态栏单元格的样式
@export var cell_style:StyleBoxFlat:               
	set(val):
		cell_style = val
		if !is_node_ready():
			await ready
		load_items()

# -------------------------- 节点引用 --------------------------
@onready var hbox: HBoxContainer = %HBox
# -------------------------- 方法 --------------------------
# 添加项
func add_item(text:String,pos:int=-1,fill:bool=false,h_align:int= h_aligns.LEFT): 
	var itm = StatusBarItem.new()
	itm.text = text
	itm.align = h_align
	itm.fill = fill
	if pos == -1:
		items.append(itm)
	else:
		items.insert(pos,itm)

# 清空
func clear():
	for child in hbox.get_children():
		child.queue_free()
	pass

# 加载所有已经设置好的项目为Label控件
func load_items():
	clear()
	for itm in items:
		var lab = Label.new()
		lab.text = itm.text
		lab.horizontal_alignment = itm.fill
		lab.add_theme_stylebox_override("normal",cell_style)
		if itm.fill:
			lab.size_flags_horizontal = Control.SIZE_EXPAND_FILL
		hbox.add_child(lab)

# 设置制定项的文本
func set_itm_text(idx:int,new_text:String):
	if idx in range(items.size()):
		items[idx].text = new_text

StatusBarItem

# 状态栏项信息
# 2025722日
@tool
extends Resource
class_name StatusBarItem

enum h_align{LEFT,CENTER,RIGHT}
## 文本
@export var 	text:String: 
	set(val):
		text = val
		emit_changed()

## 是否水平拉伸
@export var 	fill:bool:   
	set(val):
		fill = val
		emit_changed()
## 文本对齐方式
@export_enum("left","center","right") var align:int:  
	set(val):
		align = val
		emit_changed()

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巽星石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值