void OnEnable() { _author = Persistent <string> .At(AuthorPath); _urlField = serializedObject.FindProperty("_url"); _exportFields = serializedObject.FindProperty("_exportFields"); _exportList = new KReorderableList(serializedObject, _exportFields, "Configurations", IconCache.Get("gear").Texture); float lineHeight = EditorGUIUtility.singleLineHeight; float vSpacing = EditorGUIUtility.standardVerticalSpacing; var exporter = target as JsonExporterData; _exportList.List.elementHeightCallback = ( int index ) => { var element = _exportFields.GetArrayElementAtIndex(index); var firstLine = lineHeight + vSpacing; var reference = element.FindPropertyRelative("_reference"); if (!element.isExpanded) { return(firstLine); } if (reference.objectReferenceValue == null) { return(firstLine); } var data = (JsonFieldDefinition)reference.objectReferenceValue; SerializedObject so = new SerializedObject(data); var p = so.FindProperty("_definition"); var edit = ExportFieldUtility.CalculateHeight(p, lineHeight); var inspect = so.FindProperty("_inspect"); var inspectionSize = 0f; if (!inspect.boolValue) { inspectionSize = lineHeight; } else { var minHeight = lineHeight; var serialization = p.FindPropertyRelative("_serialization"); var serType = (EFieldSerializationType)serialization.enumValueIndex; if (serType == EFieldSerializationType.ToArray) { minHeight = 3 * lineHeight; } var inspectedElement = so.FindProperty("_inspectedElement"); var lines = 1; try { var oRef = data.Definition.RootObject; var type = oRef.GetType(); var inspectionText = JsonFieldDefinitionEditor.GetInspectionText(data.Definition, type, oRef, serType, inspectedElement); lines = inspectionText.Count((c) => c == '\n') + 1; } catch { } inspectionSize = Mathf.Max((lineHeight - 2.5f) * lines, minHeight); } return(firstLine + edit + inspectionSize); }; _exportList.List.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { var firstLineRect = rect.RequestTop(lineHeight); var element = _exportFields.GetArrayElementAtIndex(index); var selected = element.FindPropertyRelative("_selected"); var batchSize = element.FindPropertyRelative("_batch"); var reference = element.FindPropertyRelative("_reference"); var data = (JsonFieldDefinition)reference.objectReferenceValue; var w = firstLineRect.width / 3; element.isExpanded = EditorGUI.Foldout(firstLineRect.RequestLeft(w).RequestRight(w - 12), element.isExpanded, data?.Definition?.FieldName ?? "*********", true); firstLineRect = firstLineRect.CutLeft(w); selected.boolValue = EditorGUI.ToggleLeft(firstLineRect.RequestLeft(16), "", selected.boolValue); var r = firstLineRect.CutLeft(16); var soRect = r; if (reference.objectReferenceValue is JsonFieldDefinition jsd && jsd.Definition.ShowBatchSize) { var batchRect = r.RequestLeft(60); soRect = soRect.CutLeft(62); EditorGUI.LabelField(batchRect, batchSize.intValue == 0 ? "(∞)batch" : "batch", K10GuiStyles.unitStyle); batchSize.intValue = Mathf.Max(EditorGUI.IntField(batchRect, batchSize.intValue), 0); } ScriptableObjectField.Draw <JsonFieldDefinition>(soRect, reference, "Assets/[_Configurations_]/ExportFields/"); if (element.isExpanded && reference.objectReferenceValue != null) { SerializedObject so = new SerializedObject(data); var p = so.FindProperty("_definition"); var edit = ExportFieldUtility.CalculateHeight(p, lineHeight); rect = rect.CutTop(lineHeight + vSpacing); data.Definition.DrawElement(p, rect.RequestTop(edit), lineHeight, null); var inspectionRect = rect.CutTop(edit); var inspectionTextRect = inspectionRect.CutLeft(32); var inspectionFieldsRect = inspectionRect.RequestLeft(32); var inspect = so.FindProperty("_inspect"); var inspectChange = IconButton.Draw(inspectionFieldsRect.RequestTop(lineHeight), inspect.boolValue ? "spy" : "visibleOff"); var inspectionText = ""; if (inspect.boolValue && data.Definition != null) { var count = 0; var serialization = p.FindPropertyRelative("_serialization"); var serType = (EFieldSerializationType)serialization.enumValueIndex; var oRef = data.Definition.RootObject; if (serType == EFieldSerializationType.ToArray) { var enu = oRef as System.Collections.IEnumerable; if (enu != null) { foreach (var o in enu) { count++; } } } var inspectedElement = so.FindProperty("_inspectedElement"); if (count > 0) { var fieldsModRect = inspectionFieldsRect.CutTop(lineHeight); inspectedElement.intValue = EditorGUI.IntField(fieldsModRect.RequestTop(lineHeight), inspectedElement.intValue); bool canGoUp = inspectedElement.intValue < (count - 1); var btsRect = fieldsModRect.CutTop(lineHeight).RequestTop(lineHeight); EditorGUI.BeginDisabledGroup(!canGoUp); var up = IconButton.Draw(btsRect.VerticalSlice(1, 2), "upTriangle", '▲', "", Color.white); EditorGUI.EndDisabledGroup(); bool canGoDown = inspectedElement.intValue > 0; EditorGUI.BeginDisabledGroup(!canGoDown); var down = IconButton.Draw(btsRect.VerticalSlice(0, 2), "downTriangle", '▼', "", Color.white); EditorGUI.EndDisabledGroup(); if (up) { inspectedElement.intValue++; } if (down) { inspectedElement.intValue--; } inspectedElement.intValue = Mathf.Max(inspectedElement.intValue, 0); } var type = oRef.GetType(); inspectionText = JsonFieldDefinitionEditor.GetInspectionText(data.Definition, type, oRef, serType, inspectedElement); } if (inspectChange) { inspect.boolValue = !inspect.boolValue; } EditorGUI.TextArea(inspectionTextRect, inspectionText); if (GUI.changed) { so.ApplyModifiedProperties(); } } }; }