174 lines
6.4 KiB
C#
174 lines
6.4 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UIElements;
|
|
using UVC.UIToolkit;
|
|
|
|
/// <summary>
|
|
/// UTKTreeListWindow의 기능을 테스트하기 위한 샘플 MonoBehaviour입니다.
|
|
/// 계층적 트리 데이터를 생성하고 다양한 이벤트 핸들러를 등록하여 동작을 확인합니다.
|
|
/// </summary>
|
|
public class UTKTreeListWindowSample : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
public UIDocument uiDocument;
|
|
|
|
[SerializeField]
|
|
[Tooltip("시작 시 적용할 테마")]
|
|
private UTKTheme initialTheme = UTKTheme.Dark;
|
|
|
|
private UTKToggle _themeToggle;
|
|
|
|
private UTKTreeListWindow treeListWindow;
|
|
|
|
void Start()
|
|
{
|
|
|
|
// UIDocument 참조 확인
|
|
var doc = GetComponent<UIDocument>();
|
|
if (doc == null)
|
|
{
|
|
Debug.LogError("UIDocument가 할당되지 않았습니다.");
|
|
return;
|
|
}
|
|
uiDocument = doc;
|
|
|
|
var toggle = uiDocument.rootVisualElement.Q<UTKToggle>("toggle");
|
|
if (toggle == null)
|
|
{
|
|
Debug.LogError("UXML에서 UTKToggle을 찾을 수 없습니다.");
|
|
return;
|
|
}
|
|
_themeToggle = toggle;
|
|
|
|
var window = uiDocument.rootVisualElement.Q<UTKTreeListWindow>("window");
|
|
if (window == null)
|
|
{
|
|
Debug.LogError("UXML에서 UTKTreeListWindow를 찾을 수 없습니다.");
|
|
return;
|
|
}
|
|
treeListWindow = window;
|
|
|
|
UTKThemeManager.Instance.RegisterRoot(uiDocument.rootVisualElement);
|
|
UTKThemeManager.Instance.SetTheme(initialTheme);
|
|
|
|
_themeToggle.OnValueChanged += (isOn) =>
|
|
{
|
|
UTKThemeManager.Instance.SetTheme(!isOn ? UTKTheme.Dark : UTKTheme.Light);
|
|
};
|
|
|
|
// 테스트용 계층적 트리 데이터 생성
|
|
CreateTestData();
|
|
|
|
// 이벤트 핸들러 등록
|
|
RegisterEventHandlers();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 테스트용 계층적 트리 데이터를 생성합니다.
|
|
/// 10개의 루트 항목을 생성하고, 각 루트에 5개의 자식,
|
|
/// 각 자식에 3개의 손자, 각 손자에 2개의 증손자를 추가합니다.
|
|
/// </summary>
|
|
private void CreateTestData()
|
|
{
|
|
List<UTKTreeListItemData> rootItems = new List<UTKTreeListItemData>();
|
|
// 10개의 루트 항목 생성
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
// 루트 항목 생성 (긴 이름으로 가로 스크롤 테스트)
|
|
UTKTreeListItemData itemData = new UTKTreeListItemData { name = $"RootItem_{i}_TestLongName" };
|
|
|
|
// 각 루트에 5개의 자식 항목 추가
|
|
int childCount = 5;
|
|
for (int j = 0; j < childCount; j++)
|
|
{
|
|
UTKTreeListItemData childData = new UTKTreeListItemData { name = $"ChildItem_{i}_{j}_WithExtendedDescription" };
|
|
itemData.Add(childData);
|
|
|
|
// 각 자식에 3개의 손자 항목 추가
|
|
int grandChildCount = 3;
|
|
for (int k = 0; k < grandChildCount; k++)
|
|
{
|
|
UTKTreeListItemData grandChildData = new UTKTreeListItemData { name = $"GrandChild_{i}_{j}_{k}_VeryLongItemNameForScrollTest" };
|
|
childData.Add(grandChildData);
|
|
|
|
// 각 손자에 2개의 증손자 항목 추가
|
|
for (int l = 0; l < 2; l++)
|
|
{
|
|
UTKTreeListItemData greatGrandChildData = new UTKTreeListItemData { name = $"GreatGrandChild_{i}_{j}_{k}_{l}_ExtremelyLongNameToTestHorizontalScrolling" };
|
|
grandChildData.Add(greatGrandChildData);
|
|
}
|
|
}
|
|
}
|
|
|
|
rootItems.Add(itemData);
|
|
}
|
|
|
|
// 루트 항목을 트리에 추가
|
|
treeListWindow.SetData(rootItems);
|
|
|
|
Debug.Log("[UTKTreeListWindowSample] 테스트 데이터 생성 완료: 10개 루트 항목");
|
|
}
|
|
|
|
/// <summary>
|
|
/// UTKTreeListWindow의 이벤트 핸들러들을 등록합니다.
|
|
/// 선택, 선택 해제, 삭제, 더블클릭, 가시성 변경 이벤트를 처리합니다.
|
|
/// </summary>
|
|
private void RegisterEventHandlers()
|
|
{
|
|
// 항목 선택 이벤트 (다중 선택 지원)
|
|
// 사용자가 항목을 클릭하거나 SelectItem() 호출 시 발생
|
|
treeListWindow.OnItemSelected += (List<UTKTreeListItemData> selectedItems) =>
|
|
{
|
|
foreach (var item in selectedItems)
|
|
{
|
|
Debug.Log($"[선택됨] {item.name}");
|
|
}
|
|
};
|
|
|
|
// 항목 선택 해제 이벤트 (다중 선택 지원)
|
|
// 사용자가 다른 항목을 선택하거나 DeselectItem() 호출 시 발생
|
|
treeListWindow.OnItemDeselected += (List<UTKTreeListItemData> deselectedItems) =>
|
|
{
|
|
foreach (var item in deselectedItems)
|
|
{
|
|
Debug.Log($"[선택 해제됨] {item.name}");
|
|
}
|
|
};
|
|
|
|
// 항목 삭제 이벤트
|
|
// 사용자가 Delete 또는 Backspace 키를 누를 때 발생
|
|
// 실제 삭제는 이 핸들러에서 DeleteItem()을 호출하여 수행
|
|
treeListWindow.OnItemDeleted += (UTKTreeListItemData deletedItem) =>
|
|
{
|
|
Debug.Log($"[삭제 요청] {deletedItem.name}");
|
|
// 실제로 항목을 삭제하려면 아래 주석을 해제하세요:
|
|
// treeListWindow.DeleteItem(deletedItem);
|
|
};
|
|
|
|
// 항목 더블클릭 이벤트
|
|
// 사용자가 항목을 더블클릭하거나 Enter 키를 누를 때 발생
|
|
treeListWindow.OnItemDoubleClicked += (UTKTreeListItemData doubleClickedItem) =>
|
|
{
|
|
Debug.Log($"[더블클릭] {doubleClickedItem.name}");
|
|
};
|
|
|
|
// 항목 가시성 변경 이벤트
|
|
// 사용자가 눈 아이콘 버튼을 클릭하여 가시성을 토글할 때 발생
|
|
treeListWindow.OnItemVisibilityChanged += (UTKTreeListItemData item, bool isVisible) =>
|
|
{
|
|
Debug.Log($"[가시성 변경] {item.name}, IsVisible: {isVisible}");
|
|
};
|
|
|
|
Debug.Log("[UTKTreeListWindowSample] 이벤트 핸들러 등록 완료");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 컴포넌트가 파괴될 때 리소스를 정리합니다.
|
|
/// </summary>
|
|
private void OnDestroy()
|
|
{
|
|
// UTKTreeListWindow의 Dispose 호출로 이벤트 핸들러 정리
|
|
treeListWindow?.Dispose();
|
|
}
|
|
}
|