SplitterGUILayout.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using System.Linq;
  3. using System.Reflection;
  4. using UnityEngine;
  5. using UnityEditor;
  6. namespace LitMotion.Editor
  7. {
  8. internal static class SplitterGUILayout
  9. {
  10. static readonly BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
  11. static readonly Lazy<Type> splitterStateType = new(() =>
  12. {
  13. var type = typeof(EditorWindow).Assembly.GetTypes().First(x => x.FullName == "UnityEditor.SplitterState");
  14. return type;
  15. });
  16. static readonly Lazy<ConstructorInfo> splitterStateCtor = new(() =>
  17. {
  18. var type = splitterStateType.Value;
  19. return type.GetConstructor(flags, null, new Type[] { typeof(float[]), typeof(int[]), typeof(int[]) }, null);
  20. });
  21. static readonly Lazy<Type> splitterGUILayoutType = new(() =>
  22. {
  23. var type = typeof(EditorWindow).Assembly.GetTypes().First(x => x.FullName == "UnityEditor.SplitterGUILayout");
  24. return type;
  25. });
  26. static readonly Lazy<MethodInfo> beginVerticalSplit = new(() =>
  27. {
  28. var type = splitterGUILayoutType.Value;
  29. return type.GetMethod("BeginVerticalSplit", flags, null, new Type[] { splitterStateType.Value, typeof(GUILayoutOption[]) }, null);
  30. });
  31. static readonly Lazy<MethodInfo> endVerticalSplit = new(() =>
  32. {
  33. var type = splitterGUILayoutType.Value;
  34. return type.GetMethod("EndVerticalSplit", flags, null, Type.EmptyTypes, null);
  35. });
  36. public static object CreateSplitterState(float[] relativeSizes, int[] minSizes, int[] maxSizes)
  37. {
  38. return splitterStateCtor.Value.Invoke(new object[] { relativeSizes, minSizes, maxSizes });
  39. }
  40. public static void BeginVerticalSplit(object splitterState, params GUILayoutOption[] options)
  41. {
  42. beginVerticalSplit.Value.Invoke(null, new object[] { splitterState, options });
  43. }
  44. public static void EndVerticalSplit()
  45. {
  46. endVerticalSplit.Value.Invoke(null, Type.EmptyTypes);
  47. }
  48. }
  49. }