示例#1
0
        private void DrawTypeReferenceField(Rect position, SerializedProperty property)
        {
            var typeOptionsAttribute = attribute as TypeOptionsAttribute ?? TypeOptionsAttribute.Default;
            var serializedTypeRef    = new SerializedTypeReference(property);

            var selectedType = TypeCache.GetType(serializedTypeRef.TypeNameAndAssembly);

            if (selectedType != null && !typeOptionsAttribute.MatchesRequirements(selectedType))
            {
                Debug.Log($"{property.name} had the {selectedType} value but the type does not match " +
                          "constraints set in the attribute, so it was set to null.");
                selectedType = null;
                serializedTypeRef.TypeNameAndAssembly = string.Empty;
            }

            var dropdownDrawer = new TypeDropdownDrawer(selectedType, typeOptionsAttribute, fieldInfo?.DeclaringType);

            var fieldDrawer = new TypeFieldDrawer(
                serializedTypeRef,
                position,
                dropdownDrawer,
                typeOptionsAttribute.ShortName,
                typeOptionsAttribute.UseBuiltInNames);

            fieldDrawer.Draw();
        }
示例#2
0
        private Argument_v1 ParseRegisterSequence(RegisterStorage reg, string type)
        {
            ++idx;
            string w2 = GetNextWord();

            if (w2 == null)
            {
                return(null);
            }
            RegisterStorage reg2;

            if (!arch.TryGetRegister(w2, out reg2))
            {
                return(null);
            }
            var seqArgName = reg.Name + "_" + reg2.Name;
            var seqArgType = new SerializedTypeReference {
                TypeName = type
            };
            var seqKind = new SerializedSequence();

            seqKind.Registers = new Register_v1[] {
                new Register_v1(reg.Name),
                new Register_v1(reg2.Name)
            };
            return(new Argument_v1(seqArgName, seqArgType, seqKind, false));
        }
 public void AddGroupDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (groupDrawerHandlers == null)
     {
         groupDrawerHandlers = new List <SerializedTypeReference>();
     }
     groupDrawerHandlers.Add(drawerReference);
 }
 public void AddAreaDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (areaDrawerHandlers == null)
     {
         areaDrawerHandlers = new List <SerializedTypeReference>();
     }
     areaDrawerHandlers.Add(drawerReference);
 }
示例#5
0
 public void AddTargetTypeDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (targetTypeDrawerHandlers == null)
     {
         targetTypeDrawerHandlers = new List <SerializedTypeReference>();
     }
     targetTypeDrawerHandlers.Add(drawerReference);
 }
示例#6
0
 public void AddDecoratorDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (decoratorDrawerHandlers == null)
     {
         decoratorDrawerHandlers = new List <SerializedTypeReference>();
     }
     decoratorDrawerHandlers.Add(drawerReference);
 }
示例#7
0
 public void AddPropertyDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (propertyDrawerHandlers == null)
     {
         propertyDrawerHandlers = new List <SerializedTypeReference>();
     }
     propertyDrawerHandlers.Add(drawerReference);
 }
示例#8
0
 public void AddCollectionDrawerHandler(SerializedTypeReference drawerReference)
 {
     if (conditionDrawerHandlers == null)
     {
         collectionDrawerHandlers = new List <SerializedTypeReference>();
     }
     collectionDrawerHandlers.Add(drawerReference);
 }
 public void AddPropertyHandler(SerializedTypeReference attributeHandler)
 {
     if (propertyHandlers == null)
     {
         propertyHandlers = new List <SerializedTypeReference>();
     }
     propertyHandlers.Add(attributeHandler);
 }
