MessageWindowManager.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using UnityEngine;
  2. namespace COM3D2.MeidoPhotoStudio.Plugin
  3. {
  4. public class MessageWindowManager : IManager, ISerializable
  5. {
  6. public const string header = "TEXTBOX";
  7. public static readonly SliderProp fontBounds = new SliderProp(25f, 60f);
  8. private static GameObject sysRoot;
  9. private readonly MessageClass msgClass;
  10. private readonly MessageWindowMgr msgWnd;
  11. private readonly UILabel msgLabel;
  12. private readonly UILabel nameLabel;
  13. private readonly GameObject msgGameObject;
  14. public bool ShowingMessage { get; private set; }
  15. private string messageName = string.Empty;
  16. private string messageText = string.Empty;
  17. public int FontSize
  18. {
  19. get => msgLabel.fontSize;
  20. set => msgLabel.fontSize = (int)Mathf.Clamp(value, fontBounds.Left, fontBounds.Right);
  21. }
  22. static MessageWindowManager()
  23. {
  24. InputManager.Register(MpsKey.ToggleMessage, KeyCode.M, "Show/hide message box");
  25. }
  26. public MessageWindowManager()
  27. {
  28. sysRoot = GameObject.Find("__GameMain__/SystemUI Root");
  29. msgWnd = GameMain.Instance.MsgWnd;
  30. msgGameObject = sysRoot.transform.Find("MessageWindowPanel").gameObject;
  31. msgClass = new MessageClass(msgGameObject, msgWnd);
  32. nameLabel = UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/SpeakerName/Name")
  33. .GetComponent<UILabel>();
  34. msgLabel = UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/Message")
  35. .GetComponent<UILabel>();
  36. Utility.SetFieldValue(msgClass, "message_label_", msgLabel);
  37. Utility.SetFieldValue(msgClass, "name_label_", nameLabel);
  38. Activate();
  39. }
  40. public void Activate() => SetPhotoMessageWindowActive(true);
  41. public void Deactivate()
  42. {
  43. msgWnd.CloseMessageWindowPanel();
  44. SetPhotoMessageWindowActive(false);
  45. }
  46. public void Serialize(System.IO.BinaryWriter binaryWriter)
  47. {
  48. binaryWriter.Write(header);
  49. binaryWriter.Write(ShowingMessage);
  50. binaryWriter.Write(FontSize);
  51. binaryWriter.WriteNullableString(messageName);
  52. binaryWriter.WriteNullableString(messageText);
  53. }
  54. public void Deserialize(System.IO.BinaryReader binaryReader)
  55. {
  56. CloseMessagePanel();
  57. var showingMessage = binaryReader.ReadBoolean();
  58. FontSize = binaryReader.ReadInt32();
  59. messageName = binaryReader.ReadNullableString();
  60. messageText = binaryReader.ReadNullableString();
  61. if (showingMessage) ShowMessage(messageName, messageText);
  62. }
  63. public void Update() { }
  64. private void SetPhotoMessageWindowActive(bool active)
  65. {
  66. UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/MessageBox").SetActive(active);
  67. UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/Hitret")
  68. .GetComponent<UISprite>().enabled = !active;
  69. nameLabel.gameObject.SetActive(active);
  70. msgLabel.gameObject.SetActive(active);
  71. Transform transform = sysRoot.transform.Find("MessageWindowPanel/MessageViewer/MsgParent/Buttons");
  72. var msgButtons = new[]
  73. {
  74. MessageWindowMgr.MessageWindowUnderButton.Skip,
  75. MessageWindowMgr.MessageWindowUnderButton.Auto,
  76. MessageWindowMgr.MessageWindowUnderButton.Voice,
  77. MessageWindowMgr.MessageWindowUnderButton.BackLog,
  78. MessageWindowMgr.MessageWindowUnderButton.Config
  79. };
  80. foreach (MessageWindowMgr.MessageWindowUnderButton msgButton in msgButtons)
  81. {
  82. transform.Find(msgButton.ToString()).gameObject.SetActive(!active);
  83. }
  84. if (!msgClass.subtitles_manager_) return;
  85. msgClass.subtitles_manager_.visible = false;
  86. msgClass.subtitles_manager_ = null;
  87. }
  88. public void ShowMessage(string name, string message)
  89. {
  90. messageName = name;
  91. messageText = message;
  92. ShowingMessage = true;
  93. msgWnd.OpenMessageWindowPanel();
  94. msgLabel.ProcessText();
  95. msgClass.SetText(name, message, "", 0, AudioSourceMgr.Type.System);
  96. msgClass.FinishChAnime();
  97. }
  98. public void CloseMessagePanel()
  99. {
  100. ShowingMessage = false;
  101. msgWnd.CloseMessageWindowPanel();
  102. }
  103. }
  104. }