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(); } } } }