MaidPoseSelectorPane.cs 6.4 KB

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