152 lines
4.9 KiB
C#
152 lines
4.9 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.Events;
|
|
namespace BrewMonster.Scripts.Task.UI
|
|
{
|
|
public class TaskTreeViewHolder : MonoBehaviour,IRefreshLayout
|
|
{
|
|
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep1;
|
|
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep2;
|
|
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep3;
|
|
private TaskTreeViewItem _pTreeItemPrefab_Root;
|
|
[Header("DEBUG")]
|
|
[SerializeField] private uint m_uItemData;
|
|
[SerializeField] private int _treeLevel =999;
|
|
public bool isLastItem = true;
|
|
public Color _itemTextColor;
|
|
public string _itemText;
|
|
public bool _expand;
|
|
private RectTransform _rectTransform;
|
|
private void Awake()
|
|
{
|
|
_rectTransform = GetComponent<RectTransform>();
|
|
}
|
|
public void ResolvePrefab()
|
|
{
|
|
// Guard: prevent multiple calls to avoid duplicate prefab instances
|
|
// 防护:防止多次调用以避免重复的预制体实例
|
|
if (_pTreeItemPrefab_Root != null)
|
|
{
|
|
return;
|
|
}
|
|
if(isLastItem)
|
|
{
|
|
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep3,transform);
|
|
}
|
|
else if(_treeLevel == 0)
|
|
{
|
|
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep1,transform);
|
|
}
|
|
else
|
|
{
|
|
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep2,transform);
|
|
}
|
|
_pTreeItemPrefab_Root.OnClick.AddListener(OnBtnClick);
|
|
_pTreeItemPrefab_Root.OnExpand.AddListener(OnExpand);
|
|
_pTreeItemPrefab_Root.transform.SetAsFirstSibling();
|
|
|
|
// Apply stored text and color to the prefab after creation
|
|
// 创建后应用存储的文本和颜色到预制体
|
|
if (!string.IsNullOrEmpty(_itemText))
|
|
{
|
|
_pTreeItemPrefab_Root.SetItemText(_itemText);
|
|
}
|
|
if (_itemTextColor != default(Color))
|
|
{
|
|
_pTreeItemPrefab_Root.SetItemTextColor(_itemTextColor);
|
|
}
|
|
_pTreeItemPrefab_Root.RefreshSelf();
|
|
|
|
}
|
|
public void SetItemData(uint uItemData)
|
|
{
|
|
m_uItemData = uItemData;
|
|
gameObject.name = $"Task_{uItemData}";
|
|
}
|
|
|
|
public uint GetItemData()
|
|
{
|
|
return m_uItemData;
|
|
}
|
|
|
|
public void SetItemTextColor(Color color)
|
|
{
|
|
_itemTextColor = color;
|
|
// Apply to prefab if it exists
|
|
// 如果预制体存在,则应用颜色
|
|
if (_pTreeItemPrefab_Root != null)
|
|
{
|
|
_pTreeItemPrefab_Root.SetItemTextColor(color);
|
|
}
|
|
}
|
|
public void SetLastItem(bool isLastItem)
|
|
{
|
|
this.isLastItem = isLastItem;
|
|
}
|
|
public void SetItemText(string text)
|
|
{
|
|
_itemText = text;
|
|
// Apply to prefab if it exists
|
|
// 如果预制体存在,则应用文本
|
|
if (_pTreeItemPrefab_Root != null)
|
|
{
|
|
_pTreeItemPrefab_Root.SetItemText(text);
|
|
}
|
|
}
|
|
|
|
public void SetTreeLevel(int level)
|
|
{
|
|
_treeLevel = level;
|
|
}
|
|
|
|
public int GetTreeLevel() => _treeLevel;
|
|
|
|
public void OnExpand(bool expand)
|
|
{
|
|
var children = GetComponentsInChildren<TaskTreeViewHolder>(true);
|
|
|
|
for (int i=1; i<children.Length; i++)
|
|
{
|
|
if(children[i].GetTreeLevel() == _treeLevel + 1)
|
|
{
|
|
children[i].gameObject.SetActive(expand);
|
|
}
|
|
}
|
|
}
|
|
public void RefreshLayout()
|
|
{
|
|
var rectTransform = _rectTransform;
|
|
if (rectTransform == null)
|
|
{
|
|
return;
|
|
}
|
|
foreach(var child in GetComponentsInChildren<TaskTreeViewHolder>(true))
|
|
{
|
|
child.RefreshSelf();
|
|
}
|
|
|
|
if (transform.parent &&
|
|
transform.parent.TryGetComponent<IRefreshLayout>(out var refreshLayout))
|
|
{
|
|
refreshLayout.RefreshLayout();
|
|
}
|
|
}
|
|
public void RefreshSelf()
|
|
{
|
|
var rectTransform = _rectTransform;
|
|
if (rectTransform == null)
|
|
{
|
|
return;
|
|
}
|
|
rectTransform.ForceUpdateRectTransforms();
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);
|
|
//_pTreeItemPrefab_Root.RefreshSelf();
|
|
}
|
|
void OnBtnClick()
|
|
{
|
|
EventBus.Publish(new TaskItemClickEvent() { Data = m_uItemData });
|
|
}
|
|
}
|
|
|
|
} |