using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
using KairoEngine.Core;
using KairoEngine.UI;
namespace KairoEngine.UI.ActivityMessages
{
//* This is the simplest possible implementation of this controller
// Todo: Add icons to activity messages
// Todo: Add autohide prorperty to messages
// Todo: Cleanup list of activeMessages that have been destroyed
///
/// Controller for showing activity messages to the player.
/// Use the ActivityMessageEvents.Send() to send a message to this controller.
///
public class ActivityMessageController : MonoBehaviour , IUiSystemElement
{
[Tooltip("The container that will hold all the activity message GameObjects.")]
[LabelText("MSG Container")] public Transform activityMessagesContainer;
[Tooltip("The GameObject prefab for the ActivityMessage.")]
[LabelText("MSG Prefab")] public GameObject activityMessageUiPrefab;
public List messages;
public List activeMessages;
public Canvas canvas;
public bool startVisible = false;
private bool isVisible = true;
private void Start()
{
if(startVisible) UiManager.ShowElement(this);
else UiManager.HideElement(this);
}
private void OnEnable()
{
UiManager.RegisterElement("ActivityMessages", this, this.transform, isVisible);
ActivityMessageEvents.OnActivityMessage += NewActivityMessage;
ActivityMessageEvents.OnTimedActivityMessage += NewTimedActivityMessage;
ActivityMessageEvents.OnStickyActivityMessage += NewStickyActivityMessage;
ActivityMessageEvents.OnUpdateActivityMessage += UpdateActivityMessage;
ActivityMessageEvents.OnRemoveActivityMessage += RemoveActivityMessage;
}
private void OnDisable()
{
UiManager.UnregisterElement(this);
ActivityMessageEvents.OnActivityMessage -= NewActivityMessage;
ActivityMessageEvents.OnTimedActivityMessage -= NewTimedActivityMessage;
ActivityMessageEvents.OnStickyActivityMessage -= NewStickyActivityMessage;
ActivityMessageEvents.OnUpdateActivityMessage -= UpdateActivityMessage;
ActivityMessageEvents.OnRemoveActivityMessage -= RemoveActivityMessage;
}
public void Hide()
{
isVisible = false;
canvas.gameObject.SetActive(false);
}
public void Show()
{
isVisible = true;
canvas.gameObject.SetActive(true);
}
public bool IsVisible() => isVisible;
private void NewActivityMessage(string msg)
{
ActivityMessage message = new ActivityMessage(msg);
CreateMessage(message).Setup(this, message);
}
private void NewTimedActivityMessage(string msg, float time)
{
ActivityMessage message = new ActivityMessage(msg);
CreateMessage(message).Setup(this, message, time);
}
private void NewStickyActivityMessage(string msg, bool sticky)
{
ActivityMessage message = new ActivityMessage(msg);
CreateMessage(message).Setup(this, message, sticky);
}
private void UpdateActivityMessage(string oldText, string newText, float time, bool sticky)
{
for (int i = 0; i < activeMessages.Count; i++)
{
if(activeMessages[i].message.text == oldText)
{
activeMessages[i].message.text = newText;
activeMessages[i].Setup(this, activeMessages[i].message, time, sticky);
return;
}
}
}
private void RemoveActivityMessage(string text)
{
for (int i = 0; i < activeMessages.Count; i++)
{
if(activeMessages[i].message.text == text)
{
activeMessages[i].Remove(this);
return;
}
}
}
private ActivityMessageUi CreateMessage(ActivityMessage message)
{
messages.Add(message);
GameObject obj = Instantiate(activityMessageUiPrefab, activityMessagesContainer);
ActivityMessageUi msgUi = obj.GetComponent();
activeMessages.Add(msgUi);
return msgUi;
}
}
}