示例#10
0
        public DataType VisitTypeReference(SerializedTypeReference typeReference)
        {
            DataType type;

            if (types.TryGetValue(typeReference.TypeName, out type))
            {
                return(new TypeReference(typeReference.TypeName, type));
            }
            return(new TypeReference(typeReference.TypeName, new UnknownType()));
        }
 public TypeFieldDrawer(
     SerializedTypeReference serializedTypeRef,
     Rect position,
     TypeDropdownDrawer dropdownDrawer,
     bool showShortName)
 {
     _serializedTypeRef = serializedTypeRef;
     _position          = position;
     _dropdownDrawer    = dropdownDrawer;
     _showShortName     = showShortName;
 }
        /// <summary>
        /// Draws property using provided <see cref="Rect"/>.
        /// </summary>
        /// <param name="position"></param>
        /// <param name="property"></param>
        /// <param name="label"></param>
        protected override void OnGUISafe(Rect position, SerializedProperty property, GUIContent label)
        {
            var refAttribute = Attribute;
            var refProperty  = property.FindPropertyRelative("classReference");

            //validate serialized data
            if (refAttribute == null || refAttribute.AssemblyType == null)
            {
                EditorGUI.PropertyField(position, refProperty, label);
                return;
            }

            var refType   = !string.IsNullOrEmpty(refProperty.stringValue) ? Type.GetType(refProperty.stringValue) : null;
            var refTypes  = new List <Type>();
            var refLabels = new List <string>()
            {
                "<None>"
            };
            var index = -1;

            //get stored types if possible or create new item
            if (!filteredTypes.TryGetValue(refAttribute.AssemblyType, out refTypes))
            {
                refTypes = filteredTypes[refAttribute.AssemblyType] = refAttribute.GetFilteredTypes();
            }
            else
            {
                refTypes = filteredTypes[refAttribute.AssemblyType];
            }

            //create labels from filtered types
            for (int i = 0; i < refTypes.Count; i++)
            {
                var menuType  = refTypes[i];
                var menuLabel = FormatGroupedTypeName(menuType, refAttribute.Grouping);

                if (menuType == refType)
                {
                    index = i;
                }

                refLabels.Add(menuLabel);
            }

            //draw reference property
            EditorGUI.BeginProperty(position, label, refProperty);
            label = property.name != "data" ? label : GUIContent.none;
            index = EditorGUI.Popup(position, label.text, index + 1, refLabels.ToArray());
            //get correct class reference, index = 0 is reserved to <None> type
            refProperty.stringValue = index >= 1 ? SerializedTypeReference.GetClassReference(refTypes[index - 1]) : "";
            EditorGUI.EndProperty();
        }
示例#13
0
        public SerializedTypeReference ParseStructure(List <Argument_v1> compoundArgs)
        {
            var q  = ParseQualification();
            var tr = new SerializedTypeReference
            {
                TypeName = q.Last(),
                Scope    = q.Take(q.Length - 1).ToArray()
            };

            compoundArgs.Add(new Argument_v1 {
                Type = tr
            });
            return(tr);
        }
示例#14
0
 public TypeFieldDrawer(
     SerializedTypeReference serializedTypeRef,
     Rect position,
     TypeDropdownDrawer dropdownDrawer,
     bool showShortName,
     Action <Type> onTypeSelected = null,
     bool triggerDropdown         = false)
 {
     _serializedTypeRef = serializedTypeRef;
     _position          = position;
     _dropdownDrawer    = dropdownDrawer;
     _showShortName     = showShortName;
     _onTypeSelected    = onTypeSelected;
     _triggerDropdown   = triggerDropdown;
 }
