ActivityMessageController.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using Sirenix.OdinInspector;
  6. using KairoEngine.Core;
  7. using KairoEngine.UI;
  8. namespace KairoEngine.UI.ActivityMessages
  9. {
  10. //* This is the simplest possible implementation of this controller
  11. // Todo: Add icons to activity messages
  12. // Todo: Add autohide prorperty to messages
  13. // Todo: Cleanup list of activeMessages that have been destroyed
  14. /// <summary>
  15. /// Controller for showing activity messages to the player.
  16. /// Use the ActivityMessageEvents.Send() to send a message to this controller.
  17. /// </summary>
  18. [HideMonoScript]
  19. public class ActivityMessageController : MonoBehaviour , IUiSystemElement
  20. {
  21. [BoxGroup("Settings")] public string elementTitle = "ActivityMessages";
  22. [BoxGroup("Settings")] public Canvas canvas;
  23. [BoxGroup("Settings")] public bool startVisible = false;
  24. [BoxGroup("Settings")] public int defaultGroupIndex = 0;
  25. [BoxGroup("Settings")] public int defaultPrefabIndex = 0;
  26. [PropertySpace(4,4)]
  27. public List<ActivityMessageGroup> groups = new List<ActivityMessageGroup>();
  28. [PropertySpace(4,4), Tooltip("The GameObject prefab for the ActivityMessage.")]
  29. public List<ActivityMessagePrefabData> prefabs;
  30. [ReadOnly, PropertySpace(4,0)] public List<ActivityMessageUi> activeMessages;
  31. private bool isVisible = true;
  32. private void Start()
  33. {
  34. if(startVisible) UiManager.ShowElement(this);
  35. else UiManager.HideElement(this);
  36. }
  37. private void OnEnable()
  38. {
  39. UiManager.RegisterElement(elementTitle, this, this.transform, isVisible);
  40. ActivityMessageEvents.OnActivityMessage += NewActivityMessage;
  41. ActivityMessageEvents.OnTimedActivityMessage += NewTimedActivityMessage;
  42. ActivityMessageEvents.OnStickyActivityMessage += NewStickyActivityMessage;
  43. ActivityMessageEvents.OnFullMessage += NewFullMessage;
  44. ActivityMessageEvents.OnUpdateActivityMessage += UpdateActivityMessage;
  45. ActivityMessageEvents.OnRemoveActivityMessage += DestroyActivityMessage;
  46. }
  47. private void OnDisable()
  48. {
  49. UiManager.UnregisterElement(this);
  50. ActivityMessageEvents.OnActivityMessage -= NewActivityMessage;
  51. ActivityMessageEvents.OnTimedActivityMessage -= NewTimedActivityMessage;
  52. ActivityMessageEvents.OnStickyActivityMessage -= NewStickyActivityMessage;
  53. ActivityMessageEvents.OnFullMessage -= NewFullMessage;
  54. ActivityMessageEvents.OnUpdateActivityMessage -= UpdateActivityMessage;
  55. ActivityMessageEvents.OnRemoveActivityMessage -= DestroyActivityMessage;
  56. }
  57. public void Hide()
  58. {
  59. isVisible = false;
  60. canvas.gameObject.SetActive(false);
  61. }
  62. public void Show()
  63. {
  64. isVisible = true;
  65. canvas.gameObject.SetActive(true);
  66. }
  67. public bool IsVisible() => isVisible;
  68. private void NewActivityMessage(string msg)
  69. {
  70. ActivityMessage message = new ActivityMessage(msg);
  71. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  72. }
  73. private void NewTimedActivityMessage(string msg, float time)
  74. {
  75. ActivityMessage message = new ActivityMessage(msg, "", "", "", null, time, false, true, null, "", "");
  76. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  77. }
  78. private void NewStickyActivityMessage(string msg, bool sticky)
  79. {
  80. ActivityMessage message = new ActivityMessage(msg, "", "", "", null, 0f, true, true, null, "", "");
  81. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  82. }
  83. private void NewFullMessage(string text, string id, string group, string prefab, Sprite icon, float time, bool sticky, bool hideOnClick,
  84. Action action, string tooltipHeader, string tooltipBody)
  85. {
  86. ActivityMessage message = new ActivityMessage(text, id, group, prefab, icon, time, sticky, hideOnClick, action, tooltipHeader, tooltipBody);
  87. int groupIndex = GetGroupIndexByTitle(group);
  88. int prefabIndex = GetPrefabIndexByTitle(prefab);
  89. CreateMessage(message, groupIndex, prefabIndex).Setup(this, message);
  90. }
  91. private void UpdateActivityMessage(string id, string newText, Sprite newSprite, float time, bool sticky, bool hideOnClick,
  92. Action action, string tooltipHeader, string tooltipBody)
  93. {
  94. for (int i = 0; i < activeMessages.Count; i++)
  95. {
  96. if(activeMessages[i].message.text == id || activeMessages[i].message.id == id)
  97. {
  98. activeMessages[i].message.text = newText;
  99. if(newSprite != null) activeMessages[i].message.icon = newSprite;
  100. activeMessages[i].message.time = time;
  101. activeMessages[i].message.sticky = sticky;
  102. activeMessages[i].message.hideOnClick = hideOnClick;
  103. activeMessages[i].message.tooltipHeader = tooltipHeader;
  104. activeMessages[i].message.tooltipBody = tooltipBody;
  105. if(action != null) activeMessages[i].message.action = action;
  106. activeMessages[i].Setup(this, activeMessages[i].message);
  107. return;
  108. }
  109. }
  110. }
  111. private void DestroyActivityMessage(string text)
  112. {
  113. for (int i = 0; i < activeMessages.Count; i++)
  114. {
  115. if(activeMessages[i].message.text == text || activeMessages[i].message.id == text)
  116. {
  117. activeMessages[i].Remove();
  118. }
  119. }
  120. }
  121. public void RemoveActivityMessageFromList(ActivityMessage message)
  122. {
  123. for (int i = 0; i < activeMessages.Count; i++)
  124. {
  125. if(activeMessages[i].message.text == message.text || activeMessages[i].message.id == message.id)
  126. {
  127. activeMessages.RemoveAt(i);
  128. }
  129. }
  130. }
  131. private ActivityMessageUi CreateMessage(ActivityMessage message, int groupIndex, int prefabIndex)
  132. {
  133. groups[groupIndex].messages.Add(message);
  134. GameObject obj = Instantiate(prefabs[prefabIndex].prefab, groups[groupIndex].container);
  135. ActivityMessageUi msgUi = obj.GetComponent<ActivityMessageUi>();
  136. activeMessages.Add(msgUi);
  137. return msgUi;
  138. }
  139. public bool GroupExits(string title)
  140. {
  141. for (int i = 0; i < groups.Count; i++)
  142. {
  143. if(groups[i].title == title) return true;
  144. }
  145. return false;
  146. }
  147. public int GetGroupIndexByTitle(string title)
  148. {
  149. for (int i = 0; i < groups.Count; i++)
  150. {
  151. if(groups[i].title == title) return i;
  152. }
  153. return defaultGroupIndex;
  154. }
  155. public bool PrefabExits(string title)
  156. {
  157. for (int i = 0; i < prefabs.Count; i++)
  158. {
  159. if(prefabs[i].title == title) return true;
  160. }
  161. return false;
  162. }
  163. public int GetPrefabIndexByTitle(string title)
  164. {
  165. for (int i = 0; i < prefabs.Count; i++)
  166. {
  167. if(prefabs[i].title == title) return i;
  168. }
  169. return defaultPrefabIndex;
  170. }
  171. }
  172. }