MaidPoseSelectorPane.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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;
  19. private bool poseListEnabled;
  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());
  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. this.customPoseMode = poseModeGrid.SelectedItemIndex == 1;
  54. this.previousPoseGroup = SelectedPoseGroup;
  55. this.poseListEnabled = CurrentPoseList.Count > 0;
  56. }
  57. protected override void ReloadTranslation()
  58. {
  59. this.poseModeGrid.SetItems(Translation.GetArray("posePane", tabTranslations));
  60. if (!customPoseMode)
  61. {
  62. this.poseGroupDropdown.SetDropdownItems(
  63. Translation.GetArray("poseGroupDropdown", Constants.PoseGroupList)
  64. );
  65. }
  66. }
  67. public override void Draw()
  68. {
  69. float arrowButtonSize = 30f;
  70. GUILayoutOption[] arrowLayoutOptions = {
  71. GUILayout.Width(arrowButtonSize),
  72. GUILayout.Height(arrowButtonSize)
  73. };
  74. float dropdownButtonHeight = arrowButtonSize;
  75. float dropdownButtonWidth = 153f;
  76. GUILayoutOption[] dropdownLayoutOptions = new GUILayoutOption[] {
  77. GUILayout.Height(dropdownButtonHeight),
  78. GUILayout.Width(dropdownButtonWidth)
  79. };
  80. GUI.enabled = meidoManager.HasActiveMeido && !meidoManager.ActiveMeido.Stop;
  81. this.poseModeGrid.Draw();
  82. MiscGUI.WhiteLine();
  83. GUILayout.BeginHorizontal();
  84. this.poseGroupLeftButton.Draw(arrowLayoutOptions);
  85. this.poseGroupDropdown.Draw(dropdownLayoutOptions);
  86. this.poseGroupRightButton.Draw(arrowLayoutOptions);
  87. GUILayout.EndHorizontal();
  88. GUILayout.BeginHorizontal();
  89. GUI.enabled = GUI.enabled && poseListEnabled;
  90. this.poseLeftButton.Draw(arrowLayoutOptions);
  91. this.poseDropdown.Draw(dropdownLayoutOptions);
  92. this.poseRightButton.Draw(arrowLayoutOptions);
  93. GUILayout.EndHorizontal();
  94. GUI.enabled = true;
  95. }
  96. public override void UpdatePane()
  97. {
  98. this.updating = true;
  99. PoseInfo poseInfo = this.meidoManager.ActiveMeido.CachedPose;
  100. bool oldPoseMode = customPoseMode;
  101. poseModeGrid.SelectedItemIndex = poseInfo.CustomPose ? 1 : 0;
  102. int poseGroupIndex = CurrentPoseGroupList.IndexOf(poseInfo.PoseGroup);
  103. if (poseGroupIndex < 0) poseGroupIndex = 0;
  104. int poseIndex = CurrentPoseDict[poseInfo.PoseGroup].IndexOf(poseInfo.Pose);
  105. if (poseIndex < 0) poseIndex = 0;
  106. if (oldPoseMode != customPoseMode)
  107. {
  108. string[] list = customPoseMode
  109. ? CurrentPoseGroupList.ToArray()
  110. : Translation.GetArray("poseGroupDropdown", CurrentPoseGroupList);
  111. this.poseGroupDropdown.SetDropdownItems(list);
  112. }
  113. this.poseGroupDropdown.SelectedItemIndex = poseGroupIndex;
  114. this.poseDropdown.SelectedItemIndex = poseIndex;
  115. this.updating = false;
  116. }
  117. private void SavePoseEnd(object sender, CustomPoseEventArgs args)
  118. {
  119. this.updating = true;
  120. this.poseModeGrid.SelectedItemIndex = 1;
  121. this.poseGroupDropdown.SetDropdownItems(
  122. CurrentPoseGroupList.ToArray(), CurrentPoseGroupList.IndexOf(args.Category)
  123. );
  124. this.updating = false;
  125. this.poseDropdown.SetDropdownItems(UIPoseList(), CurrentPoseDict[args.Category].IndexOf(args.Path));
  126. poseListEnabled = true;
  127. }
  128. private void SetPoseMode()
  129. {
  130. customPoseMode = poseModeGrid.SelectedItemIndex == 1;
  131. if (this.updating) return;
  132. string[] list = customPoseMode
  133. ? CurrentPoseGroupList.ToArray()
  134. : Translation.GetArray("poseGroupDropdown", CurrentPoseGroupList);
  135. this.poseGroupDropdown.SetDropdownItems(list, 0);
  136. }
  137. private void ChangePoseGroup()
  138. {
  139. if (previousPoseGroup == SelectedPoseGroup)
  140. {
  141. this.poseDropdown.SelectedItemIndex = 0;
  142. }
  143. else
  144. {
  145. previousPoseGroup = SelectedPoseGroup;
  146. this.poseDropdown.SetDropdownItems(UIPoseList(), 0);
  147. }
  148. }
  149. private void ChangePose()
  150. {
  151. if (!poseListEnabled || updating) return;
  152. meidoManager.ActiveMeido.SetPose(CurrentPoseInfo);
  153. }
  154. private string[] UIPoseList()
  155. {
  156. if (CurrentPoseList.Count == 0) return new[] { "No Poses" };
  157. else
  158. {
  159. return CurrentPoseList.Select((pose, i) =>
  160. {
  161. return $"{i + 1}:{(customPoseMode ? Path.GetFileNameWithoutExtension(pose) : pose)}";
  162. }).ToArray();
  163. }
  164. }
  165. }
  166. }