103 lines
4.4 KiB
C#
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.");
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|