#nullable enable
using System;
using System.Collections.Generic;
namespace UVC.UIToolkit
{
///
/// 트리 구조 리스트의 개별 항목 데이터를 나타내는 클래스입니다.
///
/// 개요:
///
/// UTKTreeListItemData는 계층적 트리 구조에서 각 노드(항목)를 표현합니다.
/// 부모-자식 관계를 통해 중첩된 트리 구조를 구성할 수 있으며,
/// UTKTreeListWindow(UI)에서 사용됩니다.
///
///
/// 주요 용도:
///
/// - 3D glTF 모델의 계층 구조를 UI 트리로 표현
/// - 트리 리스트에서 항목 선택/확장/가시성 상태 관리
/// - 모델 뷰어와 트리 리스트 간의 데이터 동기화
///
///
/// 사용 예시:
///
/// // 루트 항목 생성
/// var root = new UTKTreeListItemData { id = 1, name = "루트" };
///
/// // 자식 항목 추가
/// var child1 = new UTKTreeListItemData { id = 2, name = "자식1" };
/// var child2 = new UTKTreeListItemData { id = 3, name = "자식2" };
/// root.Add(child1);
/// root.Add(child2);
///
/// // 손자 항목 추가
/// var grandChild = new UTKTreeListItemData { id = 4, name = "손자" };
/// child1.Add(grandChild);
///
///
public class UTKTreeListItemData: IDisposable
{
///
/// 항목의 고유 식별자입니다.
/// TreeView에서 항목을 구분하고 선택하는 데 사용됩니다.
/// 일반적으로 TreeList.SetData() 호출 시 자동으로 할당됩니다.
///
public int id = 0;
///
/// 항목의 표시 이름입니다.
/// UI의 TreeView에서 사용자에게 보여지는 텍스트입니다.
/// glTF 모델 로드 시 GameObject 이름이 자동으로 설정됩니다.
///
public string name = string.Empty;
///
/// 추가 옵션 또는 설명 텍스트입니다.
/// 검색 필터링 시 name과 함께 검색 대상이 됩니다.
///
public string option = string.Empty;
///
/// 트리뷰에서 해당 항목이 펼쳐져 있는지 여부입니다.
/// true: 자식 항목들이 표시됨 / false: 자식 항목들이 숨겨짐
///
public bool isExpanded = false;
///
/// 해당 항목이 현재 선택되어 있는지 여부입니다.
/// 선택 상태가 변경되면 TreeList.OnSelectionChanged 이벤트가 발생합니다.
///
public bool isSelected = false;
///
/// 부모 항목에 대한 참조입니다.
/// 루트 항목의 경우 null입니다.
/// Add() 메서드로 자식을 추가하면 자동으로 설정됩니다.
///
public UTKTreeListItemData? parent;
///
/// 자식 항목들의 리스트입니다.
/// 재귀적 트리 구조를 형성합니다.
/// Add() 메서드를 통해 자식을 추가할 수 있습니다.
///
public List children = new List();
///
/// 해당 항목(및 연결된 3D 오브젝트)의 가시성 상태입니다.
/// UI의 눈 아이콘 버튼으로 토글되며,
/// 변경 시 UTKTreeListWindow.OnVisibilityChanged 이벤트를 통해
/// 3D 모델의 GameObject.SetActive()가 호출됩니다.
///
public bool IsVisible = true;
///
/// 외부 시스템(예: 간트 차트)과의 연동을 위한 외부 키입니다.
/// 검색 필터링 시 검색 대상에 포함됩니다.
/// 모델과 차트 간의 동기화에 사용될 수 있습니다.
///
public string ExternalKey = string.Empty;
///
/// 자식 항목을 추가합니다.
/// 추가되는 자식의 parent 속성이 자동으로 현재 항목으로 설정됩니다.
///
/// 추가할 자식 항목
///
///
/// var parent = new UTKTreeListItemData { name = "부모" };
/// var child = new UTKTreeListItemData { name = "자식" };
/// parent.Add(child);
/// // child.parent == parent (자동 설정됨)
///
///
public void Add(UTKTreeListItemData child)
{
child.parent = this;
children.Add(child);
}
public void Dispose()
{
children.Clear();
parent = null;
}
}
}