라이브러리 정리

This commit is contained in:
logonkhi
2025-12-08 21:06:05 +09:00
parent bfee6d8745
commit cf31cc0159
330 changed files with 68800 additions and 42167 deletions

View File

@@ -4,6 +4,7 @@ using DG.Tweening;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UVC.UI.Buttons;
namespace UVC.UI.List.Tree
{
@@ -78,6 +79,12 @@ namespace UVC.UI.List.Tree
[SerializeField]
protected RectTransform layout;
/// <summary>
/// 가시성 상태를 표시하는 배경 이미지.
/// </summary>
[SerializeField]
protected ImageToggle visibleToggle;
#endregion
#region (Data Fields)
@@ -151,20 +158,19 @@ namespace UVC.UI.List.Tree
// 화살표 방향 설정 (초기에는 펼쳐짐)
SetExpand();
// 4. 데이터 변경 감지 구독
// 데이터의 이름, 자식 목록 등이 변경되면 OnDataChanged 호출
data.OnDataChanged += OnDataChanged;
// 데이터의 선택 상태가 변경되면 OnSelectionChanged 호출
data.OnSelectionChanged += OnSelectionChanged;
// 5. 버튼 클릭 이벤트 구독
// 4. 버튼 클릭 이벤트 구독
// 아이템을 클릭하면 OnItemClicked 메서드 호출
if (itemButton != null)
{
itemButton.onClick.AddListener(OnItemClicked);
}
if(visibleToggle != null)
{
visibleToggle.isOn = data.IsVisible;
visibleToggle.OnValueChanged.AddListener(OnItemVisibilityChanged);
}
// 6. 현재 선택 상태 UI에 반영
// data.IsSelected가 true이면 배경 표시
UpdateSelectionUI();
@@ -195,13 +201,14 @@ namespace UVC.UI.List.Tree
/// <summary>
/// 데이터 변경에 반응하여 UI를 갱신합니다.
///
/// TreeList에서 호출됩니다.
///
/// 매개변수:
/// - changedType: 변경 종류(이름/확장/자식 추가 등)
/// - changedData: 변경 대상 데이터(자식 추가 등일 때 유효)
/// - index: 삽입/이동 시 기준 인덱스(해당되는 경우)
/// </summary>
protected virtual void OnDataChanged(ChangedType changedType, TreeListItemData changedData, int index)
internal virtual void HandleDataChanged(ChangedType changedType, TreeListItemData changedData, int index)
{
if (data == null) return;
@@ -213,6 +220,16 @@ namespace UVC.UI.List.Tree
return;
}
if (changedType == ChangedType.TailButtons)
{
// TailButtons 변경 처리
if (visibleToggle != null)
{
visibleToggle.isOn = data.IsVisible;
}
return;
}
if (changedType == ChangedType.Name)
{
@@ -272,7 +289,7 @@ namespace UVC.UI.List.Tree
//changedData 부모에게 알림 - UI 갱신 용
if (changedData.Parent != null)
{
changedData.Parent.RemoveChild(changedData);
treeList.RemoveChild(changedData.Parent, changedData);
}
else
{
@@ -281,7 +298,7 @@ namespace UVC.UI.List.Tree
if (item != null) item.Delete(true);
data.AddChild(clone);
treeList.AddChild(data, clone);
}
else if (changedType == ChangedType.AddCloneAtChild)
{
@@ -295,7 +312,7 @@ namespace UVC.UI.List.Tree
//changedData 부모에게 알림
if (changedData.Parent != null)
{
changedData.Parent.RemoveChild(changedData);
treeList.RemoveChild(changedData.Parent, changedData);
}
else
{
@@ -304,7 +321,7 @@ namespace UVC.UI.List.Tree
if (item != null) item.Delete(true);
data.AddChildAt(clone, index);
treeList.AddChildAt(data, clone, index);
}
else if (changedType == ChangedType.SwapChild)
{
@@ -334,12 +351,9 @@ namespace UVC.UI.List.Tree
/// <summary>
/// 선택 상태 변경에 반응하여 UI를 갱신합니다.
///
/// 매개변수:
/// - changedData: 변경된 데이터(자기 자신)
/// - isSelected: 선택 여부
/// TreeList에서 호출됩니다.
/// </summary>
protected void OnSelectionChanged(TreeListItemData changedData, bool isSelected)
internal void HandleSelectionChanged()
{
// 선택 상태 UI 업데이트 (배경 표시/숨김)
UpdateSelectionUI();
@@ -444,9 +458,9 @@ namespace UVC.UI.List.Tree
/// <summary>
/// 아이템 클릭 시 호출됩니다.
///
///
/// 동작:
/// - 등록된 OnClickAction 실행(있으면)
/// - TreeList의 OnItemClickAction 이벤트 실행
/// - Ctrl/Shift 상태를 읽어 TreeList에 전달
/// (일반/토글/범위 선택)
/// </summary>
@@ -454,20 +468,28 @@ namespace UVC.UI.List.Tree
{
if (data == null) return;
// 1. 데이터에 등록된 클릭 액션 실행 (있으면)
data.OnClickAction?.Invoke(data);
// 1. TreeList의 클릭 액션 이벤트 실행
treeList.OnItemClickAction?.Invoke(data);
// 2. Ctrl 키 상태 감지
// LeftControl(왼쪽) 또는 RightControl(오른쪽) 중 하나라도 누르고 있으면 true
// 2. Ctrl 키 상태 감지
bool ctrlPressed = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl);
// 3. Shift 키 상태 감지
// 3. Shift 키 상태 감지
bool shiftPressed = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
// 4. 부모 TreeList에 클릭 정보 전달
// 4. 부모 TreeList에 클릭 정보 전달
// TreeList는 이 정보를 받아서 선택 로직을 처리합니다.
// (단일 선택 / 다중 선택 / 범위 선택 등)
treeList.OnItemClicked(data, ctrlPressed, shiftPressed);
treeList.HandleItemClicked(data, ctrlPressed, shiftPressed);
}
/// <summary>
/// 아이템 가시성 변경 시 호출됩니다.
/// </summary>
/// <param name="isVisible"></param>
protected void OnItemVisibilityChanged(bool isVisible)
{
if (data == null) return;
treeList.OnItemVisibilityChanged?.Invoke(data, isVisible);
}
#endregion
@@ -481,15 +503,13 @@ namespace UVC.UI.List.Tree
public void ToggleChild()
{
// 1. 애니메이션 진행 중이면 중복 호출 방지
if (isAnimating) return;
if (isAnimating || data == null) return;
// 플래그 설정: 애니메이션 시작
isAnimating = true;
// 2. 펼침/접힘 상태 토글
// ! 연산자: 반대로 변경 (true → false, false → true)
data!.IsExpanded = !data.IsExpanded;
// 2. 펼침/접힘 상태 토글 (TreeList를 통해 UI도 갱신)
treeList.SetItemExpanded(data, !data.IsExpanded);
}
/// <summary>
@@ -576,35 +596,39 @@ namespace UVC.UI.List.Tree
/// <param name="deleteData">데이터도 삭제할지 여부</param>
public void Delete(bool deleteData = false)
{
// 먼저 맵에서 해제(Dispose로 Data가 null 되기 전)
if (data != null)
// 맵에서 해제
if (data != null && treeList != null)
{
treeList.UnregisterView(data, this);
}
// 1. 데이터 변경 이벤트 구독 해제
// 1. 데이터 정리
if (data != null)
{
// -= 연산자: 이벤트에서 리스너 제거
data.OnDataChanged -= OnDataChanged;
data.OnSelectionChanged -= OnSelectionChanged;
data.Dispose();
data = null;
}
// 2. 버튼 클릭 이벤트 구독 해제
// 2. 버튼 클릭 이벤트 구독 해제
if (itemButton != null)
{
itemButton.onClick.RemoveListener(OnItemClicked);
}
if (childExpand != null)
if (visibleToggle != null)
{
childExpand.transform.DOKill(); // ✅ 진행 중인 회전 애니메이션 중단
visibleToggle.OnValueChanged.RemoveAllListeners();
}
// 3. 이 GameObject 삭제
// 게임 실행 중에 오브젝트를 제거합니다.
if (childExpand != null)
{
childExpand.transform.DOKill(); // 진행 중인 회전 애니메이션 중단
}
// 3. 참조 정리
treeList = null!;
// 4. 이 GameObject 삭제
GameObject.Destroy(gameObject);
}
@@ -614,25 +638,36 @@ namespace UVC.UI.List.Tree
protected virtual void OnDestroy()
{
// 맵 해제
if (data != null)
if (data != null && treeList != null)
{
treeList.UnregisterView(data, this);
}
// 1. 데이터 변경 이벤트 구독 해제
// 1. 데이터 정리
if (data != null)
{
data.OnDataChanged -= OnDataChanged;
data.OnSelectionChanged -= OnSelectionChanged;
data.Dispose();
data = null;
}
// 2. 버튼 클릭 이벤트 구독 해제
// 2. 버튼 클릭 이벤트 구독 해제
if (itemButton != null)
{
itemButton.onClick.RemoveListener(OnItemClicked);
}
if (visibleToggle != null)
{
visibleToggle.OnValueChanged.RemoveAllListeners();
}
if (childExpand != null)
{
childExpand.transform.DOKill(); // 진행 중인 회전 애니메이션 중단
}
// 3. 참조 정리
treeList = null!;
}
#endregion