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

158 lines
5.8 KiB
C#

using System;
using UnityEngine;
using UVC.Data;
using UVC.Data.Core;
namespace UVC.Factory.Alarm
{
/// <summary>
/// 개별 알람 아이콘 하나를 관리하는 클래스입니다.
/// 평소에는 간단한 아이콘(AlarmSingleIcon)으로 표시되고, 클릭하면 상세 정보(AlarmDetailView)를 보여줍니다.
/// </summary>
public class AlarmSingleIconManager : MonoBehaviour
{
[Header("UI Components")]
[Tooltip("알람을 간략하게 표시하는 아이콘 UI입니다.")]
[SerializeField] private AlarmSingleIcon singleIcon;
[Tooltip("알람 상세 정보를 표시하는 UI입니다.")]
[SerializeField] private AlarmDetailView detailView;
/// <summary>
/// 이 아이콘의 상세 보기가 활성화될 때 호출되는 이벤트입니다.
/// 상위 관리자인 AlarmIconManager가 다른 아이콘들의 상세 보기를 닫는 등의 관리를 위해 사용합니다.
/// </summary>
public Action<AlarmSingleIconManager> OnDetail;
// 이 아이콘이 표시하는 실제 알람 데이터입니다.
private DataObject data;
// 알람이 발생한 설비의 Transform 정보입니다. (현재 코드에서는 직접 사용되지 않음)
private Transform equipmentTransform;
/// <summary>
/// 이 아이콘이 가지고 있는 알람 데이터를 외부에서 읽을 수 있도록 노출하는 프로퍼티입니다.
/// </summary>
public DataObject Data => data;
/// <summary>
/// 상세 정보 UI가 현재 활성화되어 있는지 여부를 반환합니다.
/// </summary>
public bool IsDetailViewActive => detailView != null && detailView.gameObject.activeSelf;
/// <summary>
/// 컴포넌트가 시작될 때 호출되는 Unity 생명주기 메서드입니다.
/// </summary>
private void Start()
{
if (singleIcon != null)
{
// 간단한 아이콘(singleIcon)이 클릭되었을 때 OnPointerClick 메서드가 호출되도록 이벤트를 등록합니다.
singleIcon.OnClickHandler += OnPointerClick;
}
else
{
Debug.LogWarning("Single Icon이 할당되지 않았습니다.");
}
}
/// <summary>
/// 이 컴포넌트가 파괴될 때 호출되는 Unity 생명주기 메서드입니다.
/// </summary>
private void OnDestroy()
{
// 참조를 정리하여 메모리 누수를 방지합니다.
data = null;
equipmentTransform = null;
if (singleIcon != null)
{
// Start에서 등록했던 클릭 이벤트를 해제합니다.
singleIcon.OnClickHandler -= OnPointerClick;
}
else
{
Debug.LogWarning("Single Icon is not assigned.");
}
}
/// <summary>
/// 이 아이콘에 표시할 알람 데이터를 설정하거나 업데이트합니다.
/// </summary>
/// <param name="newData">설정할 새로운 알람 데이터</param>
/// <param name="equipment">알람이 발생한 설비의 Transform</param>
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;
}
}
/// <summary>
/// 상세 정보 UI를 보여줍니다.
/// </summary>
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);
}
/// <summary>
/// 상세 정보 UI를 숨깁니다.
/// </summary>
public void HideDetail()
{
if (detailView != null)
{
detailView.Hide();
}
}
/// <summary>
/// 아이콘(singleIcon)이 클릭되었을 때 호출되는 메서드입니다.
/// </summary>
public void OnPointerClick()
{
if (detailView == null)
{
Debug.LogWarning("Detail view or text is not assigned.");
return;
}
// 상세 보기를 보여주는 메서드를 호출합니다.
ShowDetail();
}
}
}