using Gpm.Ui; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using UVC.Util; namespace UVC.UI.List { public class PrefabGridItem : InfiniteScrollItem, IPointerEnterHandler, IPointerExitHandler { [SerializeField] private Image image; [SerializeField] private TextMeshProUGUI text; /// /// InfiniteScroll에 의해 데이터가 이 아이템에 할당될 때 호출되는 핵심 메서드입니다. /// 스크롤 시 아이템이 재활용될 때마다 새로운 데이터로 이 메서드가 호출되어 UI를 갱신합니다. /// /// 이 아이템에 표시할 데이터입니다. `InfiniteScrollData`를 상속받은 `ComponentListItemData` 객체입니다. /// /// /// // 1. 표시할 데이터를 생성합니다. /// var categoryData = new ComponentListItemData /// { /// isCategory = true, /// categoryName = "전기 설비", /// categoryBadgeCount = 10 /// }; /// /// var generalData = new ComponentListItemData /// { /// isCategory = false, /// generalName = "분전반", /// generalOption = "옵션 A", /// factoryObjectInfo = new FactoryObjectInfo { Id = "some-unique-Id", Name = "분전반" } /// }; /// /// // 2. 생성한 데이터를 InfiniteScroll에 추가합니다. /// // infiniteScroll은 InfiniteScroll 컴포넌트의 인스턴스입니다. /// infiniteScroll.InsertData(categoryData); /// infiniteScroll.InsertData(generalData); /// /// // 위 코드가 실행되면, InfiniteScroll은 각 데이터에 맞는 ComponentListItem을 생성(또는 재활용)하고, /// // 이 UpdateData 메서드를 호출하여 UI를 데이터에 맞게 설정합니다. /// /// public override async void UpdateData(InfiniteScrollData scrollData) { // 1. 부모 클래스의 UpdateData를 호출하여 기본 초기화 작업을 수행합니다. // 이 과정에서 this.scrollData에 매개변수로 받은 scrollData가 할당됩니다. base.UpdateData(scrollData); PrefabGridItemData data = (PrefabGridItemData)scrollData; text.text = data.ItemName; image.sprite = await ResourceManager.LoadOnlyAsync(data.ImagePrefabPath); } public void OnClick() { PrefabGridItemData data = (PrefabGridItemData)scrollData; data.OnClickAction?.Invoke(data); } public void OnPointerEnter(PointerEventData eventData) { CursorManager.Instance.SetCursor(CursorType.HandPoint); } public void OnPointerExit(PointerEventData eventData) { CursorManager.Instance.SetCursor(CursorType.Default); } } }