public DataHelper( Type targetType, EditorLSDatabase sourceEditor, LSDatabase sourceDatabase, string displayName, string dataFieldName, SortInfo[] sorts, out bool valid) { Sorts = sorts; this.TargetType = targetType; SourceEditor = sourceEditor; this.DisplayName = displayName; SourceDatabase = sourceDatabase; _dataFieldName = dataFieldName; FieldInfo info = sourceDatabase.GetType().GetField(_dataFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (info == null) { Debug.Log(string.Format("Field with fieldName of {0} not found.", dataFieldName)); valid = false; return; } _getData = () => (DataItem[])info.GetValue(sourceDatabase); _setData = (value) => info.SetValue(sourceDatabase, value); if (Data == null) { Data = (DataItem[])Array.CreateInstance(TargetType, 0); } DataItemAttribute dataAttribute = (DataItemAttribute)Attribute.GetCustomAttribute(targetType, typeof(DataItemAttribute)); _dataAttribute = dataAttribute ?? new DataItemAttribute(); valid = true; }
public sealed override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (initialized == false) { Initialize(); } dataItemAttribute = dataItemAttribute ?? (DataItemAttribute)Attribute.GetCustomAttribute(LSEditorUtility.GetPropertyType(property), typeof(DataItemAttribute), false) ?? new DataItemAttribute(); ; Rect pos = position; pos.height = defaultPropertyHeight; serializedProperties.Clear(); float height = defaultPropertyHeight; string saveID = property.propertyPath; SerializedProperty nameProp = property.FindPropertyRelative("_name"); SerializedProperty iterationProperty = nameProp.Copy(); if (EditorLSDatabase.foldAll) { LSEditorUtility.SetPersistentFlag(saveID, false); } if (LSEditorUtility.PersistentFoldout(pos, nameProp.stringValue, saveID )) { pos.y += defaultPropertyHeight; if (dataItemAttribute.WritableName) { serializedProperties.Add(nameProp); } int beginningDepth = iterationProperty.depth; while (iterationProperty.NextVisible(true)) { if (iterationProperty.depth <= beginningDepth - 1) { //serializedProperties.RemoveAt(serializedProperties.Count - 1); break; } if (iterationProperty.depth > beginningDepth) { continue; } serializedProperties.Add(iterationProperty.Copy()); } pos.x += defaultPropertyHeight; pos.width -= defaultPropertyHeight; for (int i = 0; i < serializedProperties.Count; i++) { SerializedProperty curProp = serializedProperties[i]; float propertyHeight = EditorGUI.GetPropertyHeight(curProp, new GUIContent(), true); EditorGUI.PropertyField(pos, curProp, true); pos.y += propertyHeight; height += propertyHeight; } } LSEditorUtility.SetPersistentValue(saveID, height); }