public static object DefaultPropertyField(Rect position, GUIContent label, object value, System.Type valueType)
        {
            var propertyType = (valueType != null) ? EditorHelper.GetPropertyType(valueType) : SerializedPropertyType.Generic;

            switch (propertyType)
            {
            case SerializedPropertyType.Integer:
                EditorGUI.BeginChangeCheck();
                int num1 = EditorGUI.IntField(position, label, ConvertUtil.ToInt(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(num1);
                }
                else
                {
                    break;
                }

            case SerializedPropertyType.Boolean:
                EditorGUI.BeginChangeCheck();
                bool flag2 = EditorGUI.Toggle(position, label, ConvertUtil.ToBool(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(flag2);
                }
                else
                {
                    break;
                }

            case SerializedPropertyType.Float:
                EditorGUI.BeginChangeCheck();
                float num2 = EditorGUI.FloatField(position, label, ConvertUtil.ToSingle(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(num2);
                }
                else
                {
                    break;
                }

            case SerializedPropertyType.String:
                EditorGUI.BeginChangeCheck();
                string str1 = EditorGUI.TextField(position, label, ConvertUtil.ToString(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(str1);
                }
                else
                {
                    break;
                }

            case SerializedPropertyType.Color:
                EditorGUI.BeginChangeCheck();
                Color color = EditorGUI.ColorField(position, label, ConvertUtil.ToColor(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(color);
                }
                else
                {
                    break;
                }

            case SerializedPropertyType.ObjectReference:
                EditorGUI.BeginChangeCheck();
                object obj = EditorGUI.ObjectField(position, label, value as UnityEngine.Object, valueType, true);
                if (EditorGUI.EndChangeCheck())
                {
                    return(obj);
                }
                break;

            case SerializedPropertyType.LayerMask:
                EditorGUI.BeginChangeCheck();
                LayerMask mask = (value is LayerMask) ? (LayerMask)value : (LayerMask)ConvertUtil.ToInt(value);
                mask = SPEditorGUI.LayerMaskField(position, label, mask);
                if (EditorGUI.EndChangeCheck())
                {
                    return(mask);
                }
                break;

            case SerializedPropertyType.Enum:
                if (valueType.GetCustomAttributes(typeof(System.FlagsAttribute), false).Any())
                {
                    EditorGUI.BeginChangeCheck();
                    var e = SPEditorGUI.EnumFlagField(position, label, ConvertUtil.ToEnumOfType(valueType, value));
                    if (EditorGUI.EndChangeCheck())
                    {
                        return(e);
                    }
                }
                else
                {
                    EditorGUI.BeginChangeCheck();
                    var e = SPEditorGUI.EnumPopupExcluding(position, label, ConvertUtil.ToEnumOfType(valueType, value));
                    if (EditorGUI.EndChangeCheck())
                    {
                        return(e);
                    }
                }
                break;

            case SerializedPropertyType.Vector2:
                EditorGUI.BeginChangeCheck();
                var v2 = EditorGUI.Vector2Field(position, label, ConvertUtil.ToVector2(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(v2);
                }
                break;

            case SerializedPropertyType.Vector3:
                EditorGUI.BeginChangeCheck();
                var v3 = EditorGUI.Vector3Field(position, label, ConvertUtil.ToVector3(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(v3);
                }
                break;

            case SerializedPropertyType.Vector4:
                EditorGUI.BeginChangeCheck();
                var v4 = EditorGUI.Vector4Field(position, label.text, ConvertUtil.ToVector4(value));
                if (EditorGUI.EndChangeCheck())
                {
                    return(v4);
                }
                break;

            case SerializedPropertyType.Rect:
                EditorGUI.BeginChangeCheck();
                Rect rect = (value is Rect) ? (Rect)value : new Rect();
                rect = EditorGUI.RectField(position, label, rect);
                if (EditorGUI.EndChangeCheck())
                {
                    return(rect);
                }
                break;

            case SerializedPropertyType.ArraySize:
                EditorGUI.BeginChangeCheck();
                int num3 = EditorGUI.IntField(position, label, ConvertUtil.ToInt(value), EditorStyles.numberField);
                if (EditorGUI.EndChangeCheck())
                {
                    return(num3);
                }
                break;

            case SerializedPropertyType.Character:
                bool changed = GUI.changed;
                GUI.changed = false;
                string str2 = EditorGUI.TextField(position, label, new string(ConvertUtil.ToChar(value), 1));
                if (GUI.changed)
                {
                    if (str2.Length == 1)
                    {
                        return(str2[0]);
                    }
                    else
                    {
                        GUI.changed = false;
                    }
                }
                GUI.changed = GUI.changed | changed;
                break;

            case SerializedPropertyType.AnimationCurve:
                EditorGUI.BeginChangeCheck();
                AnimationCurve curve = value as AnimationCurve;
                curve = EditorGUI.CurveField(position, label, curve);
                if (EditorGUI.EndChangeCheck())
                {
                    return(curve);
                }
                break;

            case SerializedPropertyType.Bounds:
                EditorGUI.BeginChangeCheck();
                Bounds bnds = (value is Bounds) ? (Bounds)value : new Bounds();
                bnds = EditorGUI.BoundsField(position, label, bnds);
                if (EditorGUI.EndChangeCheck())
                {
                    return(bnds);
                }
                break;

            case SerializedPropertyType.Gradient:
                EditorGUI.BeginChangeCheck();
                Gradient grad = value as Gradient;
                grad = SPEditorGUI.GradientField(position, label, grad);
                if (EditorGUI.EndChangeCheck())
                {
                    return(grad);
                }
                break;

            default:
                EditorGUI.PrefixLabel(position, label);
                break;
            }

            return(value);
        }
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);
            var r1 = new Rect(r0.xMax, position.yMin, position.width - r0.width, position.height);

            var propName  = property.FindPropertyRelative(PROP_NAME);
            var propValue = property.FindPropertyRelative(PROP_VALUE);
            var propRef   = property.FindPropertyRelative(PROP_REF);

            int index = System.Array.IndexOf(_knownPlayerSettingPropNames, propName.stringValue);

            EditorGUI.BeginChangeCheck();
            index = EditorGUI.Popup(r0, GUIContent.none, index, _knownPlayerSettingPropNamesPretty);
            if (EditorGUI.EndChangeCheck())
            {
                if (index >= 0 && index < _knownPlayerSettingPropNames.Length)
                {
                    propName.stringValue = _knownPlayerSettingPropNames[index];
                }
                else
                {
                    propName.stringValue = string.Empty;
                }

                propValue.stringValue        = string.Empty;
                propRef.objectReferenceValue = null;
            }

            if (index < 0 || index >= _knownPlayerSettings.Length)
            {
                return;
            }

            var info = _knownPlayerSettings[index];

            if (info.PropertyType.IsEnum)
            {
                int ei = ConvertUtil.ToInt(propValue.stringValue);
                propValue.stringValue        = ConvertUtil.ToInt(EditorGUI.EnumPopup(r1, ConvertUtil.ToEnumOfType(info.PropertyType, ei))).ToString();
                propRef.objectReferenceValue = null;
            }
            else
            {
                var etp = VariantReference.GetVariantType(info.PropertyType);
                switch (etp)
                {
                case VariantType.Null:
                    propValue.stringValue        = string.Empty;
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.String:
                    propValue.stringValue        = EditorGUI.TextField(r1, propValue.stringValue);
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Boolean:
                    propValue.stringValue        = ConvertUtil.Stringify(EditorGUI.Toggle(r1, GUIContent.none, ConvertUtil.ToBool(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Integer:
                    propValue.stringValue        = EditorGUI.IntField(r1, GUIContent.none, ConvertUtil.ToInt(propValue.stringValue)).ToString();
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Float:
                    propValue.stringValue        = EditorGUI.FloatField(r1, GUIContent.none, ConvertUtil.ToSingle(propValue.stringValue)).ToString();
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Double:
                    propValue.stringValue        = EditorGUI.DoubleField(r1, GUIContent.none, ConvertUtil.ToDouble(propValue.stringValue)).ToString();
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Vector2:
                    propValue.stringValue        = ConvertUtil.Stringify(EditorGUI.Vector2Field(r1, GUIContent.none, ConvertUtil.ToVector2(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Vector3:
                    propValue.stringValue        = ConvertUtil.Stringify(EditorGUI.Vector3Field(r1, GUIContent.none, ConvertUtil.ToVector3(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Vector4:
                    propValue.stringValue        = ConvertUtil.Stringify(EditorGUI.Vector4Field(r1, (string)null, ConvertUtil.ToVector4(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Quaternion:
                    propValue.stringValue        = ConvertUtil.Stringify(SPEditorGUI.QuaternionField(r1, GUIContent.none, ConvertUtil.ToQuaternion(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Color:
                    propValue.stringValue        = ConvertUtil.Stringify(EditorGUI.ColorField(r1, ConvertUtil.ToColor(propValue.stringValue)));
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.DateTime:
                    //TODO - should never actually occur
                    propValue.stringValue        = string.Empty;
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.GameObject:
                case VariantType.Component:
                case VariantType.Object:
                    propValue.stringValue        = string.Empty;
                    propRef.objectReferenceValue = EditorGUI.ObjectField(r1, GUIContent.none, propValue.objectReferenceValue, info.PropertyType, false);
                    break;

                case VariantType.LayerMask:
                    propValue.stringValue        = SPEditorGUI.LayerMaskField(r1, GUIContent.none, ConvertUtil.ToInt(propValue.stringValue)).ToString();
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Rect:
                    //TODO - should never actually occur
                    propValue.stringValue        = string.Empty;
                    propRef.objectReferenceValue = null;
                    break;

                case VariantType.Numeric:

                    break;
                }
            }
        }