InjectedSettingsInspector.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using UnityEditor;
  7. using UnityEngine;
  8. namespace TheraBytes.BetterUi.Editor
  9. {
  10. public class InjectedSettingsInspector
  11. {
  12. class SettingsProperty
  13. {
  14. public GUIContent Label { get; set; }
  15. public string SettingsPropName { get; set; }
  16. }
  17. class CheckToSkipRest : SettingsProperty
  18. {
  19. public bool ValueToSkip { get; set; }
  20. }
  21. class CheckWithSizer : SettingsProperty
  22. {
  23. public string SizerFallbackName { get; set; }
  24. public SerializedProperty SizerFallback { get; set; }
  25. public SerializedProperty CustomSizers { get; set; }
  26. }
  27. class CheckWithProp : SettingsProperty
  28. {
  29. public string OtherSettingsPropertyName { get; set; }
  30. }
  31. string settingsName;
  32. SerializedObject serializedObject;
  33. SerializedProperty settingsFallback, settingsList;
  34. // key: fallback, value: customSizers
  35. List<SettingsProperty> allControls = new List<SettingsProperty>();
  36. public InjectedSettingsInspector(string settingsName, SerializedObject serializedObject,
  37. string settingsListName, string settingsFallbackName)
  38. {
  39. this.settingsName = settingsName;
  40. this.serializedObject = serializedObject;
  41. this.settingsList = serializedObject.FindProperty(settingsListName);
  42. this.settingsFallback = serializedObject.FindProperty(settingsFallbackName);
  43. }
  44. public void Register(string displayName, string settingsPropName)
  45. {
  46. var p = new SettingsProperty()
  47. {
  48. Label = new GUIContent(displayName),
  49. SettingsPropName = settingsPropName
  50. };
  51. allControls.Add(p);
  52. }
  53. public void Register(string displayName, string settingsBoolName, string otherSettingsPropertyName)
  54. {
  55. var p = new CheckWithProp()
  56. {
  57. Label = new GUIContent(displayName),
  58. SettingsPropName = settingsBoolName,
  59. OtherSettingsPropertyName = otherSettingsPropertyName
  60. };
  61. allControls.Add(p);
  62. }
  63. public void Register(string displayName, string settingsBoolName, string customSizersName, string sizerFallbackName)
  64. {
  65. var p = new CheckWithSizer()
  66. {
  67. Label = new GUIContent(displayName),
  68. SettingsPropName = settingsBoolName,
  69. SizerFallbackName = sizerFallbackName,
  70. CustomSizers = serializedObject.FindProperty(customSizersName),
  71. SizerFallback = serializedObject.FindProperty(sizerFallbackName),
  72. };
  73. allControls.Add(p);
  74. }
  75. public void RegisterSkipRest(string displayName, string settingsBoolName, bool valueToSkip)
  76. {
  77. var p = new CheckToSkipRest()
  78. {
  79. Label = new GUIContent(displayName),
  80. SettingsPropName = settingsBoolName,
  81. ValueToSkip = valueToSkip
  82. };
  83. allControls.Add(p);
  84. }
  85. public void RegisterSpace()
  86. {
  87. allControls.Add(null);
  88. }
  89. public void Draw()
  90. {
  91. ScreenConfigConnectionHelper.DrawGui("Settings", settingsList, ref settingsFallback, DrawSettings,
  92. AddSettings, DeleteSettings);
  93. }
  94. public void DrawSettings(string configName, SerializedProperty settings)
  95. {
  96. EditorGUILayout.BeginVertical("box");
  97. DrawControls(configName, settings);
  98. EditorGUILayout.EndVertical();
  99. }
  100. public void DrawControls(string configName, SerializedProperty settings)
  101. {
  102. foreach (var p in allControls)
  103. {
  104. if(p == null)
  105. {
  106. EditorGUILayout.Space();
  107. continue;
  108. }
  109. SerializedProperty prop = settings.FindPropertyRelative(p.SettingsPropName);
  110. if (p is CheckWithProp cwp)
  111. {
  112. EditorGUILayout.BeginHorizontal();
  113. EditorGUILayout.PropertyField(prop, p.Label);
  114. if (prop.boolValue)
  115. {
  116. SerializedProperty other = settings.FindPropertyRelative(cwp.OtherSettingsPropertyName);
  117. EditorGUILayout.PropertyField(other, GUIContent.none);
  118. }
  119. EditorGUILayout.EndHorizontal();
  120. }
  121. else
  122. {
  123. EditorGUILayout.PropertyField(prop, p.Label);
  124. if (p is CheckWithSizer cws)
  125. {
  126. if (prop.boolValue)
  127. {
  128. DrawSizer(configName, cws.SizerFallback, cws.CustomSizers);
  129. }
  130. }
  131. else if (p is CheckToSkipRest csr)
  132. {
  133. if (prop.boolValue == csr.ValueToSkip)
  134. return;
  135. EditorGUILayout.Space();
  136. }
  137. }
  138. }
  139. }
  140. private void DeleteSettings(string configName, SerializedProperty property)
  141. {
  142. foreach (var p in allControls.OfType<CheckWithSizer>())
  143. {
  144. int idx;
  145. SerializedProperty sizersProp = FindSizer(configName, null, p.CustomSizers, out idx);
  146. if (sizersProp != null)
  147. {
  148. SerializedProperty items = p.CustomSizers.FindPropertyRelative("items");
  149. items.DeleteArrayElementAtIndex(idx);
  150. }
  151. }
  152. }
  153. private void AddSettings(string configName, SerializedProperty property)
  154. {
  155. foreach (var p in allControls.OfType<CheckWithSizer>())
  156. {
  157. SerializedProperty sizersProp = FindSizer(configName, null, p.CustomSizers);
  158. if (sizersProp == null)
  159. {
  160. SerializedProperty items = p.CustomSizers.FindPropertyRelative("items");
  161. SerializedProperty fallback = p.SizerFallback;
  162. ScreenConfigConnectionHelper.AddSizerToList(configName, ref fallback, items);
  163. var configs = p.CustomSizers.GetValue<ISizeConfigCollection>();
  164. configs.MarkDirty();
  165. }
  166. }
  167. // after adding the fallback values are pointing somewhere because of copying of all properties
  168. RestoreSizerFallbackReferences();
  169. }
  170. void RestoreSizerFallbackReferences()
  171. {
  172. foreach(var p in allControls.OfType<CheckWithSizer>())
  173. {
  174. p.SizerFallback = serializedObject.FindProperty(p.SizerFallbackName);
  175. }
  176. }
  177. static void DrawSizer(string configName, SerializedProperty fallback, SerializedProperty customSizers)
  178. {
  179. EditorGUI.indentLevel++;
  180. SerializedProperty prop = FindSizer(configName, fallback, customSizers);
  181. if (prop != null)
  182. {
  183. EditorGUILayout.PropertyField(prop);
  184. }
  185. else
  186. {
  187. EditorGUILayout.HelpBox(string.Format("could not find sizer for config '{0}'", configName), MessageType.Error);
  188. }
  189. EditorGUI.indentLevel--;
  190. }
  191. static SerializedProperty FindSizer(string configName, SerializedProperty fallback, SerializedProperty customSizers)
  192. {
  193. int idx;
  194. return FindSizer(configName, fallback, customSizers, out idx);
  195. }
  196. static SerializedProperty FindSizer(string configName, SerializedProperty fallback, SerializedProperty customSizers, out int sizerIndex)
  197. {
  198. bool isFallback = !(ResolutionMonitor.Instance.OptimizedScreens.Any(o => o.Name == configName));
  199. sizerIndex = -1;
  200. if (isFallback)
  201. {
  202. return fallback;
  203. }
  204. else
  205. {
  206. SerializedProperty items = customSizers.FindPropertyRelative("items");
  207. for (int i = 0; i < items.arraySize; i++)
  208. {
  209. SerializedProperty prop = items.GetArrayElementAtIndex(i);
  210. SerializedProperty propConfig = prop.FindPropertyRelative("screenConfigName");
  211. if (propConfig.stringValue == configName)
  212. {
  213. sizerIndex = i;
  214. return prop;
  215. }
  216. }
  217. }
  218. return null;
  219. }
  220. }
  221. }