public override PresentationResult OnInspectorGui(PresentationParamater parameter) { GUIStyle guiStyle = new GUIStyle(); //EditorGUILayout.BeginVertical(); if (parameter.PresentationSite != null && parameter.PresentationSite.Base != null && parameter.DataType == parameter.PresentationSite.Base.GetType() && parameter.Instance == null) { return(OnCircularRefrence(parameter)); } bool isRoot = string.IsNullOrEmpty(parameter.Title); if (parameter.Instance != null && _objectType == null) { _objectType = parameter.Instance.GetType(); } else { _objectType = parameter.DataType; } Initialize(); //bool isChanged = false; Change change = new Change(); object presentationData = parameter.PresentationData; ConcretePresentationData concretePresentationData; if (presentationData != null && !((presentationData) is ConcretePresentationData)) { presentationData = null; } if (presentationData != null) { concretePresentationData = (ConcretePresentationData)presentationData; _isFoldout = concretePresentationData.IsFoldout; } else { presentationData = concretePresentationData = new ConcretePresentationData { IsFoldout = _isFoldout }; } if (!isRoot) { /* if (_isFoldout) * { * GUILayout.Space(-10f); * }*/ concretePresentationData.IsFoldout = EditorGUILayout.Foldout(_isFoldout, parameter.Title); change.IsPresentationChanged |= _isFoldout != concretePresentationData.IsFoldout; _isFoldout = concretePresentationData.IsFoldout; /* EditorGUILayout.BeginHorizontal(); * GUILayoutUtility.GetRect(3f, 6f);*/ } object data = parameter.Instance; if (data == null) { data = Activator.CreateInstance(_objectType); change.IsDataChanged = true; } if (isRoot || _isFoldout) { change.ChildrenChange = new Change[_presentationFieldInfos.Length]; int i = 0; foreach (PresentationField presentationField in _presentationFieldInfos) { EditorGUILayout.BeginHorizontal(guiStyle); if (!isRoot) { GUILayout.Space(FortInspector.ItemSpacing); } else { GUILayout.Space(0f); } EditorGUILayout.BeginVertical(guiStyle); if (!concretePresentationData.InnerPresentationData.ContainsKey(presentationField.PropertyInfo.Name)) { concretePresentationData.InnerPresentationData[presentationField.PropertyInfo.Name] = null; } object objectData = presentationField.PropertyInfo.GetValue(data, new object[0]); PresentationSite presentationSite = new PresentationSite { BasePresentation = this, Base = parameter.Instance, BaseSite = parameter.PresentationSite, PropertyInfo = presentationField.PropertyInfo, SiteType = PresentationSiteType.Property }; if (presentationField.Presentation == null) { PresentationResolverParameter resolverParameter = new PresentationResolverParameter(presentationField.PropertyInfo.PropertyType, objectData, presentationSite); presentationField.Presentation = parameter.FortInspector.GetResolver().Resolve(resolverParameter); } //PresentationParamater PresentationTitleAttribute presentationTitleAttribute = presentationField.PropertyInfo.GetCustomAttribute <PresentationTitleAttribute>(); string title = presentationTitleAttribute == null ? CamelCaseSplit.SplitCamelCase(presentationField.PropertyInfo.Name) : presentationTitleAttribute.Title; PresentationResult presentationResult = presentationField.Presentation.OnInspectorGui( new PresentationParamater(presentationField.PropertyInfo.GetValue(data, new object[0]), concretePresentationData.InnerPresentationData[presentationField.PropertyInfo.Name], title, presentationField.PropertyInfo.PropertyType, presentationSite, parameter.FortInspector)); presentationField.PropertyInfo.SetValue(data, presentationResult.Result, new object[0]); change.ChildrenChange[i] = presentationResult.Change; concretePresentationData.InnerPresentationData[presentationField.PropertyInfo.Name] = presentationResult.PresentationData; i++; EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } } if (!isRoot) { //EditorGUILayout.EndHorizontal(); } //EditorGUILayout.EndVertical(); return(new PresentationResult { Result = data, Change = change, PresentationData = presentationData }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { GUIStyle guiStyle = new GUIStyle(); AbstractConcretePresentationData presentationData = parameter.PresentationData as AbstractConcretePresentationData ?? new AbstractConcretePresentationData(); Change change = new Change(); bool isFoldout = presentationData.IsFoldout; presentationData.IsFoldout = EditorGUILayout.Foldout(presentationData.IsFoldout, parameter.Title); change.IsPresentationChanged = isFoldout != presentationData.IsFoldout; object data = parameter.Instance; if (presentationData.IsFoldout) { Type[] possibleTypes; AbstractTypeChildResolverAttribute abstractTypeChildResolverAttribute = parameter.DataType.GetCustomAttribute <AbstractTypeChildResolverAttribute>(); if (abstractTypeChildResolverAttribute != null) { IAbstractTypeChildResolver abstractTypeChildResolver = (IAbstractTypeChildResolver) Activator.CreateInstance(abstractTypeChildResolverAttribute.ChildResolverType); possibleTypes = abstractTypeChildResolver.ResolveChildrenType(parameter.DataType, ResolvePresentationSiteProperties(parameter.PresentationSite)); } else { possibleTypes = TypeHelper.GetAllTypes(AllTypeCategory.Game) .Where(type => parameter.DataType.IsAssignableFrom(type) && !type.IsAbstract) .ToArray(); } int selectedIndex = 0; if (parameter.Instance != null) { selectedIndex = possibleTypes.ToList().IndexOf(parameter.Instance.GetType()) + 1; } EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); EditorGUILayout.BeginVertical(guiStyle); selectedIndex = EditorGUILayout.Popup("Class Type", selectedIndex, new[] { "None" }.Concat(possibleTypes.Select(type => { PresentationTitleAttribute presentationTitleAttribute = type.GetCustomAttribute <PresentationTitleAttribute>(); return(presentationTitleAttribute == null ? CamelCaseSplit.SplitCamelCase(type.Name) : presentationTitleAttribute.Title); })).ToArray()); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); object oldData = data; bool changed = false; if (selectedIndex > 0) { if (data == null || data.GetType() != possibleTypes[selectedIndex - 1]) { data = Activator.CreateInstance(possibleTypes[selectedIndex - 1]); changed = true; } } else { data = null; } if (data != oldData) { change.IsDataChanged = true; } //object presentationData = parameter.PresentationData; if (data != null) { PresentationSite presentationSite = new PresentationSite { BaseSite = parameter.PresentationSite, BasePresentation = this, Base = parameter.Instance, SiteType = PresentationSiteType.None }; if (_presentation == null || changed) { _presentation = parameter.FortInspector.GetResolver() .Resolve(new PresentationResolverParameter(possibleTypes[selectedIndex - 1], data, presentationSite)); } EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); EditorGUILayout.BeginVertical(guiStyle); PresentationResult presentationResult = _presentation.OnInspectorGui(new PresentationParamater(data, presentationData.InnerPresentationData, string.Empty, possibleTypes[selectedIndex - 1], presentationSite, parameter.FortInspector)); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); presentationData.InnerPresentationData = presentationResult.PresentationData; data = presentationResult.Result; change.ChildrenChange = new[] { presentationResult.Change }; } } return(new PresentationResult { Change = change, PresentationData = presentationData, Result = data }); }