示例#1
0
        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
            });
        }