MaidPoseSelectorPane.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. namespace COM3D2.MeidoPhotoStudio.Plugin
  7. {
  8. internal class MaidPoseSelectorPane : BasePane
  9. {
  10. private MeidoManager meidoManager;
  11. private Button poseLeftButton;
  12. private Button poseRightButton;
  13. private Button poseGroupLeftButton;
  14. private Button poseGroupRightButton;
  15. private Dropdown poseGroupDropdown;
  16. private Dropdown poseDropdown;
  17. private SelectionGrid poseModeGrid;
  18. private bool customPoseMode = false;
  19. private bool poseListEnabled = true;
  20. private Dictionary<string, List<string>> CurrentPoseDict
  21. {
  22. get => customPoseMode ? Constants.CustomPoseDict : Constants.PoseDict;
  23. }
  24. private List<string> CurrentPoseGroupList
  25. {
  26. get => customPoseMode ? Constants.CustomPoseGroupList : Constants.PoseGroupList;
  27. }
  28. private string SelectedPoseGroup => CurrentPoseGroupList[poseGroupDropdown.SelectedItemIndex];
  29. private List<string> CurrentPoseList => CurrentPoseDict[SelectedPoseGroup];
  30. private int SelectedPoseIndex => poseDropdown.SelectedItemIndex;
  31. private string SelectedPose => CurrentPoseList[SelectedPoseIndex];
  32. private PoseInfo CurrentPoseInfo => new PoseInfo(SelectedPoseGroup, SelectedPose, customPoseMode);
  33. private string previousPoseGroup;
  34. private static readonly string[] tabTranslations = new[] { "baseTab", "customTab" };
  35. public MaidPoseSelectorPane(MeidoManager meidoManager)
  36. {
  37. Constants.customPoseChange += SavePoseEnd;
  38. this.meidoManager = meidoManager;
  39. this.poseModeGrid = new SelectionGrid(Translation.GetArray("posePane", tabTranslations));
  40. this.poseModeGrid.ControlEvent += (s, a) => SetPoseMode();
  41. this.poseGroupDropdown = new Dropdown(Translation.GetArray("poseGroupDropdown", Constants.PoseGroupList));
  42. this.poseGroupDropdown.SelectionChange += (s, a) => ChangePoseGroup();
  43. this.poseDropdown = new Dropdown(UIPoseList(Constants.PoseDict[Constants.PoseGroupList[0]]));
  44. this.poseDropdown.SelectionChange += (s, a) => ChangePose();
  45. this.poseGroupLeftButton = new Button("<");
  46. this.poseGroupLeftButton.ControlEvent += (s, a) => poseGroupDropdown.Step(-1);
  47. this.poseGroupRightButton = new Button(">");
  48. this.poseGroupRightButton.ControlEvent += (s, a) => poseGroupDropdown.Step(1);
  49. this.poseLeftButton = new Button("<");
  50. this.poseLeftButton.ControlEvent += (s, a) => poseDropdown.Step(-1);
  51. this.poseRightButton = new Button(">");
  52. this.poseRightButton.ControlEvent += (s, a) => poseDropdown.Step(1);
  53. previousPoseGroup = SelectedPoseGroup;
  54. }
  55. protected override void ReloadTranslation()
  56. {
  57. this.poseModeGrid.SetItems(Translation.GetArray("posePane", tabTranslations));
  58. if (!customPoseMode)
  59. {
  60. this.poseGroupDropdown.SetDropdownItems(
  61. Translation.GetArray("poseGroupDropdown", Constants.PoseGroupList)
  62. );
  63. }
  64. }
  65. public override void Draw()
  66. {
  67. float arrowButtonSize = 30f;
  68. GUILayoutOption[] arrowLayoutOptions = {
  69. GUILayout.Width(arrowButtonSize),
  70. GUILayout.Height(arrowButtonSize)
  71. };
  72. float dropdownButtonHeight = arrowButtonSize;
  73. float dropdownButtonWidth = 153f;
  74. GUILayoutOption[] dropdownLayoutOptions = new GUILayoutOption[] {
  75. GUILayout.Height(dropdownButtonHeight),
  76. GUILayout.Width(dropdownButtonWidth)
  77. };
  78. GUI.enabled = meidoManager.HasActiveMeido && !meidoManager.ActiveMeido.IsStop;
  79. this.poseModeGrid.Draw();
  80. MiscGUI.WhiteLine();
  81. GUILayout.BeginHorizontal();
  82. this.poseGroupLeftButton.Draw(arrowLayoutOptions);
  83. this.poseGroupDropdown.Draw(dropdownLayoutOptions);
  84. this.poseGroupRightButton.Draw(arrowLayoutOptions);
  85. GUILayout.EndHorizontal();
  86. GUILayout.BeginHorizontal();
  87. GUI.enabled = GUI.enabled && poseListEnabled;
  88. this.poseLeftButton.Draw(arrowLayoutOptions);
  89. this.poseDropdown.Draw(dropdownLayoutOptions);
  90. this.poseRightButton.Draw(arrowLayoutOptions);
  91. GUILayout.EndHorizontal();
  92. GUI.enabled = true;
  93. }
  94. public override void UpdatePane()
  95. {
  96. this.updating = true;
  97. PoseInfo poseInfo = this.meidoManager.ActiveMeido.CachedPose;
  98. bool oldPoseMode = customPoseMode;
  99. poseModeGrid.SelectedItemIndex = poseInfo.CustomPose ? 1 : 0;
  100. int poseGroupIndex = CurrentPoseGroupList.IndexOf(poseInfo.PoseGroup);
  101. if (poseGroupIndex < 0) poseGroupIndex = 0;
  102. int poseIndex = CurrentPoseDict[poseInfo.PoseGroup].IndexOf(poseInfo.Pose);
  103. if (poseIndex < 0) poseIndex = 0;
  104. if (oldPoseMode != customPoseMode)
  105. {
  106. string[] list = customPoseMode
  107. ? CurrentPoseGroupList.ToArray()
  108. : Translation.GetArray("poseGroupDropdown", CurrentPoseGroupList);
  109. this.poseGroupDropdown.SetDropdownItems(list);
  110. }
  111. this.poseGroupDropdown.SelectedItemIndex = poseGroupIndex;
  112. this.poseDropdown.SelectedItemIndex = poseIndex;
  113. this.updating = false;
  114. }
  115. private void SavePoseEnd(object sender, CustomPoseEventArgs args)
  116. {
  117. this.updating = true;
  118. this.poseModeGrid.SelectedItemIndex = 1;
  119. this.poseGroupDropdown.SetDropdownItems(
  120. CurrentPoseGroupList.ToArray(), CurrentPoseGroupList.IndexOf(args.Category)
  121. );
  122. this.updating = false;
  123. this.poseDropdown.SetDropdownItems(
  124. UIPoseList(CurrentPoseList), CurrentPoseDict[args.Category].IndexOf(args.Path)
  125. );
  126. }
  127. private void SetPoseMode()
  128. {
  129. customPoseMode = poseModeGrid.SelectedItemIndex == 1;
  130. if (this.updating) return;
  131. string[] list = customPoseMode
  132. ? CurrentPoseGroupList.ToArray()
  133. : Translation.GetArray("poseGroupDropdown", CurrentPoseGroupList);
  134. this.poseGroupDropdown.SetDropdownItems(list, 0);
  135. }
  136. private void ChangePoseGroup()
  137. {
  138. if (previousPoseGroup == SelectedPoseGroup)
  139. {
  140. this.poseDropdown.SelectedItemIndex = 0;
  141. }
  142. else
  143. {
  144. previousPoseGroup = SelectedPoseGroup;
  145. List<string> poseList = CurrentPoseList;
  146. poseListEnabled = true;
  147. if (poseList.Count == 0)
  148. {
  149. poseListEnabled = false;
  150. this.poseDropdown.SetDropdownItems(new[] { "No Poses" }, 0);
  151. }
  152. else
  153. {
  154. this.poseDropdown.SetDropdownItems(UIPoseList(CurrentPoseList), 0);
  155. }
  156. }
  157. }
  158. private void ChangePose()
  159. {
  160. if (!poseListEnabled || updating) return;
  161. meidoManager.ActiveMeido.SetPose(CurrentPoseInfo);
  162. }
  163. private string[] UIPoseList(IEnumerable<string> poseList)
  164. {
  165. return poseList.Select((pose, i) =>
  166. {
  167. return $"{i + 1}:{(customPoseMode ? Path.GetFileNameWithoutExtension(pose) : pose)}";
  168. }).ToArray();
  169. }
  170. }
  171. }