Beispiel #1
0
        public static bool HandleType(InvokeWrapper wrapper, object[] objects)
        {
            if (!wrapper.CanRead())
            {
                return(false);
            }

            var drawerInfo = InspectorGUI.GetDrawerMethod(wrapper.GetContainingType());

            if (!drawerInfo.IsValid)
            {
                return(false);
            }

            EditorGUI.showMixedValue = !wrapper.AreValuesEqual(objects);

            var value   = drawerInfo.Drawer.Invoke(null, new object[] { objects[0], wrapper, Skin });
            var changed = UnityEngine.GUI.changed &&
                          (drawerInfo.IsNullable || value != null);

            // Reset changed state so that non-edited values
            // are propagated to other properties.
            UnityEngine.GUI.changed = false;

            EditorGUI.showMixedValue = false;

            if (!changed)
            {
                return(false);
            }

            foreach (var obj in objects)
            {
                object newValue = value;
                if (drawerInfo.CopyOp != null)
                {
                    newValue = wrapper.GetValue(obj);
                    // CopyOp returns the new value for value types.
                    var ret = drawerInfo.CopyOp.Invoke(null, new object[] { value, newValue });
                    if (ret != null)
                    {
                        newValue = ret;
                    }
                }
                wrapper.ConditionalSet(obj, newValue);
            }

            return(true);
        }
Beispiel #2
0
        private static bool HandleType(InvokeWrapper wrapper,
                                       object[] objects,
                                       SerializedObject fallback)
        {
            if (!wrapper.CanRead())
            {
                return(false);
            }

            var drawerInfo = InvokeWrapperInspectorDrawer.GetDrawerMethod(wrapper.GetContainingType());

            if (wrapper.HasAttribute <InspectorSeparatorAttribute>())
            {
                InspectorGUI.BrandSeparator();
            }

            EditorGUI.showMixedValue = !wrapper.AreValuesEqual(objects);

            object value   = null;
            bool   changed = false;

            if (drawerInfo.IsValid)
            {
                value   = drawerInfo.Drawer.Invoke(null, new object[] { objects, wrapper });
                changed = UnityEngine.GUI.changed &&
                          (drawerInfo.IsNullable || value != null);
            }
            // Fallback to Unity types rendered with property drawers.
            else if (fallback != null && !wrapper.GetContainingType().FullName.StartsWith("AGXUnity."))
            {
                var serializedProperty = fallback.FindProperty(wrapper.Member.Name);

                // This is currently only tested on:
                //     private InputActionAssert m_inputAsset = null;
                //     public InputActionAsset InputAsset { get ... set ... }
                //     public InputActionMap InputMap = null;
                // And serializedProperty.objectReferenceValue prints error:
                //     type is not a supported pptr value
                // for 'InputMap' when changed (not assigned, just manipulated).
                // When we catch the 'm_inputAsset' we may do objectReferenceValue and
                // can propagate the value to the C# property.
                var assignSupported = false;
                if (serializedProperty == null && wrapper.Member.Name.Length > 2)
                {
                    var fieldName = "m_" + char.ToLower(wrapper.Member.Name[0]) + wrapper.Member.Name.Substring(1);
                    serializedProperty = fallback.FindProperty(fieldName);
                    assignSupported    = serializedProperty != null;
                }

                if (serializedProperty != null)
                {
                    EditorGUILayout.PropertyField(serializedProperty);
                    if (UnityEngine.GUI.changed && assignSupported)
                    {
                        changed = true;
                        value   = serializedProperty.objectReferenceValue;
                    }
                }
            }

            // Reset changed state so that non-edited values
            // are propagated to other properties.
            UnityEngine.GUI.changed = false;

            EditorGUI.showMixedValue = false;

            if (!changed)
            {
                return(false);
            }

            foreach (var obj in objects)
            {
                object newValue = value;
                if (drawerInfo.IsValid && drawerInfo.CopyOp != null)
                {
                    newValue = wrapper.GetValue(obj);
                    // CopyOp returns the new value for value types.
                    var ret = drawerInfo.CopyOp.Invoke(null, new object[] { value, newValue });
                    if (ret != null)
                    {
                        newValue = ret;
                    }
                }
                wrapper.ConditionalSet(obj, newValue);
            }

            return(true);
        }