Files
test/Assets/PerfectWorld/Scripts/Task/UI/TaskTreeView.cs
T
2025-11-17 19:07:15 +07:00

159 lines
5.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
namespace BrewMonster.PerfectWorld.Scripts.Task.UI
{
public class TaskTreeView : MonoBehaviour
{
[SerializeField] private TaskTreeViewItem m_pTreeViewItemPrefab;
[Header("DEBUG")]
[SerializeField] private TaskTreeViewItem _currentSelectedItem = null;
[SerializeField] private TaskTreeViewItem[] m_aTreeViewItems;
private void Start()
{
EventBus.Subscribe<TaskItemClickEvent>(evt =>
{
SetSelectedItem(evt.Data);
});
}
public void SetItemData(TaskTreeViewItem item, uint taskType)
{
item.SetItemData(taskType);
}
public uint GetItemData(TaskTreeViewItem item)
{
return item.GetItemData();
}
public TaskTreeViewItem GetNextSiblingItem(TaskTreeViewItem item)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
}
for (int i = 0; i < m_aTreeViewItems.Length - 1; i++)
{
if (m_aTreeViewItems[i] == item)
{
return m_aTreeViewItems[i + 1];
}
}
return null;
}
public TaskTreeViewItem InsertItem(string text, TaskTreeViewItem pParent, TaskTreeViewItem pAfter)
{
// Create a new item GameObject and component
TaskTreeViewItem pItem = Instantiate(m_pTreeViewItemPrefab);
GameObject go = pItem.gameObject;
// go.name = $"Task_{}";
if (pItem == null) return null;
// Parent: root (this) if null; otherwise under given parent item
var parentTransform = (pParent != null ? pParent.transform : this.transform);
go.transform.SetParent(parentTransform, false);
// Set sibling position: after specific item if provided; otherwise append to end
if (pAfter != null && pAfter.transform.parent == parentTransform)
{
int afterIndex = pAfter.transform.GetSiblingIndex();
go.transform.SetSiblingIndex(afterIndex + 1);
}
else
{
go.transform.SetAsLastSibling();
}
// Optionally set label text if a TMP_Text is attached under the item (not required here)
// var label = go.GetComponentInChildren<TMPro.TMP_Text>(true);
// if (label != null) label.text = text ?? string.Empty;
pItem.SetItemText(text);
pItem.SetTreeLevel(pParent != null ? pParent.GetTreeLevel() + 1 : 0);
// Refresh local cache of items
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
// pParent.RefreshLayout();
if(pParent) pParent.SetExpand(false); // Collapse parent to show new item only when expanded
return pItem;
}
public void DeleteAllItems()
{
List<Transform> childrenCopy = new();
foreach (Transform child in transform)
{
// Destroy(child.GetComponent<TaskTreeViewItem>());
childrenCopy.Add(child);
}
foreach (var child in childrenCopy)
{
child.SetParent(null);
Destroy(child.gameObject);
}
m_aTreeViewItems = null;
// m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
_currentSelectedItem = null;
}
public TaskTreeViewItem GetItemByData(uint taskType)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
}
foreach (var item in m_aTreeViewItems)
{
if (item.GetItemData() == taskType)
{
return item;
}
}
return null;
}
public TaskTreeViewItem GetFirstChild()
{
return transform.childCount == 0 ? null : transform.GetChild(0).GetComponent<TaskTreeViewItem>();
}
public TaskTreeViewItem GetSelectedItem()
{
return _currentSelectedItem;
}
void SetSelectedItem(uint idItem)
{
_currentSelectedItem = GetItemByData(idItem);
}
public void RefreshLayout()
{
var parent = GetComponent<RectTransform>();
// Force Unity to rebuild layout immediately
parent.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(parent);
}
}
}