示例#15
0
        /// <summary>
        /// Reads a qualification followed by '@'.
        /// </summary>
        /// <returns></returns>
        public string[] ParseQualification()
        {
            var qualifiers = new List <string>();

            SerializedType[] typeArgs = null;
            while (i < str.Length && !PeekAndDiscard('@'))
            {
                string name = ParseAtName();
                if (name.StartsWith("?$"))
                {
                    name = name.Substring(2);
                    namesSeen.Add(name);
                    var oldNames = namesSeen;
                    if (templateNamesSeen == null)
                    {
                        templateNamesSeen = new List <string> {
                            name
                        };
                    }
                    else
                    {
                        templateNamesSeen.Add(name);
                    }
                    namesSeen = templateNamesSeen;
                    typeArgs  = ParseTemplateArguments().ToArray(); ///$TODO: what to do about these if they're nested?
                    namesSeen = oldNames;
                }
                else
                {
                    namesSeen.Add(name);
                }
                qualifiers.Insert(0, name);
            }
            var tr = new SerializedTypeReference
            {
                TypeName      = qualifiers.Last(),
                Scope         = qualifiers.Take(qualifiers.Count - 1).ToArray(),
                TypeArguments = typeArgs
            };

            return(qualifiers.ToArray());
        }
示例#16
0
 public StringBuilder VisitTypeReference(SerializedTypeReference typeReference)
 {
     sb.Append(typeReference.TypeName);
     if (name != null)
     {
         sb.AppendFormat(" {0}", name);
     }
     if (typeReference.TypeArguments != null && typeReference.TypeArguments.Length > 0)
     {
         sb.Append("<");
         var sep = "";
         foreach (var tyArg in typeReference.TypeArguments)
         {
             sb.Append(sep);
             tyArg.Accept(this);
             sep = ",";
         }
         sb.Append(">");
     }
     return(sb);
 }
 public void RemoveGroupDrawerHandler(SerializedTypeReference drawerReference)
 {
     groupDrawerHandlers?.Remove(drawerReference);
 }
 public void RemovePropertyHandler(SerializedTypeReference attributeHandler)
 {
     propertyHandlers?.Remove(attributeHandler);
 }
示例#19
0
 public int VisitTypeReference(SerializedTypeReference typeReference)
 {
     return(converter.NamedTypes[typeReference.TypeName].Accept(this));
 }
示例#20
0
 private Argument_v1 ParseRegisterSequence(RegisterStorage reg, string type)
 {
     ++idx;
     string w2 = GetNextWord();
     if (w2 == null)
         return null;
     RegisterStorage reg2;
     if (!arch.TryGetRegister(w2, out reg2))
         return null;
     var seqArgName = reg.Name + "_" + reg2.Name;
     var seqArgType = new SerializedTypeReference { TypeName = type };
     var seqKind = new SerializedSequence();
     seqKind.Registers = new Register_v1[]{ 
             new Register_v1(reg.Name), 
             new Register_v1(reg2.Name)
         };
     return new Argument_v1(seqArgName, seqArgType, seqKind, false);
 }
 public void RemoveAreaDrawerHandler(SerializedTypeReference drawerReference)
 {
     areaDrawerHandlers?.Remove(drawerReference);
 }
示例#22
0
 public int VisitTypeReference(SerializedTypeReference typeReference)
 {
     return(typedefs[typeReference.TypeName].Accept(this));
 }
示例#23
0
 public void RemoveDecoratorDrawerHandler(SerializedTypeReference drawerReference)
 {
     decoratorDrawerHandlers?.Remove(drawerReference);
 }
示例#24
0
 /// <summary>
 /// Reads a qualification followed by '@'.
 /// </summary>
 /// <returns></returns>
 public string[] ParseQualification()
 {
     var qualifiers = new List<string>();
     SerializedType[] typeArgs = null;
     while (i < str.Length && !PeekAndDiscard('@'))
     {
         string name = ParseAtName();
         if (name.StartsWith("?$"))
         {
             name = name.Substring(2);
             namesSeen.Add(name);
             var oldNames = namesSeen;
             if (templateNamesSeen == null)
             {
                 templateNamesSeen = new List<string> { name };
             }
             else
                 templateNamesSeen.Add(name);
             namesSeen = templateNamesSeen;
             typeArgs = ParseTemplateArguments().ToArray(); ///$TODO: what to do about these if they're nested?
             namesSeen = oldNames;
         }
         else
         {
             namesSeen.Add(name);
         }
         qualifiers.Insert(0, name);
     }
     var tr = new SerializedTypeReference
     {
         TypeName = qualifiers.Last(),
         Scope = qualifiers.Take(qualifiers.Count - 1).ToArray(),
         TypeArguments = typeArgs
     };
     return qualifiers.ToArray();
 }
