using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace UVC.UI.Window.PropertyWindow
{
///
/// 속성 그룹의 UI를 담당하는 View 클래스입니다.
/// 접이식 헤더와 자식 아이템들의 컨테이너를 관리합니다.
///
public class PropertyGroupView : MonoBehaviour
{
[Header("Header")]
[SerializeField] private Button _headerButton;
[SerializeField] private TextMeshProUGUI _groupNameLabel;
[SerializeField] private Image _expandIcon;
[Header("Icons")]
[SerializeField] private Sprite _expandedIcon;
[SerializeField] private Sprite _collapsedIcon;
[Header("Content")]
[SerializeField] private Transform _itemContainer;
[SerializeField] private GameObject _contentPanel;
private IPropertyGroup _group;
private PropertyWindow _controller;
///
/// 자식 PropertyItem UI들이 생성될 컨테이너입니다.
///
public Transform ItemContainer => _itemContainer;
///
/// 그룹 데이터
///
public IPropertyGroup Group => _group;
///
/// 그룹 ID
///
public string GroupId => _group?.GroupId;
///
/// PropertyGroupView를 초기화합니다.
///
/// 표시할 그룹 데이터
/// 상호작용할 컨트롤러
public void Setup(IPropertyGroup group, PropertyWindow controller)
{
_group = group;
_controller = controller;
// 그룹명 설정
if (_groupNameLabel != null)
{
_groupNameLabel.text = group.GroupName;
}
// 헤더 버튼 이벤트 등록
if (_headerButton != null)
{
_headerButton.onClick.RemoveAllListeners();
_headerButton.onClick.AddListener(OnHeaderClicked);
}
// 펼침/접힘 상태 반영
UpdateExpandedState();
}
///
/// 헤더 클릭 시 호출됩니다.
///
private void OnHeaderClicked()
{
if (_controller != null && _group != null)
{
_controller.ToggleGroupExpanded(_group.GroupId);
}
}
///
/// 펼침/접힘 상태를 UI에 반영합니다.
///
public void UpdateExpandedState()
{
if (_group == null) return;
bool isExpanded = _group.IsExpanded;
// 컨텐츠 패널 표시/숨김
if (_contentPanel != null)
{
_contentPanel.SetActive(isExpanded);
}
// 아이콘 변경
if (_expandIcon != null)
{
if (isExpanded && _expandedIcon != null)
{
_expandIcon.sprite = _expandedIcon;
}
else if (!isExpanded && _collapsedIcon != null)
{
_expandIcon.sprite = _collapsedIcon;
}
// 아이콘 회전으로 표현할 경우
_expandIcon.transform.rotation = Quaternion.Euler(0, 0, isExpanded ? 0 : -90);
}
}
///
/// 그룹 내 모든 아이템 UI를 제거합니다.
///
public void ClearItems()
{
if (_itemContainer == null) return;
foreach (Transform child in _itemContainer)
{
Destroy(child.gameObject);
}
}
///
/// 풀에 반환하기 전에 정리합니다.
///
public void Reset()
{
_group = null;
_controller = null;
if (_headerButton != null)
{
_headerButton.onClick.RemoveAllListeners();
}
ClearItems();
}
private void OnDestroy()
{
if (_headerButton != null)
{
_headerButton.onClick.RemoveAllListeners();
}
}
}
}