using TyphoonEvent;
using UnityEngine;
namespace TyphoonUI
{
///
/// UI组件
///
public abstract class UIComponent : MonoBehaviour, IScrollCell, IEventOperation
{
public UIObject ViewObject { get; private set; }
///
/// 附加视图
///
///
internal virtual void Attach(UIObject view)
{
ViewObject = view;
InitializeEventOperation();
OnInitialize();
}
///
/// 初始化
///
protected abstract void OnInitialize();
///
/// 滚动视窗-更新数据
///
/// 数据索引
/// 数据项
public virtual void UpdateContent(int index, object data)
{
}
///
/// 滚动视窗-元素是否显示
///
public virtual bool IsVisible => gameObject.activeSelf;
///
/// 滚动视窗-激活/关闭元素
///
public virtual void SetVisible(bool visible)
{
gameObject.SetActive(visible);
}
///
/// 滚动视窗- 元素节点
///
public virtual Transform Root => transform;
///
/// 滚动视窗- 构建时初始化
///
public virtual void OnCellInitialize()
{
}
///
/// 滚动视窗- 更新坐标
///
public virtual void OnUpdatePosition(float scrollPosition, Vector3 localPosition, UIScrollView scrollView)
{
transform.localPosition = localPosition;
}
///
/// 销毁时触发
///
protected virtual void OnDestroy()
{
ReleaseEventOperation();
}
///
/// 构建子面板
///
protected T CreateSubPanel(UIObject view) where T : UIPanel
{
var result = view.gameObject.AddComponent();
result.Attach(view);
result.RootView.alpha = 0;
result.RootView.blocksRaycasts = false;
return result;
}
///
/// 构建子组件
///
protected T CreateSubComponent(UIObject view) where T : UIComponent
{
var result = view.gameObject.AddComponent();
result.Attach(view);
return result;
}
#region 事件系统
public EventOperation EventOperation { get; set; }
public virtual IEventProxy[] EventProxies { get; } = null;
private void InitializeEventOperation() => EventOperation.Register(this);
///
/// 激活单个事件代理
///
/// 消息类型
protected void EnableEvent() => EventOperation.Enable();
///
/// 关闭单个事件代理
///
/// 消息类型
protected void DisableEvent() => EventOperation.Disable();
///
/// 开启所有事件代理
///
protected void EnableAllEvent() => EventOperation.EnableAll();
///
/// 关闭所有事件代理
///
protected void DisableAllEvent() => EventOperation.DisableAll();
///
/// 释放事件
///
protected void ReleaseEventOperation() => EventOperation.Release();
#endregion
}
}