ActivityMessageController.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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, string tooltipType)
  85. {
  86. ActivityMessage message = new ActivityMessage(text, id, group, prefab, icon, time, sticky, hideOnClick, action, tooltipHeader, tooltipBody, tooltipType);
  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, string tooltipType)
  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. activeMessages[i].message.tooltipType = tooltipType;
  106. if(action != null) activeMessages[i].message.action = action;
  107. activeMessages[i].Setup(this, activeMessages[i].message);
  108. return;
  109. }
  110. }
  111. }
  112. private void DestroyActivityMessage(string text)
  113. {
  114. for (int i = 0; i < activeMessages.Count; i++)
  115. {
  116. if(activeMessages[i].message.text == text || activeMessages[i].message.id == text)
  117. {
  118. activeMessages[i].Remove();
  119. }
  120. }
  121. }
  122. public void RemoveActivityMessageFromList(ActivityMessage message)
  123. {
  124. for (int i = 0; i < activeMessages.Count; i++)
  125. {
  126. if(activeMessages[i].message.text == message.text || activeMessages[i].message.id == message.id)
  127. {
  128. activeMessages.RemoveAt(i);
  129. }
  130. }
  131. }
  132. private ActivityMessageUi CreateMessage(ActivityMessage message, int groupIndex, int prefabIndex)
  133. {
  134. groups[groupIndex].messages.Add(message);
  135. GameObject obj = Instantiate(prefabs[prefabIndex].prefab, groups[groupIndex].container);
  136. ActivityMessageUi msgUi = obj.GetComponent<ActivityMessageUi>();
  137. activeMessages.Add(msgUi);
  138. return msgUi;
  139. }
  140. public bool GroupExits(string title)
  141. {
  142. for (int i = 0; i < groups.Count; i++)
  143. {
  144. if(groups[i].title == title) return true;
  145. }
  146. return false;
  147. }
  148. public int GetGroupIndexByTitle(string title)
  149. {
  150. for (int i = 0; i < groups.Count; i++)
  151. {
  152. if(groups[i].title == title) return i;
  153. }
  154. return defaultGroupIndex;
  155. }
  156. public bool PrefabExits(string title)
  157. {
  158. for (int i = 0; i < prefabs.Count; i++)
  159. {
  160. if(prefabs[i].title == title) return true;
  161. }
  162. return false;
  163. }
  164. public int GetPrefabIndexByTitle(string title)
  165. {
  166. for (int i = 0; i < prefabs.Count; i++)
  167. {
  168. if(prefabs[i].title == title) return i;
  169. }
  170. return defaultPrefabIndex;
  171. }
  172. }
  173. }