MaidFaceBlendPane.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using UnityEngine;
  5. namespace MeidoPhotoStudio.Plugin;
  6. public class MaidFaceBlendPane : BasePane
  7. {
  8. private static readonly string[] TabTranslations = { "baseTab", "customTab" };
  9. private readonly MeidoManager meidoManager;
  10. private readonly SelectionGrid faceBlendSourceGrid;
  11. private readonly Dropdown faceBlendCategoryDropdown;
  12. private readonly Button prevCategoryButton;
  13. private readonly Button nextCategoryButton;
  14. private readonly Dropdown faceBlendDropdown;
  15. private readonly Button facePrevButton;
  16. private readonly Button faceNextButton;
  17. private bool facePresetMode;
  18. private bool faceListEnabled;
  19. public MaidFaceBlendPane(MeidoManager meidoManager)
  20. {
  21. Constants.CustomFaceChange += OnPresetChange;
  22. this.meidoManager = meidoManager;
  23. faceBlendSourceGrid = new(Translation.GetArray("maidFaceWindow", TabTranslations));
  24. faceBlendSourceGrid.ControlEvent += (_, _) =>
  25. {
  26. facePresetMode = faceBlendSourceGrid.SelectedItemIndex is 1;
  27. if (updating)
  28. return;
  29. var list = facePresetMode
  30. ? CurrentFaceGroupList.ToArray()
  31. : Translation.GetArray("faceBlendCategory", Constants.FaceGroupList);
  32. faceBlendCategoryDropdown.SetDropdownItems(list, 0);
  33. };
  34. faceBlendCategoryDropdown = new(Translation.GetArray("faceBlendCategory", Constants.FaceGroupList));
  35. faceBlendCategoryDropdown.SelectionChange += (_, _) =>
  36. {
  37. faceListEnabled = CurrentFaceList.Count > 0;
  38. faceBlendDropdown.SetDropdownItems(UIFaceList(), 0);
  39. };
  40. prevCategoryButton = new("<");
  41. prevCategoryButton.ControlEvent += (_, _) =>
  42. faceBlendCategoryDropdown.Step(-1);
  43. nextCategoryButton = new(">");
  44. nextCategoryButton.ControlEvent += (_, _) =>
  45. faceBlendCategoryDropdown.Step(1);
  46. faceBlendDropdown = new(UIFaceList());
  47. faceBlendDropdown.SelectionChange += (_, _) =>
  48. {
  49. if (!faceListEnabled || updating)
  50. return;
  51. this.meidoManager.ActiveMeido.SetFaceBlendSet(SelectedFace);
  52. };
  53. facePrevButton = new("<");
  54. facePrevButton.ControlEvent += (_, _) =>
  55. faceBlendDropdown.Step(-1);
  56. faceNextButton = new(">");
  57. faceNextButton.ControlEvent += (_, _) =>
  58. faceBlendDropdown.Step(1);
  59. faceListEnabled = CurrentFaceList.Count > 0;
  60. }
  61. private Dictionary<string, List<string>> CurrentFaceDict =>
  62. facePresetMode ? Constants.CustomFaceDict : Constants.FaceDict;
  63. private List<string> CurrentFaceGroupList =>
  64. facePresetMode ? Constants.CustomFaceGroupList : Constants.FaceGroupList;
  65. private string SelectedFaceGroup =>
  66. CurrentFaceGroupList[faceBlendCategoryDropdown.SelectedItemIndex];
  67. private List<string> CurrentFaceList =>
  68. CurrentFaceDict[SelectedFaceGroup];
  69. private int SelectedFaceIndex =>
  70. faceBlendDropdown.SelectedItemIndex;
  71. private string SelectedFace =>
  72. CurrentFaceList[SelectedFaceIndex];
  73. public override void Draw()
  74. {
  75. const float buttonHeight = 30;
  76. var arrowLayoutOptions = new[]
  77. {
  78. GUILayout.Width(buttonHeight),
  79. GUILayout.Height(buttonHeight),
  80. };
  81. const float dropdownButtonWidth = 153f;
  82. var dropdownLayoutOptions = new[]
  83. {
  84. GUILayout.Height(buttonHeight),
  85. GUILayout.Width(dropdownButtonWidth),
  86. };
  87. GUI.enabled = meidoManager.HasActiveMeido;
  88. faceBlendSourceGrid.Draw();
  89. MpsGui.WhiteLine();
  90. GUILayout.BeginHorizontal();
  91. prevCategoryButton.Draw(arrowLayoutOptions);
  92. faceBlendCategoryDropdown.Draw(dropdownLayoutOptions);
  93. nextCategoryButton.Draw(arrowLayoutOptions);
  94. GUILayout.EndHorizontal();
  95. GUILayout.BeginHorizontal();
  96. GUI.enabled = GUI.enabled && faceListEnabled;
  97. facePrevButton.Draw(arrowLayoutOptions);
  98. faceBlendDropdown.Draw(dropdownLayoutOptions);
  99. faceNextButton.Draw(arrowLayoutOptions);
  100. GUILayout.EndHorizontal();
  101. GUI.enabled = true;
  102. }
  103. protected override void ReloadTranslation()
  104. {
  105. updating = true;
  106. faceBlendSourceGrid.SetItems(Translation.GetArray("maidFaceWindow", TabTranslations));
  107. if (!facePresetMode)
  108. faceBlendCategoryDropdown.SetDropdownItems(
  109. Translation.GetArray("faceBlendCategory", Constants.FaceGroupList));
  110. updating = false;
  111. }
  112. private string[] UIFaceList() =>
  113. CurrentFaceList.Count is 0
  114. ? new[] { "No Face Presets" }
  115. : CurrentFaceList.Select(face => facePresetMode
  116. ? Path.GetFileNameWithoutExtension(face)
  117. : Translation.Get("faceBlendPresetsDropdown", face)).ToArray();
  118. private void OnPresetChange(object sender, PresetChangeEventArgs args)
  119. {
  120. if (args == PresetChangeEventArgs.Empty)
  121. {
  122. if (facePresetMode)
  123. {
  124. updating = true;
  125. faceBlendCategoryDropdown.SetDropdownItems(CurrentFaceGroupList.ToArray(), 0);
  126. faceBlendDropdown.SetDropdownItems(UIFaceList(), 0);
  127. updating = false;
  128. }
  129. }
  130. else
  131. {
  132. updating = true;
  133. faceBlendSourceGrid.SelectedItemIndex = 1;
  134. faceBlendCategoryDropdown.SetDropdownItems(
  135. CurrentFaceGroupList.ToArray(), CurrentFaceGroupList.IndexOf(args.Category));
  136. updating = false;
  137. faceBlendDropdown.SetDropdownItems(UIFaceList(), CurrentFaceList.IndexOf(args.Path));
  138. }
  139. }
  140. }