ModPropsPane.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using static MeidoPhotoStudio.Plugin.MenuFileUtility;
  5. namespace MeidoPhotoStudio.Plugin;
  6. public class ModPropsPane : BasePane
  7. {
  8. private readonly PropManager propManager;
  9. private readonly Dropdown propCategoryDropdown;
  10. private readonly Toggle modFilterToggle;
  11. private readonly Toggle baseFilterToggle;
  12. private readonly bool isModsOnly = PropManager.ModItemsOnly;
  13. private Vector2 propListScrollPos;
  14. private List<ModItem> modPropList;
  15. private string currentCategory;
  16. private bool modItemsReady;
  17. private bool shouldDraw;
  18. private int categoryIndex;
  19. private bool modFilter;
  20. private bool baseFilter;
  21. private int currentListCount;
  22. public ModPropsPane(PropManager propManager)
  23. {
  24. this.propManager = propManager;
  25. modItemsReady = MenuFilesReady || PropManager.ModItemsOnly;
  26. var listItems = Translation.GetArray("clothing", MenuCategories);
  27. if (!modItemsReady)
  28. {
  29. listItems[0] = Translation.Get("systemMessage", "initializing");
  30. MenuFilesReadyChange += (_, _) =>
  31. {
  32. modItemsReady = true;
  33. propCategoryDropdown.SetDropdownItems(Translation.GetArray("clothing", MenuCategories));
  34. };
  35. }
  36. propCategoryDropdown = new(listItems);
  37. propCategoryDropdown.SelectionChange += (_, _) =>
  38. {
  39. if (!modItemsReady)
  40. return;
  41. ChangePropCategory();
  42. };
  43. if (isModsOnly)
  44. return;
  45. modFilterToggle = new(Translation.Get("background2Window", "modsToggle"));
  46. modFilterToggle.ControlEvent += (_, _) =>
  47. ChangeFilter(FilterType.Mod);
  48. baseFilterToggle = new(Translation.Get("background2Window", "baseToggle"));
  49. baseFilterToggle.ControlEvent += (_, _) =>
  50. ChangeFilter(FilterType.Base);
  51. }
  52. private enum FilterType
  53. {
  54. None,
  55. Mod,
  56. Base,
  57. }
  58. private string SelectedCategory =>
  59. MenuCategories[propCategoryDropdown.SelectedItemIndex];
  60. public override void Draw()
  61. {
  62. const float dropdownButtonHeight = 30f;
  63. var dropdownButtonWidth = isModsOnly ? 120f : 90f;
  64. var dropdownLayoutOptions = new[]
  65. {
  66. GUILayout.Height(dropdownButtonHeight),
  67. GUILayout.Width(dropdownButtonWidth),
  68. };
  69. GUILayout.BeginHorizontal();
  70. if (isModsOnly)
  71. {
  72. GUILayout.FlexibleSpace();
  73. propCategoryDropdown.Draw(dropdownLayoutOptions);
  74. GUILayout.FlexibleSpace();
  75. }
  76. else
  77. {
  78. GUI.enabled = modItemsReady;
  79. propCategoryDropdown.Draw(dropdownLayoutOptions);
  80. GUI.enabled = shouldDraw;
  81. modFilterToggle.Draw();
  82. baseFilterToggle.Draw();
  83. GUI.enabled = true;
  84. }
  85. GUILayout.EndHorizontal();
  86. if (shouldDraw)
  87. {
  88. var windowRect = parent.WindowRect;
  89. var windowHeight = windowRect.height;
  90. var windowWidth = windowRect.width;
  91. const float offsetTop = 80f;
  92. const int columns = 4;
  93. var buttonSize = windowWidth / columns - 10f;
  94. var positionRect = new Rect(5f, offsetTop + dropdownButtonHeight, windowWidth - 10f, windowHeight - 145f);
  95. var viewRect = new Rect(
  96. 0f, 0f, buttonSize * columns, buttonSize * Mathf.Ceil(currentListCount / (float)columns) + 5);
  97. propListScrollPos = GUI.BeginScrollView(positionRect, propListScrollPos, viewRect);
  98. var modIndex = 0;
  99. foreach (var modItem in modPropList)
  100. {
  101. if (modFilter && !modItem.IsMod || baseFilter && modItem.IsMod)
  102. continue;
  103. var x = modIndex % columns * buttonSize;
  104. var y = modIndex / columns * buttonSize;
  105. var iconRect = new Rect(x, y, buttonSize, buttonSize);
  106. if (GUI.Button(iconRect, string.Empty))
  107. propManager.AddModProp(modItem);
  108. GUI.DrawTexture(iconRect, modItem.Icon);
  109. modIndex++;
  110. }
  111. GUI.EndScrollView();
  112. }
  113. }
  114. protected override void ReloadTranslation()
  115. {
  116. var listItems = Translation.GetArray("clothing", MenuCategories);
  117. if (!modItemsReady)
  118. listItems[0] = Translation.Get("systemMessage", "initializing");
  119. propCategoryDropdown.SetDropdownItems(listItems);
  120. if (isModsOnly)
  121. return;
  122. modFilterToggle.Label = Translation.Get("background2Window", "modsToggle");
  123. baseFilterToggle.Label = Translation.Get("background2Window", "baseToggle");
  124. }
  125. private void ChangeFilter(FilterType filterType)
  126. {
  127. if (updating)
  128. return;
  129. if (modFilterToggle.Value && baseFilterToggle.Value)
  130. {
  131. updating = true;
  132. modFilterToggle.Value = filterType is FilterType.Mod;
  133. baseFilterToggle.Value = filterType is FilterType.Base;
  134. updating = false;
  135. }
  136. modFilter = modFilterToggle.Value;
  137. baseFilter = baseFilterToggle.Value;
  138. SetListCount();
  139. }
  140. private void ChangePropCategory()
  141. {
  142. var category = SelectedCategory;
  143. if (currentCategory == category)
  144. return;
  145. currentCategory = category;
  146. categoryIndex = propCategoryDropdown.SelectedItemIndex;
  147. shouldDraw = categoryIndex > 0;
  148. if (!shouldDraw)
  149. return;
  150. propListScrollPos = Vector2.zero;
  151. modPropList = Constants.GetModPropList(category);
  152. SetListCount();
  153. }
  154. private void SetListCount() =>
  155. currentListCount = modFilter
  156. ? modPropList.Count(mod => mod.IsMod)
  157. : baseFilter
  158. ? modPropList.Count(mod => !mod.IsMod)
  159. : modPropList.Count;
  160. }