Esempio n. 1
0
 protected override InspectorPropertyInfo[] GetPropertyInfos()
 {
     return(new InspectorPropertyInfo[]
     {
         InspectorPropertyInfo.CreateValue("x", 0, this.Property.ValueEntry.SerializationBackend,
                                           new GetterSetter <Vector3Int, int>(
                                               getter: (ref Vector3Int vec) => vec.x,
                                               setter: (ref Vector3Int vec, int value) => vec.x = value)),
         InspectorPropertyInfo.CreateValue("y", 0, this.Property.ValueEntry.SerializationBackend,
                                           new GetterSetter <Vector3Int, int>(
                                               getter: (ref Vector3Int vec) => vec.y,
                                               setter: (ref Vector3Int vec, int value) => vec.y = value)),
         InspectorPropertyInfo.CreateValue("z", 0, this.Property.ValueEntry.SerializationBackend,
                                           new GetterSetter <Vector3Int, int>(
                                               getter: (ref Vector3Int vec) => vec.z,
                                               setter: (ref Vector3Int vec, int value) => vec.z = value)),
     });
 }
        public NodePortInfo CreateLooseDynamicPortInfo(NodePort port, out InspectorPropertyInfo info, out InspectorPropertyInfo portInfo, params Attribute[] attributes)
        {
            info = InspectorPropertyInfo.CreateValue(
                port.fieldName,
                1,
                Property.ValueEntry.SerializationBackend,
                new GetterSetter <TValue, int>(
                    ( ref TValue owner ) => 0,
                    (ref TValue owner, int value) => { }
                    ),
                attributes
                );

            portInfo = InspectorPropertyInfo.CreateValue(
                $"{info.PropertyName}:port",
                0,
                Property.ValueEntry.SerializationBackend,
                new GetterSetter <TValue, NodePort>(
                    ( ref TValue owner ) => port,
                    (ref TValue owner, NodePort value) => { }
                    )
                , new HideInInspector()
                );

            // Create a fake property and a fake node
            NodePortInfo nodePortInfo = new NodePortInfo(
                portInfo,
                info,
                port.fieldName,
                port.ValueType,
                Property.Tree.WeakTargets.FirstOrDefault() as Node,                 // Needed?
                ShowBackingValue.Never,
                port.connectionType,
                port.typeConstraint,
                false,
                true,
                port.IsInput,
                false
                );

            return(nodePortInfo);
        }
        protected override void Initialize()
        {
            // Port is already resolved for the base
            var parent = Property.ParentValueProperty;

#if ODIN_INSPECTOR_3
            if (parent == null)
            {
                parent = Property.Tree.RootProperty;
            }
#else
            if (parent == null)
            {
                parent = Property.Tree.SecretRootProperty;
            }
#endif

            portResolver = parent.ChildResolver as INodePortResolver;
            nodePortInfo = portResolver.GetNodePortInfo(Property.Name);

            UpdateDynamicPorts();

            fakeListInfo = InspectorPropertyInfo.CreateValue(
                NodePropertyPort.NodePortListPropertyName,
                0,
                Property.ValueEntry.SerializationBackend,
                new GetterSetter <TValue, List <TValue> >(
                    GetDynamicPorts,
                    (ref TValue owner, List <TValue> value) => { }
                    ),
                Property.Attributes
                .Where(x =>
                       x is ListDrawerSettingsAttribute ||
                       x is NodePortAttribute ||
                       x is ShowDrawerChainAttribute ||
                       x is ShowPropertyResolverAttribute
                       )
                .ToArray()
                );
        }
    public override void ProcessMemberProperties(List <InspectorPropertyInfo> propertyInfos)
    {
        var val = (BetterEventEntry)this.Property.ValueEntry.WeakSmartValue;

        if (val.Delegate == null)
        {
            return;
        }
        if (val.Delegate.Method == null)
        {
            return;
        }

        var ps = val.Delegate.Method.GetParameters();

        for (int i = 0; i < ps.Length; i++)
        {
            var p = ps[i];
            var getterSetterType = typeof(ArrayIndexGetterSetter <>).MakeGenericType(p.ParameterType);
            var getterSetter     = Activator.CreateInstance(getterSetterType, new object[] { this.Property, i }) as IValueGetterSetter;
            var info             = InspectorPropertyInfo.CreateValue(p.Name, i, SerializationBackend.Odin, getterSetter);
            propertyInfos.Add(info);
        }
    }
        protected InspectorPropertyInfo[] GetPropertyInfos()
        {
            if (this.processors == null)
            {
                this.processors = OdinPropertyProcessorLocator.GetMemberProcessors(this.Property);
            }

            var includeSpeciallySerializedMembers = this.Property.ValueEntry.SerializationBackend != SerializationBackend.Unity;
            var infos = InspectorPropertyInfoUtility.CreateMemberProperties(this.Property, typeof(TValue), includeSpeciallySerializedMembers);

            // If we resolve the ports from the port dictionary i might be able to communicate between properties
            // in order to make dynamic port adding cleaner

            // Resolve my own members so I can see them
#if DEBUG_RESOLVER
            infos.AddValue(
                $"resolver:{nameof(infos)}",
                () => this.infos,
                value => { }
                );

            infos.AddValue(
                $"resolver:{nameof( namesToIndex )}",
                () => this.namesToIndex,
                value => { }
                );

            infos.AddValue(
                $"resolver:{nameof( nameToNodePropertyInfo )}",
                () => this.nameToNodePropertyInfo,
                value => { }
                );

            infos.AddValue(
                $"resolver:{nameof( propertyToNodeProperty )}",
                () => this.propertyToNodeProperty,
                value => { }
                );
#endif

            LabelWidthAttribute labelWidthAttribute = Property.GetAttribute <LabelWidthAttribute>();
            displayDynamicPortsAttribute = Property.GetAttribute <DisplayDynamicPortsAttribute>();

            // Port makers
            {
                for (int i = 0; i < infos.Count; ++i)
                {
                    var info = infos[i];
                    if (labelWidthAttribute != null)
                    {
                        if (info.GetAttribute <LabelWidthAttribute>() == null)
                        {
                            info.GetEditableAttributesList().Add(labelWidthAttribute);
                        }
                    }

                    var inputAttribute  = info.GetMemberInfo().GetAttribute <InputAttribute>();
                    var outputAttribute = info.GetMemberInfo().GetAttribute <OutputAttribute>();
                    if (inputAttribute != null || outputAttribute != null)                       // Make a port.... we'll deal with dynamic later
                    {
                        string           baseFieldName     = info.PropertyName;
                        NodePort         port              = Node.GetPort(info.PropertyName);
                        ShowBackingValue showBackingValue  = ShowBackingValue.Always;
                        ConnectionType   connectionType    = ConnectionType.Multiple;
                        TypeConstraint   typeConstraint    = TypeConstraint.None;
                        bool             isDynamicPortList = false;
                        bool             isInput           = false;

                        if (inputAttribute != null)
                        {
                            showBackingValue  = inputAttribute.backingValue;
                            connectionType    = inputAttribute.connectionType;
                            typeConstraint    = inputAttribute.typeConstraint;
                            isDynamicPortList = inputAttribute.dynamicPortList;
                            isInput           = true;
                        }
                        else if (outputAttribute != null)
                        {
                            showBackingValue  = outputAttribute.backingValue;
                            connectionType    = outputAttribute.connectionType;
                            typeConstraint    = outputAttribute.typeConstraint;
                            isDynamicPortList = outputAttribute.dynamicPortList;
                            isInput           = false;
                        }

                        // The port didn't exist... let's just make it exist again?
                        if (port == null)
                        {
                            Node.UpdatePorts();
                            port = Node.GetPort(info.PropertyName);
                        }

                        var portInfo = InspectorPropertyInfo.CreateValue(
                            $"{info.PropertyName}:port",
                            0,
                            Property.ValueEntry.SerializationBackend,
                            new GetterSetter <TValue, NodePort>(
                                ( ref TValue owner ) => port,
                                (ref TValue owner, NodePort value) => { }
                                )
                            , new HideInInspector()
                            );

                        var nodePortInfo = new NodePortInfo(
                            portInfo,
                            info,
                            baseFieldName,
                            info.TypeOfValue,
                            Property.Tree.WeakTargets.FirstOrDefault() as Node,                             // Needed?
                            showBackingValue,
                            connectionType,
                            typeConstraint,
                            isDynamicPortList,
                            false,
                            isInput,
                            true
                            );

                        propertyToNodeProperty[info.PropertyName]     = portInfo.PropertyName;
                        nameToNodePropertyInfo[portInfo.PropertyName] = nodePortInfo;

                        if (isDynamicPortList)
                        {
                            var listDrawerAttributes = info.GetAttribute <ListDrawerSettingsAttribute>();
                            if (listDrawerAttributes == null)
                            {
                                listDrawerAttributes = new ListDrawerSettingsAttribute();
                                info.GetEditableAttributesList().Add(listDrawerAttributes);
                            }

                            listDrawerAttributes.Expanded   = true;
                            listDrawerAttributes.ShowPaging = false;
                        }

                        infos.Insert(i, portInfo);
                        ++i;                         // Skip the next entry
                    }
                }

                if (displayDynamicPortsAttribute != null)
                {
                    // If I find any dynamic ports that were not covered here then add them as well
                    // This should include anything that wouldn't be directly related to the ports I *did* find
                    foreach (var port in Node.Ports)
                    {
                        if (port.IsDynamic)
                        {
                            // If is likely to be an automatically added port?
                            if (IsManagedPort(port.fieldName))
                            {
                                continue;
                            }

                            // No one claimed it?
                            var nodePortInfo = CreateLooseDynamicPortInfo(port, out var info, out var portInfo, displayDynamicPortsAttribute);

                            propertyToNodeProperty[info.PropertyName]     = portInfo.PropertyName;
                            nameToNodePropertyInfo[portInfo.PropertyName] = nodePortInfo;

                            infos.Add(info);
                            infos.Add(portInfo);
                        }
                    }
                }
            }

            for (int i = 0; i < this.processors.Count; i++)
            {
                ProcessedMemberPropertyResolverExtensions.ProcessingOwnerType = typeof(TValue);
                this.processors[i].ProcessMemberProperties(infos);
            }

            EditorApplication.update -= Update;
            if (displayDynamicPortsAttribute != null)
            {
                EditorApplication.update += Update;
            }

            knownPortKeys.Clear();
            knownPortKeys.AddRange(Node.Ports.Select(x => x.fieldName));
            return(InspectorPropertyInfoUtility.BuildPropertyGroupsAndFinalize(this.Property, typeof(TValue), infos, includeSpeciallySerializedMembers));
        }