示例#25
0
 public void RemoveCollectionDrawerHandler(SerializedTypeReference drawerReference)
 {
     collectionDrawerHandlers?.Remove(drawerReference);
 }
示例#26
0
 public void RemovePropertyDrawerHandler(SerializedTypeReference drawerReference)
 {
     propertyDrawerHandlers?.Remove(drawerReference);
 }
示例#27
0
 private void OnTypeSelected(object userData)
 {
     selectedClassRef = SerializedTypeReference.GetClassReference(userData as Type);
     EditorWindow.focusedWindow.SendEvent(EditorGUIUtility.CommandEvent("TypeReferenceUpdated"));
 }
示例#28
0
 public void RemoveTargetTypeDrawerHandler(SerializedTypeReference drawerReference)
 {
     targetTypeDrawerHandlers?.Remove(drawerReference);
 }
示例#29
0
        /// <summary>
        /// Draws property using provided <see cref="Rect"/>.
        /// </summary>
        /// <param name="rect"></param>
        /// <param name="property"></param>
        /// <param name="label"></param>
        public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
        {
            var refAttribute = Attribute;
            var refProperty  = property.FindPropertyRelative("classReference");

            if (refProperty == null)
            {
                Debug.LogWarning(property.name + " property in " + property.serializedObject.targetObject +
                                 " - " + attribute.GetType() + " can be used only on string properties.");
                EditorGUI.PropertyField(rect, property, label);
                return;
            }

            if (refAttribute == null || refAttribute.AssemblyType == null)
            {
                EditorGUI.PropertyField(rect, refProperty, label);
                return;
            }

            //DrawTypeSelectionRect(position, refProperty, refAttribute, label);

            var refType   = ResolveType(refProperty.stringValue);
            var refTypes  = new List <Type>();
            var refLabels = new List <string>()
            {
                "<None>"
            };
            var index = -1;

            //get stored types if possible or create new item
            if (!filteredTypes.TryGetValue(refAttribute.AssemblyType, out refTypes))
            {
                refTypes = filteredTypes[refAttribute.AssemblyType] = refAttribute.GetFilteredTypes();
            }
            else
            {
                refTypes = filteredTypes[refAttribute.AssemblyType];
            }

            //create labels from filtered types
            for (int i = 0; i < refTypes.Count; i++)
            {
                var menuType  = refTypes[i];
                var menuLabel = FormatGroupedTypeName(menuType, refAttribute.Grouping);

                if (menuType == refType)
                {
                    index = i;
                }

                refLabels.Add(menuLabel);
            }

            //draw reference property
            EditorGUI.BeginProperty(rect, label, refProperty);
            label = property.name != "data" ? label : GUIContent.none;
            index = EditorGUI.Popup(rect, label.text, index + 1, refLabels.ToArray());
            //get correct class reference, index = 0 is reserved to <None> type
            refProperty.stringValue = index >= 1 ? SerializedTypeReference.GetClassReference(refTypes[index - 1]) : "";
            EditorGUI.EndProperty();
        }
示例#30
0
 public SerializedTypeReference ParseStructure(List<Argument_v1> compoundArgs)
 {
     var q = ParseQualification();
     var tr = new SerializedTypeReference
     {
         TypeName = q.Last(),
         Scope = q.Take(q.Length - 1).ToArray()
     };
     compoundArgs.Add(new Argument_v1 { Type = tr });
     return tr;
 }
示例#31
0
 public bool VisitTypeReference(SerializedTypeReference typeReference)
 {
     throw new NotImplementedException();
 }