using System;
using System.Collections.Generic;
namespace TyphoonUI
{
///
/// 组件绑定
///
public class BindingItem
{
public string Package;
public string Script;
public string SourceName;
public int Priority;
public BindingItem(string package, string script, string sourceName, int priority)
{
Package = package;
Script = script;
SourceName = sourceName;
Priority = priority;
}
}
///
/// 资源绑定,基类
///
public abstract class AbstractBinding : IBinding
{
//优先级计数器
private static int _priorityCounter = 0;
private Dictionary _bindings = null;
private Dictionary _panelLayers = new Dictionary();
///
/// 初始化
///
public void Initialize()
{
//绑定UI资源
Binding();
_bindings = new Dictionary();
foreach (var binding in RegisterBindings)
{
_bindings.Add(binding.Script, binding);
}
}
[NonSerialized] public List RegisterBindings = new List();
public abstract void Binding();
///
/// 获取面板绑定信息
///
public (BindingItem, CanvasLayer) GetPanelBinding() where T : UIPanel
{
if (_bindings == null)
{
throw new Exception("UIBinding未完成初始化");
}
var script = typeof(T).FullName;
if (_bindings.TryGetValue(script, out var bindingItem) && _panelLayers.TryGetValue(script, out var layer))
{
return (bindingItem, layer);
}
throw new Exception($"未绑定面板类:{script}");
}
///
/// 获取组件绑定信息
///
public BindingItem GetComponentBinding() where T : UIComponent
{
if (_bindings == null)
{
throw new Exception("UIBinding未完成初始化");
}
var script = typeof(T).FullName;
if (_bindings.TryGetValue(script, out var match))
{
return match;
}
throw new Exception($"未绑定组件类:{script}");
}
///
/// 获取层级画布面板绑定关系
///
public List GetLayerPanelBindingItems(CanvasLayer layer)
{
if (_bindings == null)
{
throw new Exception("UIBinding未完成初始化");
}
var result = new List();
foreach (var kv in _panelLayers)
{
var script = kv.Key;
var temLayer = kv.Value;
if (temLayer == layer)
{
if (_bindings.TryGetValue(script, out var match))
{
result.Add(match);
}
}
}
return result;
}
///
/// 获取面板bindingitem
///
/// 面板类名(FullName)
public BindingItem GetPanelBinding(string panelScript)
{
if (_bindings.TryGetValue(panelScript, out var match))
{
return match;
}
return null;
}
///
/// 绑定面板组件
///
/// 包名
/// 资源名(不需要后缀)
/// 画布层级
/// 面板脚本类
public void Bind(string package, string sourceName, CanvasLayer layer) where T : UIPanel
{
_priorityCounter += 1;
var script = typeof(T).FullName;
RegisterBindings.Add(new BindingItem(package, script, sourceName, _priorityCounter));
//关联画布层级
_panelLayers.Add(script, layer);
}
///
/// 绑定面板组件
///
/// 归属的包名
/// 资源名(不需要后缀)
/// 组件脚本类
public void Bind(string package, string sourceName) where T : UIComponent
{
_priorityCounter += 1;
var script = typeof(T).FullName;
RegisterBindings.Add(new BindingItem(package, script, sourceName, _priorityCounter));
}
}
}