MaidPoseSelectorPane.cs 6.4 KB

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