EG/ui/Builtin/LUICanvas.py
2026-02-25 11:49:31 +08:00

103 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
LUICanvas - 类似Unity的Canvas容器带有可视化边框
用于组织和管理UI元素所有UI组件都应该是Canvas的子节点
"""
from LUIObject import LUIObject
from LUISprite import LUISprite
from LUIInitialState import LUIInitialState
__all__ = ["LUICanvas"]
class LUICanvas(LUIObject):
"""
Canvas容器类似Unity的Canvas系统
- 所有UI元素的父容器
- 带有可视化的边框线框类似Unity编辑器中的Canvas Gizmo
- 可以设置边框颜色和宽度
"""
def __init__(self, border_color=(0.3, 0.7, 1.0, 0.3), border_width=2, **kwargs):
"""
创建一个新的Canvas
参数:
border_color: 边框颜色 (r, g, b, a),默认为蓝色半透明
border_width: 边框宽度默认为2像素使用平面模式时此参数无效
"""
LUIObject.__init__(self)
self._border_width = border_width
self._border_color = border_color
# 创建一个透明平面覆盖整个Canvas
self._border_plane = LUISprite(self, "blank", "skin")
self._border_plane.pos = (0, 0)
self._border_plane.color = self._border_color
self._border_plane.z_offset = 0
# 先设置一个固定尺寸,确保可见
self._border_plane.width = 1280
self._border_plane.height = 720
# 应用初始状态
LUIInitialState.init(self, kwargs)
# 最后设置Canvas占满整个屏幕这会触发setter更新边框
self.set_size("100%", "100%")
def _update_borders(self):
"""更新边框平面的位置和大小"""
# 直接获取width和height属性值
try:
width = self.width
height = self.height
# 设置平面覆盖整个Canvas区域
self._border_plane.pos = (0, 0)
self._border_plane.width = width
self._border_plane.height = height
except:
# 如果获取失败,使用默认值
pass
def set_border_color(self, color):
"""设置边框颜色 (r, g, b, a)"""
self._border_color = color
self._border_plane.color = color
def set_border_width(self, width):
"""设置边框宽度(平面模式下无效)"""
self._border_width = width
def show_border(self):
"""显示边框"""
self._border_plane.show()
def hide_border(self):
"""隐藏边框"""
self._border_plane.hide()
@property
def width(self):
"""获取宽度"""
return LUIObject.width.fget(self)
@width.setter
def width(self, value):
"""设置宽度并更新边框"""
LUIObject.width.fset(self, value)
self._update_borders()
@property
def height(self):
"""获取高度"""
return LUIObject.height.fget(self)
@height.setter
def height(self, value):
"""设置高度并更新边框"""
LUIObject.height.fset(self, value)
self._update_borders()