PropsPane.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. namespace MeidoPhotoStudio.Plugin;
  5. public class PropsPane : BasePane
  6. {
  7. private static bool handItemsReady;
  8. private readonly PropManager propManager;
  9. private readonly Dropdown doguCategoryDropdown;
  10. private readonly Dropdown doguDropdown;
  11. private readonly Button addDoguButton;
  12. private readonly Button nextDoguButton;
  13. private readonly Button prevDoguButton;
  14. private readonly Button nextDoguCategoryButton;
  15. private readonly Button prevDoguCategoryButton;
  16. private string currentCategory;
  17. private bool itemSelectorEnabled = true;
  18. public PropsPane(PropManager propManager)
  19. {
  20. this.propManager = propManager;
  21. handItemsReady = Constants.HandItemsInitialized;
  22. if (!handItemsReady)
  23. Constants.MenuFilesChange += InitializeHandItems;
  24. doguCategoryDropdown = new(Translation.GetArray("doguCategories", Constants.DoguCategories));
  25. doguCategoryDropdown.SelectionChange += (_, _) =>
  26. ChangeDoguCategory(SelectedCategory);
  27. doguDropdown = new(new[] { string.Empty });
  28. addDoguButton = new("+");
  29. addDoguButton.ControlEvent += (_, _) =>
  30. SpawnObject();
  31. nextDoguButton = new(">");
  32. nextDoguButton.ControlEvent += (_, _) =>
  33. doguDropdown.Step(1);
  34. prevDoguButton = new("<");
  35. prevDoguButton.ControlEvent += (_, _) =>
  36. doguDropdown.Step(-1);
  37. nextDoguCategoryButton = new(">");
  38. nextDoguCategoryButton.ControlEvent += (_, _) =>
  39. doguCategoryDropdown.Step(1);
  40. prevDoguCategoryButton = new("<");
  41. prevDoguCategoryButton.ControlEvent += (_, _) =>
  42. doguCategoryDropdown.Step(-1);
  43. ChangeDoguCategory(SelectedCategory);
  44. }
  45. private string SelectedCategory =>
  46. Constants.DoguCategories[doguCategoryDropdown.SelectedItemIndex];
  47. public override void Draw()
  48. {
  49. const float buttonHeight = 30;
  50. var arrowLayoutOptions = new[]
  51. {
  52. GUILayout.Width(buttonHeight),
  53. GUILayout.Height(buttonHeight),
  54. };
  55. const float dropdownButtonWidth = 120f;
  56. var dropdownLayoutOptions = new[]
  57. {
  58. GUILayout.Height(buttonHeight),
  59. GUILayout.Width(dropdownButtonWidth),
  60. };
  61. GUILayout.BeginHorizontal();
  62. prevDoguCategoryButton.Draw(arrowLayoutOptions);
  63. doguCategoryDropdown.Draw(dropdownLayoutOptions);
  64. nextDoguCategoryButton.Draw(arrowLayoutOptions);
  65. GUILayout.EndHorizontal();
  66. GUI.enabled = itemSelectorEnabled;
  67. GUILayout.BeginHorizontal();
  68. doguDropdown.Draw(dropdownLayoutOptions);
  69. prevDoguButton.Draw(arrowLayoutOptions);
  70. nextDoguButton.Draw(arrowLayoutOptions);
  71. addDoguButton.Draw(arrowLayoutOptions);
  72. GUILayout.EndHorizontal();
  73. GUI.enabled = true;
  74. }
  75. protected override void ReloadTranslation()
  76. {
  77. doguCategoryDropdown.SetDropdownItems(Translation.GetArray("doguCategories", Constants.DoguCategories));
  78. var category = SelectedCategory;
  79. var translationArray =
  80. category == Constants.CustomDoguCategories[Constants.DoguCategory.HandItem] && !handItemsReady
  81. ? new[] { Translation.Get("systemMessage", "initializing") }
  82. : GetTranslations(category);
  83. doguDropdown.SetDropdownItems(translationArray);
  84. }
  85. private void InitializeHandItems(object sender, MenuFilesEventArgs args)
  86. {
  87. if (args.Type is not MenuFilesEventArgs.EventType.HandItems)
  88. return;
  89. handItemsReady = true;
  90. var selectedCategory = SelectedCategory;
  91. if (selectedCategory == Constants.CustomDoguCategories[Constants.DoguCategory.HandItem])
  92. ChangeDoguCategory(selectedCategory, true);
  93. }
  94. private void ChangeDoguCategory(string category, bool force = false)
  95. {
  96. if (category == currentCategory && !force)
  97. return;
  98. currentCategory = category;
  99. string[] translationArray;
  100. if (category == Constants.CustomDoguCategories[Constants.DoguCategory.HandItem] && !handItemsReady)
  101. {
  102. translationArray = new[] { Translation.Get("systemMessage", "initializing") };
  103. itemSelectorEnabled = false;
  104. }
  105. else
  106. {
  107. translationArray = GetTranslations(category);
  108. itemSelectorEnabled = true;
  109. }
  110. doguDropdown.SetDropdownItems(translationArray, 0);
  111. }
  112. private string[] GetTranslations(string category)
  113. {
  114. IEnumerable<string> itemList = Constants.DoguDict[category];
  115. if (category == Constants.CustomDoguCategories[Constants.DoguCategory.HandItem])
  116. {
  117. // TODO: itemList should not be reused
  118. itemList = itemList.Select(item =>
  119. {
  120. var handItemAsOdogu = Utility.HandItemToOdogu(item);
  121. return Translation.Has("propNames", handItemAsOdogu) ? handItemAsOdogu : item;
  122. });
  123. }
  124. var translationCategory = category == Constants.CustomDoguCategories[Constants.DoguCategory.BGSmall]
  125. ? "bgNames"
  126. : "propNames";
  127. return Translation.GetArray(translationCategory, itemList);
  128. }
  129. private void SpawnObject()
  130. {
  131. var assetName = Constants.DoguDict[SelectedCategory][doguDropdown.SelectedItemIndex];
  132. if (SelectedCategory == Constants.CustomDoguCategories[Constants.DoguCategory.BGSmall])
  133. propManager.AddBgProp(assetName);
  134. else
  135. propManager.AddGameProp(assetName);
  136. }
  137. }