public override PresentationResult OnInspectorGui(PresentationParamater parameter) { AnimationCurve animationCurve = parameter.Instance as AnimationCurve ?? new AnimationCurve(); EditorGUI.BeginChangeCheck(); AnimationCurve newAnimationCurve = EditorGUILayout.CurveField(parameter.Title, animationCurve); Change change = new Change(); change.IsDataChanged = EditorGUI.EndChangeCheck(); /* if (newAnimationCurve.length != animationCurve.length||newAnimationCurve.postWrapMode != animationCurve.postWrapMode || newAnimationCurve.preWrapMode != animationCurve.preWrapMode) * change.IsDataChanged = true; * else * { * for (int i = 0; i < newAnimationCurve.length; i++) * { * Keyframe keyFrame = animationCurve.keys[i]; * Keyframe newKeyFrame = newAnimationCurve.keys[i]; * change.IsDataChanged |= keyFrame.value != newKeyFrame.value; * change.IsDataChanged |= keyFrame.inTangent != newKeyFrame.inTangent; * change.IsDataChanged |= keyFrame.outTangent != newKeyFrame.outTangent; * change.IsDataChanged |= keyFrame.tangentMode != newKeyFrame.tangentMode; * change.IsDataChanged |= keyFrame.time != newKeyFrame.time; * } * }*/ return(new PresentationResult { Change = change, Result = newAnimationCurve }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { Object result = EditorGUILayout.ObjectField(parameter.Title, (Object)parameter.Instance, parameter.DataType, false); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = ((Object)parameter.Instance) != result } }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { string result = EditorGUILayout.TextField(parameter.Title, (string)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (string)parameter.Instance } }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { bool result = EditorGUILayout.Toggle(parameter.Title, (bool)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = ((bool)parameter.Instance) != result } }); }
protected virtual object CreateNewElement(PresentationParamater paramater, int index) { if (paramater.DataType.GetElementType().IsAbstract) { return(null); } if (paramater.DataType.GetElementType() == typeof(string)) { return(string.Empty); } return(Activator.CreateInstance(paramater.DataType.GetElementType())); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { string[] presentationItems = Enum.GetValues(parameter.DataType).Cast <Enum>().Select(val => { EnumPresentationAttribute attribute = val.GetAttribute <EnumPresentationAttribute>(); return(attribute != null ? attribute.DisplayName : val.ToString()); }).ToArray(); object result = Enum.GetValues(parameter.DataType) .GetValue(EditorGUILayout.Popup(parameter.Title, Enum.GetValues(parameter.DataType).Cast <Enum>().ToList().IndexOf((Enum)parameter.Instance), presentationItems)); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = !Equals((Enum)result, (Enum)parameter.Instance) } }); }
private PresentationResult OnCircularRefrence(PresentationParamater paramater) { GUIStyle guiStyle = new GUIStyle(); EditorGUILayout.BeginHorizontal(guiStyle); EditorGUILayout.LabelField(paramater.Title); bool isDataChanged = false; object result = null; if (GUILayout.Button("Add")) { result = Activator.CreateInstance(paramater.DataType); isDataChanged = true; } EditorGUILayout.EndHorizontal(); return(new PresentationResult { Change = new Change { IsDataChanged = isDataChanged }, Result = result }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { GUIStyle guiStyle = new GUIStyle(); Change change = new Change(); object presentationData = parameter.PresentationData; if (presentationData != null && !((presentationData) is ArrayPresentationData)) { presentationData = null; } ArrayPresentationData arrayPresentationData; if (presentationData != null) { arrayPresentationData = (ArrayPresentationData)presentationData; _isFoldout = arrayPresentationData.IsFoldout; } else { arrayPresentationData = new ArrayPresentationData(); } arrayPresentationData.IsFoldout = EditorGUILayout.Foldout(_isFoldout, parameter.Title); change.IsPresentationChanged |= arrayPresentationData.IsFoldout != _isFoldout; _isFoldout = arrayPresentationData.IsFoldout; EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); object data = parameter.Instance; if (data == null) { data = Array.CreateInstance(parameter.DataType.GetElementType(), 0); change.IsDataChanged = true; } Array arrayData = (Array)data; Initialize(arrayData, parameter); if (_isFoldout) { EditorGUILayout.BeginVertical(guiStyle); GUI.SetNextControlName(_sizeControlName); _elementSize = EditorGUILayout.IntField("Size", _elementSize); //Debug.Log(_elementSize); Event e = Event.current; if (e.keyCode == KeyCode.Return || GUI.GetNameOfFocusedControl() != _sizeControlName) { if (arrayData.Length != _elementSize) { Array newArray = Array.CreateInstance(parameter.DataType.GetElementType(), _elementSize); Presentation[] arrayElementPresentations = _arrayElementPresentations; _arrayElementPresentations = new Presentation[_elementSize]; for (int i = 0; i < newArray.Length; i++) { if (i >= arrayData.Length) { newArray.SetValue(CreateNewElement(parameter, i), i); } else { newArray.SetValue(arrayData.GetValue(i), i); } } arrayData = newArray; for (int i = 0; i < _arrayElementPresentations.Length; i++) { if (i >= arrayElementPresentations.Length) { _arrayElementPresentations[i] = parameter.FortInspector.GetResolver().Resolve(new PresentationResolverParameter(parameter.DataType.GetElementType(), arrayData.GetValue(i), new PresentationSite { Base = parameter.Instance, BasePresentation = this, BaseSite = parameter.PresentationSite, SiteType = PresentationSiteType.ArrayElement })); } else { _arrayElementPresentations[i] = arrayElementPresentations[i]; } } change.IsDataChanged = true; } } EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); EditorGUILayout.BeginVertical(guiStyle); object[] elementPresentationData = new object[_arrayElementPresentations.Length]; change.ChildrenChange = new Change[arrayData.Length]; for (int i = 0; i < arrayData.Length; i++) { PresentationParamater guiParameter = new PresentationParamater(arrayData.GetValue(i), arrayPresentationData.ElementPresentationData.Length > i ? arrayPresentationData.ElementPresentationData[i] : null, string.Format("Element {0}", i), parameter.DataType.GetElementType(), new PresentationSite { Base = arrayData, BasePresentation = this, BaseSite = parameter.PresentationSite, SiteType = PresentationSiteType.ArrayElement }, parameter.FortInspector); PresentationResult presentationResult = _arrayElementPresentations[i].OnInspectorGui(guiParameter); arrayData.SetValue(presentationResult.Result, i); change.ChildrenChange[i] = presentationResult.Change; elementPresentationData[i] = presentationResult.PresentationData; } arrayPresentationData.ElementPresentationData = elementPresentationData; EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } EditorGUILayout.EndHorizontal(); return(new PresentationResult { Result = arrayData, Change = change, PresentationData = arrayPresentationData }); }
public abstract PresentationResult OnInspectorGui(PresentationParamater parameter);
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { GUIStyle guiStyle = new GUIStyle(); if (_propertyInstanceResolver == null) { _propertyInstanceResolver = (IPropertyInstanceResolver) Activator.CreateInstance( parameter.PresentationSite.PropertyInfo.GetCustomAttribute <PropertyInstanceResolveAttribute> ().PropertyInstanceResolver); } Change change = new Change(); object presentationData = parameter.PresentationData; if (presentationData != null && !((presentationData) is PropertyResolvablePresentationData)) { presentationData = null; } PropertyResolvablePresentationData propertyResolvablePresentationData; if (presentationData != null) { propertyResolvablePresentationData = (PropertyResolvablePresentationData)presentationData; } else { propertyResolvablePresentationData = new PropertyResolvablePresentationData(); } bool oldFoldout = propertyResolvablePresentationData.IsFoldout; propertyResolvablePresentationData.IsFoldout = EditorGUILayout.Foldout(propertyResolvablePresentationData.IsFoldout, parameter.Title); change.IsPresentationChanged |= propertyResolvablePresentationData.IsFoldout != oldFoldout; object result = parameter.Instance; if (propertyResolvablePresentationData.IsFoldout) { InstanceResolverResult instanceResolverResult = _propertyInstanceResolver.ResolvePossibleData(parameter.PresentationSite.Base, parameter.Instance, parameter.PresentationSite.PropertyInfo); if (parameter.DataType.IsArray) { EditorGUILayout.BeginVertical(guiStyle); List <int> removedIndex = new List <int>(); object[] innerPresentationData = propertyResolvablePresentationData.PresentationDatas; if (innerPresentationData == null || innerPresentationData.Length == 0) { innerPresentationData = new object[instanceResolverResult.PresentableInstanceTokens.Length]; } object[] finalInnerPresentationData = new object[instanceResolverResult.PresentableInstanceTokens.Length]; for (int i = 0; i < instanceResolverResult.PresentableInstanceTokens.Length; i++) { finalInnerPresentationData[i] = i < innerPresentationData.Length ? innerPresentationData[i] : null; } object[] results = new object[instanceResolverResult.PresentableInstanceTokens.Length]; change.ChildrenChange = new Change[instanceResolverResult.PresentableInstanceTokens.Length]; for (int i = 0; i < instanceResolverResult.PresentableInstanceTokens.Length; i++) { EditorGUILayout.BeginVertical(guiStyle); EditorGUILayout.BeginHorizontal(guiStyle); EditorGUILayout.LabelField(instanceResolverResult.PresentableInstanceTokens[i].DisplayName); if (GUILayout.Button("-")) { removedIndex.Add(i); change.IsDataChanged = true; } EditorGUILayout.EndHorizontal(); if (instanceResolverResult.IsEditable) { PresentationSite presentationSite = new PresentationSite { BaseSite = parameter.PresentationSite, BasePresentation = this, Base = parameter.Instance, SiteType = PresentationSiteType.None }; Type elementType = instanceResolverResult.UseValueTypeForEdit ? instanceResolverResult.PresentableInstanceTokens[i].Value.GetType() : parameter.DataType.GetElementType(); Presentation presentation = parameter.FortInspector.GetResolver() .Resolve(new PresentationResolverParameter(elementType, instanceResolverResult.PresentableInstanceTokens[i].Value, presentationSite)); EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); EditorGUILayout.BeginVertical(guiStyle); PresentationResult presentationResult = presentation.OnInspectorGui( new PresentationParamater( instanceResolverResult.PresentableInstanceTokens[i].Value, finalInnerPresentationData[i], string.Format("Element {0}", i), elementType, presentationSite, parameter.FortInspector)); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); results[i] = presentationResult.Result; finalInnerPresentationData[i] = presentationResult.PresentationData; change.ChildrenChange[i] = presentationResult.Change; } EditorGUILayout.EndVertical(); } propertyResolvablePresentationData.PresentationDatas = finalInnerPresentationData; object addObject = null; if (instanceResolverResult.PossibleInstanceTokens.Length > 0) { int selectedIndex = EditorGUILayout.Popup("New Element", 0, new[] { "None" }.Concat( instanceResolverResult.PossibleInstanceTokens.Select(token => token.DisplayName)) .ToArray()); if (selectedIndex != 0) { addObject = instanceResolverResult.PossibleInstanceTokens[selectedIndex - 1].Value; change.IsDataChanged = true; } } int firstArraySize = parameter.Instance is Array ? ((Array)parameter.Instance).Length : 0; int arraySize = firstArraySize - removedIndex.Count + (addObject != null ? 1 : 0); result = parameter.Instance; if (result == null || arraySize != firstArraySize) { result = Array.CreateInstance(parameter.DataType.GetElementType(), arraySize); } Array array = (Array)result; int resultIndex = 0; for (int i = 0; i < instanceResolverResult.PresentableInstanceTokens.Length; i++) { if (removedIndex.Contains(i)) { continue; } array.SetValue(instanceResolverResult.PresentableInstanceTokens[i].Value, resultIndex); resultIndex++; } if (addObject != null) { array.SetValue(addObject, array.Length - 1); } EditorGUILayout.EndVertical(); } else { int selectedIndex = parameter.Instance == null || instanceResolverResult.PresentableInstanceTokens.Length == 0 ? 0 : instanceResolverResult.PossibleInstanceTokens.ToList().IndexOf(instanceResolverResult.PresentableInstanceTokens.Single()) + 1; EditorGUILayout.BeginHorizontal(guiStyle); GUILayout.Space(FortInspector.ItemSpacing); EditorGUILayout.BeginVertical(guiStyle); selectedIndex = EditorGUILayout.Popup("", selectedIndex, new[] { "None" }.Concat( instanceResolverResult.PossibleInstanceTokens.Select(token => token.DisplayName)) .ToArray()); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); if (selectedIndex == 0) { result = null; } else { result = instanceResolverResult.PossibleInstanceTokens[selectedIndex - 1].Value; } if (result != parameter.Instance) { change.IsDataChanged = true; } } } return(new PresentationResult { Result = result, Change = change, PresentationData = propertyResolvablePresentationData }); }
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 }); }
public override PresentationResult OnInspectorGui(PresentationParamater parameter) { if (parameter.DataType == typeof(byte)) { byte result = (byte)EditorGUILayout.IntField(parameter.Title, (byte)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (byte)parameter.Instance } }); } if (parameter.DataType == typeof(sbyte)) { sbyte result = (sbyte)EditorGUILayout.IntField(parameter.Title, (sbyte)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (sbyte)parameter.Instance } }); } if (parameter.DataType == typeof(short)) { short result = (short)EditorGUILayout.IntField(parameter.Title, (short)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (short)parameter.Instance } }); } if (parameter.DataType == typeof(ushort)) { ushort result = (ushort)EditorGUILayout.IntField(parameter.Title, (ushort)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (ushort)parameter.Instance } }); } if (parameter.DataType == typeof(int)) { int result = EditorGUILayout.IntField(parameter.Title, (int)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (int)parameter.Instance } }); } if (parameter.DataType == typeof(uint)) { uint result = (uint)EditorGUILayout.IntField(parameter.Title, (int)(uint)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (uint)parameter.Instance } }); } if (parameter.DataType == typeof(long)) { long result = EditorGUILayout.LongField(parameter.Title, (long)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (long)parameter.Instance } }); } if (parameter.DataType == typeof(ulong)) { ulong result = (ulong)EditorGUILayout.LongField(parameter.Title, (long)(ulong)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (ulong)parameter.Instance } }); } if (parameter.DataType == typeof(float)) { float result = EditorGUILayout.FloatField(parameter.Title, (float)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (float)parameter.Instance } }); } if (parameter.DataType == typeof(double)) { double result = EditorGUILayout.DoubleField(parameter.Title, (double)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (double)parameter.Instance } }); } if (parameter.DataType == typeof(decimal)) { decimal result = (decimal)EditorGUILayout.DoubleField(parameter.Title, (double)(decimal)parameter.Instance); return(new PresentationResult { Result = result, Change = new Change { IsDataChanged = result != (decimal)parameter.Instance } }); } throw new Exception("Invalid numeric type"); }