using System;
using System.Collections.Generic;
using UnityEngine;
namespace Unity.BossRoom.Gameplay.UI
{
///
/// Handles the display of Popup messages. Instantiates and reuses popup panel prefabs to allow displaying multiple
/// messages in succession.
///
public class PopupManager : MonoBehaviour
{
[SerializeField]
GameObject m_PopupPanelPrefab;
[SerializeField]
GameObject m_Canvas;
List m_PopupPanels = new List();
static PopupManager s_Instance;
const float k_Offset = 30;
const float k_MaxOffset = 200;
void Awake()
{
if (s_Instance != null) throw new Exception("Invalid state, instance is not null");
s_Instance = this;
DontDestroyOnLoad(m_Canvas);
}
void OnDestroy()
{
s_Instance = null;
}
///
/// Displays a popup message with the specified title and main text.
///
/// The title text at the top of the panel
/// The text just under the title- the main body of text
///
public static PopupPanel ShowPopupPanel(string titleText, string mainText, bool closeableByUser = true)
{
if (s_Instance != null)
{
return s_Instance.DisplayPopupPanel(titleText, mainText, closeableByUser);
}
Debug.LogError($"No PopupPanel instance found. Cannot display message: {titleText}: {mainText}");
return null;
}
PopupPanel DisplayPopupPanel(string titleText, string mainText, bool closeableByUser)
{
var popup = GetNextAvailablePopupPanel();
if (popup != null)
{
popup.SetupPopupPanel(titleText, mainText, closeableByUser);
}
return popup;
}
PopupPanel GetNextAvailablePopupPanel()
{
int nextAvailablePopupIndex = 0;
// Find the index of the first PopupPanel that is not displaying and has no popups after it that are currently displaying
for (int i = 0; i < m_PopupPanels.Count; i++)
{
if (m_PopupPanels[i].IsDisplaying)
{
nextAvailablePopupIndex = i + 1;
}
}
if (nextAvailablePopupIndex < m_PopupPanels.Count)
{
return m_PopupPanels[nextAvailablePopupIndex];
}
// None of the current PopupPanels are available, so instantiate a new one
var popupGameObject = Instantiate(m_PopupPanelPrefab, gameObject.transform);
popupGameObject.transform.position += new Vector3(1, -1) * (k_Offset * m_PopupPanels.Count % k_MaxOffset);
var popupPanel = popupGameObject.GetComponent();
if (popupPanel != null)
{
m_PopupPanels.Add(popupPanel);
}
else
{
Debug.LogError("PopupPanel prefab does not have a PopupPanel component!");
}
return popupPanel;
}
}
}