103 lines
3.1 KiB
Python
103 lines
3.1 KiB
Python
"""
|
||
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()
|