Files
test/Assets/PerfectWorld/Scripts/Task/UI/TaskTreeViewHolder.cs

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 });
}
}
}