라이브러리 정리
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user