Files
XRLib/Assets/Scripts/UVC/UI/List/Draggable/ListItemView.cs

138 lines
4.3 KiB
C#

#nullable enable
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using static RTG.GizmoTransform;
namespace UVC.UI.List.Draggable
{
/// <summary>
/// UI 요소와 데이터를 연결하는 컴포넌트입니다.
/// 데이터 변경 시 UI를 자동으로 업데이트합니다.
///
/// 사용 방법:
/// 1. 리스트 아이템 프리팹에 이 컴포넌트를 추가합니다.
/// 2. Inspector에서 Text와 Image 컴포넌트를 연결합니다.
/// 3. BindData 메서드로 데이터를 설정합니다.
///
/// 예시:
/// var binder = listItem.GetComponent<ListItemView>();
/// binder.BindData(new MyItemData { DisplayName = "아이템 1" });
///
/// // 나중에 데이터 가져오기
/// var data = binder.GetData<MyItemData>();
/// </summary>
public class ListItemView : MonoBehaviour
{
[Header("UI 기본 요소 연결")]
[SerializeField]
[Tooltip("아이템의 제목을 표시할 TextMeshProUGUI 컴포넌트")]
protected TextMeshProUGUI? titleText;
[SerializeField]
[Tooltip("아이템의 아이콘을 표시할 Image 컴포넌트 (선택사항)")]
protected Image? iconImage;
// 현재 바인딩된 데이터를 저장
protected ListItemData? boundData;
public Action<ListItemData>? OnChangeData;
/// <summary>
/// 데이터를 UI에 바인딩합니다
/// </summary>
/// <param name="data">바인딩할 데이터 객체</param>
public virtual void BindData(ListItemData data)
{
boundData = data;
UpdateUI();
Debug.Log($"[ListItemView] 데이터 바인딩 완료 - {gameObject.name}");
}
/// <summary>
/// 바인딩된 데이터를 기반으로 UI를 업데이트합니다
/// </summary>
protected virtual void UpdateUI()
{
// IListItemData 인터페이스를 구현한 경우
if (boundData != null)
{
// 제목 텍스트 업데이트
if (titleText != null)
{
titleText.text = boundData.DisplayName;
}
// IHasIcon 인터페이스도 구현한 경우 아이콘 업데이트
if (iconImage != null && boundData.Icon != null)
{
iconImage.sprite = boundData.Icon;
iconImage.gameObject.SetActive(true);
}
else if (iconImage != null)
{
// 아이콘이 없으면 숨깁니다
iconImage.gameObject.SetActive(false);
}
}
}
/// <summary>
/// 현재 바인딩된 데이터를 특정 타입으로 가져옵니다
/// </summary>
/// <typeparam name="T">가져올 데이터의 타입</typeparam>
/// <returns>바인딩된 데이터, 타입이 맞지 않거나 없으면 null</returns>
public T? GetData<T>() where T : ListItemData
{
return boundData as T;
}
/// <summary>
/// 바인딩된 데이터가 있는지 확인합니다
/// </summary>
public bool HasData => boundData != null;
/// <summary>
/// UI를 수동으로 새로고침합니다
/// </summary>
public void RefreshUI()
{
if (boundData != null)
{
UpdateUI();
}
}
/// <summary>
/// 바인딩을 해제하고 UI를 초기화합니다
/// </summary>
public virtual void ClearBinding()
{
boundData = null;
if (titleText != null)
{
titleText.text = "";
}
if (iconImage != null)
{
iconImage.sprite = null;
iconImage.gameObject.SetActive(false);
}
//Debug.Log($"[ListItemView] 바인딩 해제됨 - {gameObject.name}");
}
protected virtual void OnDestroy()
{
// 바인딩 해제 시 추가 작업이 필요하면 여기에 작성
ClearBinding();
OnChangeData = null;
//Debug.Log($"[ListItemView] 컴포넌트 파괴됨 - {gameObject.name}");
}
}
}