using System; using UnityEngine; using UVC.Data; using UVC.Data.Core; namespace UVC.Factory.Alarm { /// /// 개별 알람 아이콘 하나를 관리하는 클래스입니다. /// 평소에는 간단한 아이콘(AlarmSingleIcon)으로 표시되고, 클릭하면 상세 정보(AlarmDetailView)를 보여줍니다. /// public class AlarmSingleIconManager : MonoBehaviour { [Header("UI Components")] [Tooltip("알람을 간략하게 표시하는 아이콘 UI입니다.")] [SerializeField] private AlarmSingleIcon singleIcon; [Tooltip("알람 상세 정보를 표시하는 UI입니다.")] [SerializeField] private AlarmDetailView detailView; /// /// 이 아이콘의 상세 보기가 활성화될 때 호출되는 이벤트입니다. /// 상위 관리자인 AlarmIconManager가 다른 아이콘들의 상세 보기를 닫는 등의 관리를 위해 사용합니다. /// public Action OnDetail; // 이 아이콘이 표시하는 실제 알람 데이터입니다. private DataObject data; // 알람이 발생한 설비의 Transform 정보입니다. (현재 코드에서는 직접 사용되지 않음) private Transform equipmentTransform; /// /// 이 아이콘이 가지고 있는 알람 데이터를 외부에서 읽을 수 있도록 노출하는 프로퍼티입니다. /// public DataObject Data => data; /// /// 상세 정보 UI가 현재 활성화되어 있는지 여부를 반환합니다. /// public bool IsDetailViewActive => detailView != null && detailView.gameObject.activeSelf; /// /// 컴포넌트가 시작될 때 호출되는 Unity 생명주기 메서드입니다. /// private void Start() { if (singleIcon != null) { // 간단한 아이콘(singleIcon)이 클릭되었을 때 OnPointerClick 메서드가 호출되도록 이벤트를 등록합니다. singleIcon.OnClickHandler += OnPointerClick; } else { Debug.LogWarning("Single Icon이 할당되지 않았습니다."); } } /// /// 이 컴포넌트가 파괴될 때 호출되는 Unity 생명주기 메서드입니다. /// private void OnDestroy() { // 참조를 정리하여 메모리 누수를 방지합니다. data = null; equipmentTransform = null; if (singleIcon != null) { // Start에서 등록했던 클릭 이벤트를 해제합니다. singleIcon.OnClickHandler -= OnPointerClick; } else { Debug.LogWarning("Single Icon is not assigned."); } } /// /// 이 아이콘에 표시할 알람 데이터를 설정하거나 업데이트합니다. /// /// 설정할 새로운 알람 데이터 /// 알람이 발생한 설비의 Transform public void SetData(DataObject newData, Transform equipment) { // 데이터 업데이트 if (data == null) { data = newData; } else { // 기존 데이터가 있는 경우, 새로운 데이터의 내용으로 덮어씁니다. foreach (var keyValue in newData) { if (data.ContainsKey(keyValue.Key)) { data[keyValue.Key] = keyValue.Value; } } } equipmentTransform = equipment; // 데이터에서 아이콘 정보를 가져와 UI 텍스트로 표시합니다. string icon = data.GetString("ICON"); if (singleIcon.Text != null && icon != null) { singleIcon.Text = icon; } } /// /// 상세 정보 UI를 보여줍니다. /// private void ShowDetail() { // 이미 상세 보기가 활성화되어 있다면 아무것도 하지 않습니다. if (detailView.gameObject.activeSelf) return; // 상세 보기를 열었다는 사실을 외부(AlarmIconManager)에 알립니다. OnDetail?.Invoke(this); // 이 아이콘이 다른 아이콘들보다 위에 그려지도록 렌더링 순서를 맨 뒤로 보냅니다. // (Unity UI에서 RectTransform의 계층 순서가 뒤에 있을수록 화면에 위에 그려짐) transform.SetAsLastSibling(); // 상세 보기 UI를 활성화하고, 알람 데이터를 전달하여 내용을 채웁니다. detailView.gameObject.SetActive(true); detailView.Show(data); } /// /// 상세 정보 UI를 숨깁니다. /// public void HideDetail() { if (detailView != null) { detailView.Hide(); } } /// /// 아이콘(singleIcon)이 클릭되었을 때 호출되는 메서드입니다. /// public void OnPointerClick() { if (detailView == null) { Debug.LogWarning("Detail view or text is not assigned."); return; } // 상세 보기를 보여주는 메서드를 호출합니다. ShowDetail(); } } }