public TypesPriorityGUI(string header, SerializedProperty property) { ScriptIcons.RetrieveFromScriptTypes(componentTypes); var typesProperty = property.FindPropertyRelative("types"); List = new ReorderableList(property.serializedObject, typesProperty); List.elementHeight += 1; if (header == null) { List.headerHeight = 1; } List.drawHeaderCallback = rect => { GUI.Label(rect, header); }; List.drawElementBackgroundCallback += (rect, index, active, focused) => { if (active || focused) { EditorGUI.DrawRect(rect, isProSkin ? new Color32(77, 77, 77, 255) : new Color32(174, 174, 174, 255)); } }; List.drawElementCallback = (rect, index, active, focused) => { if (miniPullDown == null) { miniPullDown = new GUIStyle("MiniPullDown") { fontSize = 11 }; var textColor = miniPullDown.normal.textColor; textColor.a = 0.9f; miniPullDown.normal.textColor = textColor; } var color = GUI.color; var mousePos = Event.current.mousePosition; var item = typesProperty.GetArrayElementAtIndex(index); var assemblyName = item.FindPropertyRelative("assemblyQualifiedName"); var fullName = item.FindPropertyRelative("fullName"); var isIgnored = item.FindPropertyRelative("isIgnored"); var displayName = fullName.stringValue; var hasName = !string.IsNullOrEmpty(displayName); if (hasName && !displayNames.TryGetValue(item, out displayName)) { displayName = fullName.stringValue.Replace("UnityEngine.", " "); displayNames[item] = displayName; } tempContent.text = hasName ? displayName : "None"; tempContent.image = ScriptIcons.GetIcon(fullName.stringValue); SetIconSize(new Vector2(16, 16)); rect.y += 2; EditorGUI.BeginChangeCheck(); var visibilityRect = new Rect(rect) { width = 20 }; var visibilityIcon = isIgnored.boolValue ? visibilityOff : visibilityOn; if (!isIgnored.boolValue) { GUI.color = new Color(1, 1, 1, 0.5f); } if (GUI.Button(visibilityRect, visibilityIcon, GUIStyle.none)) { isIgnored.boolValue = !isIgnored.boolValue; } GUI.color = color; rect.xMin += visibilityRect.width; if (GUI.Button(rect, tempContent, miniPullDown)) { var position = Event.current.mousePosition; position.y = rect.position.y + 35; position = GUIUtility.GUIToScreenPoint(position); var context = new SearchWindowContext(position); var popup = ScriptableObject.CreateInstance <TypeSearchPopup>(); popup.Initialize(componentTypes, type => { fullName.stringValue = type.FullName; assemblyName.stringValue = type.AssemblyQualifiedName; SaveChanges(); }); SearchWindow.Open(context, popup); } // PropertyField serialization doesn't work directly, something is totally wrong.. if (EditorGUI.EndChangeCheck()) { SaveChanges(); } }; List.onChangedCallback += _ => SaveChanges(); void SaveChanges() { // I've spent hours trying to figure why reordering/value change didn't trigger saving. // ApplyModifiedProperties on this array doesn't work unless you insert new element into it. // And this stupid fix makes it work! God save me. typesProperty.InsertArrayElementAtIndex(typesProperty.arraySize - 1); typesProperty.serializedObject.ApplyModifiedProperties(); typesProperty.DeleteArrayElementAtIndex(typesProperty.arraySize - 1); typesProperty.serializedObject.ApplyModifiedProperties(); onChange?.Invoke(); } }
public TypesPriorityGUI(string header, SerializedProperty property) { ScriptIcons.RetrieveFromScriptTypes(componentTypes); var typesProperty = property.FindPropertyRelative("types"); List = new ReorderableList(property.serializedObject, typesProperty); List.elementHeight += 1; if (header == null) { List.headerHeight = 1; } List.drawHeaderCallback = rect => { GUI.Label(rect, header); }; List.drawElementCallback = (rect, index, active, focused) => { rect.y += 2; var item = typesProperty.GetArrayElementAtIndex(index); var assemblyName = item.FindPropertyRelative("assemblyQualifiedName"); var name = item.FindPropertyRelative("fullName"); var displayName = name.stringValue; var hasName = !string.IsNullOrEmpty(displayName); if (miniPullDown == null) { miniPullDown = new GUIStyle("MiniPullDown") { fontSize = 11 }; var textColor = miniPullDown.normal.textColor; textColor.a = 0.9f; miniPullDown.normal.textColor = textColor; } if (hasName && !displayNames.TryGetValue(item, out displayName)) { displayName = name.stringValue.Replace("UnityEngine.", " "); displayNames[item] = displayName; } tempContent.text = hasName ? displayName : "None"; tempContent.image = ScriptIcons.GetIcon(name.stringValue); EditorGUIUtility.SetIconSize(new Vector2(16, 16)); if (GUI.Button(rect, tempContent, miniPullDown)) { var position = Event.current.mousePosition; position.y = rect.position.y + 35; position = GUIUtility.GUIToScreenPoint(position); var context = new SearchWindowContext(position); var popup = ScriptableObject.CreateInstance <TypeSearchPopup>(); popup.Initialize(componentTypes, type => { name.stringValue = type.FullName; assemblyName.stringValue = type.AssemblyQualifiedName; property.serializedObject.ApplyModifiedProperties(); }); SearchWindow.Open(context, popup); } }; List.onChangedCallback += _ => SaveChanges(); List.onReorderCallback += _ => SaveChanges(); void SaveChanges() { property.serializedObject.ApplyModifiedProperties(); onChange?.Invoke(); } }