MaidPoseSelectorPane.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. namespace COM3D2.MeidoPhotoStudio.Plugin
  6. {
  7. public 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 string selectedPoseGroup;
  17. private int selectedPose;
  18. public MaidPoseSelectorPane(MeidoManager meidoManager)
  19. {
  20. this.meidoManager = meidoManager;
  21. List<string> poseGroups = new List<string>(Constants.PoseGroupList.Count);
  22. for (int i = 0; i < Constants.PoseGroupList.Count; i++)
  23. {
  24. string poseGroup = Constants.PoseGroupList[i];
  25. poseGroups.Add(i < Constants.CustomPoseGroupsIndex
  26. ? Translation.Get("poseGroupDropdown", poseGroup)
  27. : poseGroup
  28. );
  29. }
  30. this.poseGroupDropdown = new Dropdown(poseGroups.ToArray());
  31. this.poseGroupDropdown.SelectionChange += ChangePoseGroup;
  32. this.poseDropdown = new Dropdown(MakePoseList(Constants.PoseDict[Constants.PoseGroupList[0]]));
  33. this.poseDropdown.SelectionChange += ChangePose;
  34. this.poseGroupLeftButton = new Button("<");
  35. this.poseGroupLeftButton.ControlEvent += (s, a) => poseGroupDropdown.Step(-1);
  36. this.poseGroupRightButton = new Button(">");
  37. this.poseGroupRightButton.ControlEvent += (s, a) => poseGroupDropdown.Step(1);
  38. this.poseLeftButton = new Button("<");
  39. this.poseLeftButton.ControlEvent += (s, a) => poseDropdown.Step(-1);
  40. this.poseRightButton = new Button(">");
  41. this.poseRightButton.ControlEvent += (s, a) => poseDropdown.Step(1);
  42. }
  43. protected override void ReloadTranslation()
  44. {
  45. List<string> poseGroups = new List<string>(Constants.PoseGroupList.Count);
  46. for (int i = 0; i < Constants.PoseGroupList.Count; i++)
  47. {
  48. string poseGroup = Constants.PoseGroupList[i];
  49. poseGroups.Add(i < Constants.CustomPoseGroupsIndex
  50. ? Translation.Get("poseGroupDropdown", poseGroup)
  51. : poseGroup
  52. );
  53. }
  54. updating = true;
  55. this.poseGroupDropdown.SetDropdownItems(poseGroups.ToArray());
  56. updating = false;
  57. }
  58. private void ChangePoseGroup(object sender, EventArgs args)
  59. {
  60. if (updating) return;
  61. string newPoseGroup = Constants.PoseGroupList[this.poseGroupDropdown.SelectedItemIndex];
  62. if (selectedPoseGroup == newPoseGroup)
  63. {
  64. this.poseDropdown.SelectedItemIndex = 0;
  65. }
  66. else
  67. {
  68. selectedPoseGroup = newPoseGroup;
  69. if (this.poseGroupDropdown.SelectedItemIndex >= Constants.CustomPoseGroupsIndex)
  70. {
  71. this.poseDropdown.SetDropdownItems(MakePoseList(Constants.CustomPoseDict[selectedPoseGroup]), 0);
  72. }
  73. else
  74. {
  75. this.poseDropdown.SetDropdownItems(MakePoseList(Constants.PoseDict[selectedPoseGroup]), 0);
  76. }
  77. }
  78. }
  79. private void ChangePose(object sender, EventArgs args)
  80. {
  81. selectedPose = poseDropdown.SelectedItemIndex;
  82. if (updating) return;
  83. PoseInfo poseInfo = MakePoseInfo();
  84. meidoManager.ActiveMeido.SetPose(poseInfo);
  85. }
  86. private PoseInfo MakePoseInfo()
  87. {
  88. int poseGroup = this.poseGroupDropdown.SelectedItemIndex;
  89. int pose = this.poseDropdown.SelectedItemIndex;
  90. string poseName;
  91. if (this.poseGroupDropdown.SelectedItemIndex >= Constants.CustomPoseGroupsIndex)
  92. poseName = Constants.CustomPoseDict[selectedPoseGroup][selectedPose].Value;
  93. else
  94. poseName = Constants.PoseDict[selectedPoseGroup][selectedPose];
  95. return new PoseInfo(poseGroup, pose, poseName);
  96. }
  97. private string[] MakePoseList(IEnumerable<string> poseList)
  98. {
  99. return poseList.Select((pose, i) => $"{i + 1}:{pose}").ToArray();
  100. }
  101. private string[] MakePoseList(List<KeyValuePair<string, string>> poseList)
  102. {
  103. return poseList.Select((kvp, i) => $"{i + 1}:{kvp.Key}").ToArray();
  104. }
  105. public override void Update()
  106. {
  107. this.updating = true;
  108. PoseInfo poseInfo = this.meidoManager.ActiveMeido.poseInfo;
  109. this.poseGroupDropdown.SelectedItemIndex = poseInfo.PoseGroupIndex;
  110. this.poseDropdown.SelectedItemIndex = poseInfo.PoseIndex;
  111. this.updating = false;
  112. }
  113. public override void Draw(params GUILayoutOption[] layoutOptions)
  114. {
  115. float arrowButtonSize = 30;
  116. GUILayoutOption[] arrowLayoutOptions = {
  117. GUILayout.Width(arrowButtonSize),
  118. GUILayout.Height(arrowButtonSize)
  119. };
  120. float dropdownButtonHeight = arrowButtonSize;
  121. float dropdownButtonWidth = 153f;
  122. GUILayoutOption[] dropdownLayoutOptions = new GUILayoutOption[] {
  123. GUILayout.Height(dropdownButtonHeight),
  124. GUILayout.Width(dropdownButtonWidth)
  125. };
  126. GUI.enabled = meidoManager.HasActiveMeido && !meidoManager.ActiveMeido.IsStop;
  127. GUILayout.BeginHorizontal();
  128. this.poseGroupLeftButton.Draw(arrowLayoutOptions);
  129. this.poseGroupDropdown.Draw(dropdownLayoutOptions);
  130. this.poseGroupRightButton.Draw(arrowLayoutOptions);
  131. GUILayout.EndHorizontal();
  132. GUILayout.BeginHorizontal();
  133. this.poseLeftButton.Draw(arrowLayoutOptions);
  134. this.poseDropdown.Draw(dropdownLayoutOptions);
  135. this.poseRightButton.Draw(arrowLayoutOptions);
  136. GUILayout.EndHorizontal();
  137. }
  138. }
  139. }