Files
EnglewoodLAB/Assets/Scripts/Factory/Alarm/AlarmDetailView.cs

103 lines
4.4 KiB
C#

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