#nullable enable using TMPro; using UnityEngine; using UnityEngine.UI; using UVC.Data.Core; namespace UVC.Factory.Alarm { /// /// 알람의 상세 정보를 표시하는 UI를 관리하는 클래스입니다. /// DataObject에 담긴 모든 키-값 쌍을 리스트 형태로 보여주는 역할을 합니다. /// public class AlarmDetailView : MonoBehaviour { [Tooltip("알람 상세 내용이 표시될 TextMeshPro UI 컴포넌트입니다.")] [SerializeField] private TextMeshProUGUI detailTxt; [Tooltip("상세 정보창을 닫기 위한 버튼 UI 컴포넌트입니다.")] [SerializeField] private Button closeButton; /// /// 컴포넌트가 처음 활성화될 때 호출되는 Unity 생명주기 메서드입니다. /// UI의 초기 상태를 설정합니다. /// private void Awake() { // 닫기 버튼에 클릭 이벤트 리스너를 추가합니다. 버튼을 클릭하면 Hide() 메서드가 호출됩니다. closeButton.onClick.AddListener(Hide); // 초기에는 상세 정보창이 보이지 않도록 비활성화합니다. gameObject.SetActive(false); } /// /// 알람 데이터를 받아와 상세 정보 UI에 표시하고, 창을 활성화합니다. /// /// 표시할 알람의 모든 정보가 담긴 DataObject public void Show(DataObject data) { string combinedString = string.Empty; DataMask? userMask = DataMask.GetUserMask("UserALARM"); if (userMask != null) { foreach (var item in userMask) { // DataObject에서 해당 키의 값을 가져와서 표시합니다. combinedString += $"{item.Key}{data.GetString(item.Key) ?? "null"}\n"; } } else { combinedString += $"ALARM_TYPE{data.GetString("ALARM_TYPE") ?? "null"}\n"; combinedString += $"CODE{data.GetString("CODE") ?? "null"}\n"; combinedString += $"MACHINENAME{data.GetString("MACHINENAME") ?? "null"}\n"; combinedString += $"MESSAGE{data.GetString("MESSAGE") ?? "null"}\n"; combinedString += $"TIMESTAMP{data.GetString("TIMESTAMP") ?? "null"}\n"; } combinedString = combinedString.TrimEnd('\n'); // 마지막 줄바꿈 제거 detailTxt.text = combinedString; // 내용의 길이에 맞게 상세 정보창의 높이를 동적으로 조절합니다. RectTransform rect = GetComponent(); if (rect != null && detailTxt != null) { RectTransform textRect = detailTxt.GetComponent(); // 현재 배경(size)의 높이와 텍스트(textRect) 영역 높이의 차이를 계산하여 상하 여백(margin)을 구합니다. float marginHeight = rect.rect.height - textRect.rect.height; // 배경의 높이를 '텍스트의 실제 높이(preferredHeight)' + '상하 여백'으로 설정하여 내용이 잘리지 않게 합니다. rect.sizeDelta = new Vector2(rect.rect.width, detailTxt.preferredHeight + marginHeight); } } /// /// 상세 정보 UI를 비활성화하여 화면에서 숨깁니다. /// public void Hide() { gameObject.SetActive(false); } /// /// 이 컴포넌트가 파괴될 때 호출되는 Unity 생명주기 메서드입니다. /// 이벤트 리스너를 제거하여 메모리 누수를 방지합니다. /// private void OnDestroy() { if (closeButton != null) { // Awake에서 등록했던 클릭 이벤트 리스너를 제거합니다. closeButton.onClick.RemoveListener(Hide); } else { Debug.LogWarning("Detail Close Button is not assigned."); } } } }