using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UVC.Data;
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;
// DataObject에 있는 모든 키-값 쌍을 순회합니다.
foreach (var kvp in data)
{
// 태그를 사용하여 줄바꿈 시에도 정렬이 유지되도록 합니다.
//combinedString += $"{kvp.Key}{kvp.Value ?? "null"}\n";
// : 키가 텍스트 컨테이너 너비의 40%를 넘지 않도록 제한합니다.
// 키가 길면 이 지점에서 자동으로 줄바꿈됩니다.
// : 값의 시작 위치를 40% 지점으로 지정합니다.
// : 다음 줄에 영향을 주지 않도록 마진을 리셋합니다.
//combinedString += $"{kvp.Key}{kvp.Value ?? "null"}\n";
// : 키 텍스트의 너비를 전체의 40%로 제한합니다. 키가 이 너비를 초과하면 자동으로 줄바꿈됩니다.
// : 값 텍스트의 시작 위치를 40% 지점으로 설정합니다.
combinedString += $"{kvp.Key}{kvp.Value ?? "null"}\n";
}
combinedString = combinedString.TrimEnd('\n'); // 마지막 줄바꿈 제거
detailTxt.text = combinedString;
// 내용의 길이에 맞게 상세 정보창의 높이를 동적으로 조절합니다.
RectTransform rect = GetComponent();
if (rect != null && detailTxt != null)
{
RectTransform textRect = detailTxt.GetComponent();
// 현재 배경(rect)의 높이와 텍스트(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.");
}
}
}
}