BetterOffsetterEditor.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using UnityEngine.UI;
  9. namespace TheraBytes.BetterUi.Editor
  10. {
  11. [CustomEditor(typeof(BetterOffsetter)), CanEditMultipleObjects]
  12. public class BetterOffsetterEditor : UnityEditor.Editor
  13. {
  14. InjectedSettingsInspector helper;
  15. void OnEnable()
  16. {
  17. helper = new InjectedSettingsInspector("Settings", serializedObject, "customSettings", "settingsFallback");
  18. helper.Register("Anchored Position X", "applyPosX",
  19. "customAnchorPosXSizers", "anchorPosXSizerFallback");
  20. helper.Register("Anchored Position Y", "applyPosY",
  21. "customAnchorPosYSizers", "anchorPosYSizerFallback");
  22. helper.RegisterSpace();
  23. helper.Register("Size Delta X", "applySizeX",
  24. "customSizeDeltaXSizers", "sizeDeltaXSizerFallback");
  25. helper.Register("Size Delta Y", "applySizeY",
  26. "customSizeDeltaYSizers", "sizeDeltaYSizerFallback");
  27. }
  28. public override void OnInspectorGUI()
  29. {
  30. helper.Draw();
  31. }
  32. [MenuItem("CONTEXT/RectTransform/♠ Add Better Offsetter", false)]
  33. public static void AddBetterOffsetter(MenuCommand command)
  34. {
  35. var ctx = command.context as RectTransform;
  36. AddBetterOffsetter(ctx);
  37. }
  38. private static BetterOffsetter AddBetterOffsetter(Transform transform)
  39. {
  40. var offsetter = transform.gameObject.AddComponent<BetterOffsetter>();
  41. while (UnityEditorInternal.ComponentUtility.MoveComponentUp(offsetter))
  42. { }
  43. if (transform.gameObject.GetComponent<BetterLocator>() != null)
  44. {
  45. UnityEditorInternal.ComponentUtility.MoveComponentDown(offsetter);
  46. }
  47. return offsetter;
  48. }
  49. [MenuItem("CONTEXT/RectTransform/♠ Add Better Offsetter", true)]
  50. public static bool CheckBetterOffsetter(MenuCommand command)
  51. {
  52. var ctx = command.context as RectTransform;
  53. return ctx.gameObject.GetComponent<BetterOffsetter>() == null;
  54. }
  55. [MenuItem("CONTEXT/SizeDeltaSizer/♠ Convert to Better Offsetter")]
  56. public static void ConvertToBetterOffsetter(MenuCommand command)
  57. {
  58. var ctx = command.context as SizeDeltaSizer;
  59. }
  60. public static void ConvertToBetterOffsetter(SizeDeltaSizer sizer)
  61. {
  62. var offsetter = sizer.gameObject.GetComponent<BetterOffsetter>();
  63. if (offsetter == null)
  64. {
  65. offsetter = AddBetterOffsetter(sizer.transform);
  66. }
  67. // size delta sizer fields
  68. var settingsCollectionField = sizer.GetType()
  69. .GetField("customSettings", BindingFlags.NonPublic | BindingFlags.Instance);
  70. var settingsCollection = settingsCollectionField.GetValue(sizer) as SizeDeltaSizer.SettingsConfigCollection;
  71. var settingsFallbackField = sizer.GetType()
  72. .GetField("settingsFallback", BindingFlags.NonPublic | BindingFlags.Instance);
  73. var settingsFallback = settingsFallbackField.GetValue(sizer) as SizeDeltaSizer.Settings;
  74. var sizeDeltaCollectionField = sizer.GetType()
  75. .GetField("customDeltaSizers", BindingFlags.NonPublic | BindingFlags.Instance);
  76. var sizeDeltaCollection = sizeDeltaCollectionField.GetValue(sizer) as Vector2SizeConfigCollection;
  77. var sizeDeltaFallbackField = sizer.GetType()
  78. .GetField("deltaSizerFallback", BindingFlags.NonPublic | BindingFlags.Instance);
  79. var sizeDeltaFallback = sizeDeltaFallbackField.GetValue(sizer) as Vector2SizeModifier;
  80. //offsetter fields
  81. var sizeXField = offsetter.GetType()
  82. .GetField("customSizeDeltaXSizers", BindingFlags.NonPublic | BindingFlags.Instance);
  83. var sizeXObj = sizeXField.GetValue(offsetter) as FloatSizeConfigCollection;
  84. var sizeYField = offsetter.GetType()
  85. .GetField("customSizeDeltaYSizers", BindingFlags.NonPublic | BindingFlags.Instance);
  86. var sizeYObj = sizeYField.GetValue(offsetter) as FloatSizeConfigCollection;
  87. var offsetterSettingsCollectionField = offsetter.GetType()
  88. .GetField("customSettings", BindingFlags.NonPublic | BindingFlags.Instance);
  89. var offsetterSettingsCollection = offsetterSettingsCollectionField.GetValue(offsetter) as BetterOffsetter.SettingsConfigCollection;
  90. var offsetterSettingsFallbackField = offsetter.GetType()
  91. .GetField("settingsFallback", BindingFlags.NonPublic | BindingFlags.Instance);
  92. var offsetterSizeXFallbackField = offsetter.GetType()
  93. .GetField("sizeDeltaXSizerFallback", BindingFlags.NonPublic | BindingFlags.Instance);
  94. var offsetterSizeYFallbackField = offsetter.GetType()
  95. .GetField("sizeDeltaYSizerFallback", BindingFlags.NonPublic | BindingFlags.Instance);
  96. foreach (var sizeDeltaSettings in settingsCollection.Items)
  97. {
  98. var deltaSizer = sizeDeltaCollection.GetItemForConfig(sizeDeltaSettings.ScreenConfigName, sizeDeltaFallback);
  99. CopyOverSizeDeltaSizerModifiers(sizeDeltaSettings, deltaSizer,
  100. out var offsetterSettings, out var sizeModX, out var sizeModY);
  101. offsetterSettingsCollection.AddItem(offsetterSettings);
  102. sizeXObj.AddItem(sizeModX);
  103. sizeYObj.AddItem(sizeModY);
  104. }
  105. // fallback
  106. {
  107. CopyOverSizeDeltaSizerModifiers(settingsFallback, sizeDeltaFallback,
  108. out var offsetterSettings, out var sizeModX, out var sizeModY);
  109. offsetterSettingsFallbackField.SetValue(offsetter, offsetterSettings);
  110. offsetterSizeXFallbackField.SetValue(offsetter, sizeModX);
  111. offsetterSizeYFallbackField.SetValue(offsetter, sizeModY);
  112. }
  113. GameObject.DestroyImmediate(sizer);
  114. }
  115. private static void CopyOverSizeDeltaSizerModifiers(
  116. SizeDeltaSizer.Settings sizeDeltaSettings,
  117. Vector2SizeModifier deltaSizer,
  118. out BetterOffsetter.Settings offsetterSettings,
  119. out FloatSizeModifier sizeXMod,
  120. out FloatSizeModifier sizeYMod)
  121. {
  122. offsetterSettings = new BetterOffsetter.Settings();
  123. offsetterSettings.ScreenConfigName = sizeDeltaSettings.ScreenConfigName;
  124. offsetterSettings.ApplySizeX = sizeDeltaSettings.ApplyWidth;
  125. offsetterSettings.ApplySizeY = sizeDeltaSettings.ApplyHeight;
  126. sizeXMod = new FloatSizeModifier(deltaSizer.OptimizedSize.x, deltaSizer.MinSize.x, deltaSizer.MaxSize.x)
  127. {
  128. ScreenConfigName = sizeDeltaSettings.ScreenConfigName
  129. };
  130. sizeYMod = new FloatSizeModifier(deltaSizer.OptimizedSize.y, deltaSizer.MinSize.y, deltaSizer.MaxSize.y)
  131. {
  132. ScreenConfigName = sizeDeltaSettings.ScreenConfigName
  133. };
  134. }
  135. }
  136. }