optionselectormultistate.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. class OptionSelectorMultistate extends OptionSelector
  2. {
  3. protected bool m_CanSwitch;
  4. void OptionSelectorMultistate(Widget parent, int current_index, ScriptedWidgetEventHandler parent_c, bool disabled, notnull array<string> options)
  5. {
  6. m_CanSwitch = true;
  7. m_SelectorType = 2;
  8. m_Options = options;
  9. if (options.Count() == 0)
  10. {
  11. Error("Invalid OptionSelectorMultistate options");
  12. }
  13. if (current_index < 0 || current_index >= m_Options.Count())
  14. {
  15. m_SelectedOptionIndex = 0;
  16. }
  17. else
  18. {
  19. m_SelectedOptionIndex = current_index;
  20. }
  21. m_SelectedOption.SetText(m_Options.Get(m_SelectedOptionIndex));
  22. }
  23. static OptionSelectorMultistate NewFromAccess(Widget parent, ListOptionsAccess optionAccess, ScriptedWidgetEventHandler parent_c, bool disabled)
  24. {
  25. array<string> items = {};
  26. optionAccess.GetAllItemsText(items);
  27. return new OptionSelectorMultistate(parent, optionAccess.GetIndex(), parent_c, disabled, items);
  28. }
  29. void LoadNewValues(notnull array<string> options, int current_index)
  30. {
  31. m_Options = options;
  32. SetValue(current_index);
  33. }
  34. override void SetNextOption()
  35. {
  36. int idx = m_SelectedOptionIndex;
  37. idx++;
  38. if (idx >= m_Options.Count())
  39. {
  40. idx = 0;
  41. }
  42. m_AttemptOptionChange.Invoke(idx);
  43. if (m_CanSwitch)
  44. {
  45. PerformSetOption(idx);
  46. }
  47. }
  48. override void SetPrevOption()
  49. {
  50. int idx = m_SelectedOptionIndex;
  51. idx--;
  52. if (idx < 0)
  53. {
  54. idx = m_Options.Count() - 1;
  55. }
  56. m_AttemptOptionChange.Invoke(idx);
  57. if (m_CanSwitch)
  58. {
  59. PerformSetOption(idx);
  60. }
  61. }
  62. void PerformSetOption(int index)
  63. {
  64. m_SelectedOptionIndex = index;
  65. m_SelectedOption.SetText(m_Options.Get(index));
  66. m_OptionChanged.Invoke(index);
  67. }
  68. void SetCanSwitch(bool value)
  69. {
  70. m_CanSwitch = value;
  71. }
  72. bool CanSwitch()
  73. {
  74. return m_CanSwitch;
  75. }
  76. void SetValue(int value, bool fire_event = true)
  77. {
  78. if (value < m_Options.Count() && value >= 0)
  79. {
  80. m_SelectedOptionIndex = value;
  81. m_SelectedOption.SetText(m_Options.Get(m_SelectedOptionIndex));
  82. if (fire_event)
  83. m_OptionChanged.Invoke(m_SelectedOptionIndex);
  84. }
  85. }
  86. void SetValue(string value, bool fire_event = true)
  87. {
  88. int index = m_Options.Find(value);
  89. if (index >= 0)
  90. {
  91. m_SelectedOptionIndex = index;
  92. m_SelectedOption.SetText(m_Options.Get(m_SelectedOptionIndex));
  93. if (fire_event)
  94. m_OptionChanged.Invoke(m_SelectedOptionIndex);
  95. }
  96. }
  97. void SetRandomValue()
  98. {
  99. m_SelectedOptionIndex = Math.RandomInt(0, m_Options.Count());
  100. m_SelectedOption.SetText(m_Options.Get(m_SelectedOptionIndex));
  101. m_OptionChanged.Invoke(m_SelectedOptionIndex);
  102. }
  103. int GetValue()
  104. {
  105. return m_SelectedOptionIndex;
  106. }
  107. override void SetStringOption(string option, bool fire_event = true)
  108. {
  109. int index = m_Options.Find(option);
  110. if (index > -1)
  111. {
  112. m_SelectedOptionIndex = index;
  113. m_SelectedOption.SetText(m_Options.Get(m_SelectedOptionIndex));
  114. if (fire_event)
  115. m_OptionChanged.Invoke(m_SelectedOptionIndex);
  116. }
  117. }
  118. }
  119. class OptionSelectorMultistateCharacterMenu extends OptionSelectorMultistate
  120. {
  121. string class_name;
  122. string path = "cfgVehicles " + class_name + " displayName";
  123. string displayname;
  124. void OptionSelectorMultistateCharacterMenu(Widget parent, int current_index, ScriptedWidgetEventHandler parent_c, bool disabled, notnull array<string> options)
  125. {
  126. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  127. }
  128. void SetDisplayNameText(string value, string appendix)
  129. {
  130. path = "cfgVehicles " + class_name + " displayName";
  131. GetGame().ConfigGetText(path, displayname);
  132. if (value == "Male")
  133. {
  134. m_SelectedOption.SetText("#str_cfgvehicles_survivorM0");
  135. }
  136. else if (value == "Female")
  137. {
  138. m_SelectedOption.SetText("#str_cfgvehicles_survivorF0");
  139. }
  140. else if (appendix != "")
  141. {
  142. if (value == "")
  143. m_SelectedOption.SetText("NO ITEM - localization needed!");
  144. else
  145. m_SelectedOption.SetText("" + displayname + " " + appendix); //characters
  146. }
  147. else
  148. {
  149. m_SelectedOption.SetText(displayname);
  150. }
  151. }
  152. void SetTextSmart(string value)
  153. {
  154. if (value == "Male" || value == "Female")
  155. {
  156. SetDisplayNameText(value,"");
  157. return;
  158. }
  159. class_name = value;
  160. int index = m_Options.Find(value);
  161. if (InheritsFrom(class_name, "Clothing_Base"))
  162. {
  163. SetDisplayNameText(class_name,index.ToString());
  164. }
  165. else if (InheritsFrom(class_name,"SurvivorBase"))
  166. {
  167. if (InheritsFrom(class_name,"SurvivorMale_Base"))
  168. {
  169. SetDisplayNameText("#str_cfgvehicles_survivorM0",(m_SelectedOptionIndex + 1).ToString());
  170. }
  171. else if (InheritsFrom(class_name,"SurvivorFemale_Base"))
  172. {
  173. SetDisplayNameText("#str_cfgvehicles_survivorF0",(m_SelectedOptionIndex + 1).ToString());
  174. }
  175. }
  176. else
  177. {
  178. SetDisplayNameText(class_name,index.ToString());
  179. }
  180. }
  181. bool InheritsFrom(string value, string baseclass)
  182. {
  183. string child = value;
  184. string parent;
  185. while (GetGame().ConfigGetBaseName("cfgVehicles " + child, parent))
  186. {
  187. if (parent == baseclass)
  188. {
  189. return true;
  190. }
  191. child = parent;
  192. }
  193. return false;
  194. }
  195. override void SetNextOption()
  196. {
  197. super.SetNextOption();
  198. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  199. }
  200. override void SetPrevOption()
  201. {
  202. super.SetPrevOption();
  203. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  204. }
  205. override void SetValue(int value, bool fire_event = true)
  206. {
  207. super.SetValue(value,fire_event);
  208. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  209. }
  210. override void SetValue(string value, bool fire_event = true)
  211. {
  212. super.SetValue(value,fire_event);
  213. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  214. }
  215. override void SetRandomValue()
  216. {
  217. super.SetRandomValue();
  218. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  219. }
  220. override void SetStringOption(string option, bool fire_event = true)
  221. {
  222. super.SetStringOption(option, fire_event);
  223. SetTextSmart(m_Options.Get(m_SelectedOptionIndex));
  224. }
  225. }