Пример #1
0
        protected override VisitStatus BeginContainer <TProperty, TContainer, TValue>(
            TProperty property,
            ref TContainer container,
            ref TValue value,
            ref ChangeTracker changeTracker)
        {
            // Root value
            if (container is PropertyWrapper <TValue> || value is PropertyWrapper <TValue> )
            {
                if (TryGetInspector(ref value, property, new PropertyPath(string.Empty), string.Empty,
                                    InspectorVisitLevel.Target))
                {
                    return(VisitStatus.Override);
                }

                PropertyContainer.Visit(ref value, this);

                return(VisitStatus.Override);
            }

            // Regular value
            var propName = property.GetName();

            AddToPath(propName);
            try
            {
                if (TryGetInspector(ref value, property, new PropertyPath(m_Path.ToString()), propName,
                                    InspectorVisitLevel.Field))
                {
                    return(VisitStatus.Override);
                }

                var foldout = GuiFactory.Foldout(property, ref container, ref value, VisitorContext);
                using (VisitorContext.MakeParentScope(foldout))
                {
                    PropertyContainer.Visit(ref value, this);
                }

                return(VisitStatus.Override);
            }
            finally
            {
                RemoveFromPath(propName);
            }
        }
Пример #2
0
        protected override VisitStatus BeginCollection <TProperty, TContainer, TValue>(
            TProperty property,
            ref TContainer container,
            ref TValue value, ref ChangeTracker changeTracker)
        {
            var propName = property.GetName();

            AddToPath(propName);
            try
            {
                if (container is PropertyWrapper <TValue> || value is PropertyWrapper <TValue> )
                {
                    GuiFactory.CollectionSizeField(property, ref container, ref value, VisitorContext);
                    for (int i = 0, count = property.GetCount(ref container); i < count; i++)
                    {
                        var callback             = new VisitCollectionElementCallback <TContainer>(this);
                        var elementChangeTracker = new ChangeTracker(changeTracker.VersionStorage);

                        property.GetPropertyAtIndex(ref container, i, ref elementChangeTracker, ref callback);

                        if (elementChangeTracker.IsChanged())
                        {
                            changeTracker.IncrementVersion <TProperty, TContainer, TValue>(property, ref container);
                        }
                    }

                    return(VisitStatus.Override);
                }

                if (typeof(TValue).IsClass && null == value)
                {
                    var nullElement = new NullElement <TValue>(property.GetName());
                    VisitorContext.Parent.contentContainer.Add(nullElement);

                    return(VisitStatus.Override);
                }

                var foldout = GuiFactory.Foldout(property, ref container, ref value, VisitorContext);

                using (VisitorContext.MakeParentScope(foldout))
                {
                    if (TryGetInspector(ref value, property, new PropertyPath(m_Path.ToString()), propName,
                                        InspectorVisitLevel.Field))
                    {
                        return(VisitStatus.Override);
                    }
                    GuiFactory.CollectionSizeField(property, ref container, ref value, VisitorContext);

                    for (int i = 0, count = property.GetCount(ref container); i < count; i++)
                    {
                        var callback             = new VisitCollectionElementCallback <TContainer>(this);
                        var elementChangeTracker = new ChangeTracker(changeTracker.VersionStorage);

                        property.GetPropertyAtIndex(ref container, i, ref elementChangeTracker, ref callback);

                        if (elementChangeTracker.IsChanged())
                        {
                            changeTracker.IncrementVersion <TProperty, TContainer, TValue>(property, ref container);
                        }
                    }
                }

                return(VisitStatus.Override);
            }
            finally
            {
                RemoveFromPath(propName);
            }
        }