UIEffectProjectSettingsEditor.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using UnityEditor;
  2. using UnityEngine;
  3. using Coffee.UIEffectInternal;
  4. using UnityEditorInternal;
  5. namespace Coffee.UIEffects.Editors
  6. {
  7. [CustomEditor(typeof(UIEffectProjectSettings))]
  8. public class UIEffectProjectSettingsEditor : Editor
  9. {
  10. private ReorderableList _reorderableList;
  11. private SerializedProperty _useHDRColorPicker;
  12. private SerializedProperty _transformSensitivity;
  13. private bool _isInitialized;
  14. private ShaderVariantRegistryEditor _shaderVariantRegistryEditor;
  15. private void InitializeIfNeeded()
  16. {
  17. if (_isInitialized) return;
  18. _transformSensitivity = serializedObject.FindProperty("m_TransformSensitivity");
  19. _useHDRColorPicker = serializedObject.FindProperty("m_UseHDRColorPicker");
  20. var runtimePresets = serializedObject.FindProperty("m_RuntimePresets");
  21. _reorderableList = new ReorderableList(serializedObject, runtimePresets, true, true, true, true);
  22. _reorderableList.drawHeaderCallback = rect => EditorGUI.LabelField(rect, "Runtime Presets");
  23. _reorderableList.drawElementCallback = (rect, index, isActive, isFocused) =>
  24. {
  25. var element = _reorderableList.serializedProperty.GetArrayElementAtIndex(index);
  26. var effect = element.objectReferenceValue as UIEffect;
  27. rect.y += 2;
  28. rect.height = EditorGUIUtility.singleLineHeight;
  29. EditorGUI.BeginDisabledGroup(effect && effect.hideFlags == HideFlags.NotEditable);
  30. EditorGUI.PropertyField(rect, element, GUIContent.none);
  31. EditorGUI.EndDisabledGroup();
  32. };
  33. _reorderableList.onAddDropdownCallback = (rect, list) =>
  34. {
  35. var menu = new GenericMenu();
  36. foreach (var preset in UIEffectProjectSettings.LoadEditorPresets())
  37. {
  38. if (UIEffectProjectSettings.instance.m_RuntimePresets.Contains(preset)) continue;
  39. var path = UIEffectProjectSettings.GetPresetPath(preset);
  40. menu.AddItem(new GUIContent(path), false, x =>
  41. {
  42. UIEffectProjectSettings.RegisterRuntimePreset(x as UIEffect);
  43. }, preset);
  44. }
  45. menu.DropDown(rect);
  46. };
  47. _isInitialized = true;
  48. }
  49. private void OnDisable()
  50. {
  51. _isInitialized = false;
  52. }
  53. public override void OnInspectorGUI()
  54. {
  55. serializedObject.Update();
  56. InitializeIfNeeded();
  57. // Settings
  58. // Transform sensitivity.
  59. EditorGUILayout.PropertyField(_transformSensitivity);
  60. // Runtime Presets
  61. _reorderableList.DoLayoutList();
  62. // Editor
  63. // Use HDR color pickers.
  64. EditorGUILayout.PropertyField(_useHDRColorPicker);
  65. // Shader
  66. // Shader registry
  67. EditorGUILayout.Space();
  68. EditorGUILayout.LabelField("Shader", EditorStyles.boldLabel);
  69. if (_shaderVariantRegistryEditor == null)
  70. {
  71. var property = serializedObject.FindProperty("m_ShaderVariantRegistry");
  72. _shaderVariantRegistryEditor = new ShaderVariantRegistryEditor(property, "(UIEffect)");
  73. }
  74. _shaderVariantRegistryEditor.Draw();
  75. GUILayout.FlexibleSpace();
  76. serializedObject.ApplyModifiedProperties();
  77. }
  78. }
  79. }