public static GenericMenu GeneratePropertyMenu(SkillProperty fsmProperty) { TypeHelpers.targetFsmProperty = fsmProperty; GenericMenu result = new GenericMenu(); Type globalType = ReflectionUtils.GetGlobalType(fsmProperty.TargetTypeName); if (globalType != null) { TypeHelpers.AddPropertyMenuItems(ref result, globalType, "", 0, fsmProperty.setProperty); } return(result); }
private static void OpenSubPropertyMenu() { SkillEditor.OnRepaint = (SkillEditor.RepaintDelegate)Delegate.Remove(SkillEditor.OnRepaint, new SkillEditor.RepaintDelegate(TypeHelpers.OpenSubPropertyMenu)); string text = TypeHelpers.subPropertyPath; SkillProperty fsmProperty = TypeHelpers.targetFsmProperty; GenericMenu genericMenu = new GenericMenu(); Type globalType = ReflectionUtils.GetGlobalType(fsmProperty.TargetTypeName); if (globalType != null) { string path = TypeHelpers.NicifyPropertyPath(text); Type propertyType = ReflectionUtils.GetPropertyType(globalType, text); TypeHelpers.AddPropertyMenuItems(ref genericMenu, propertyType, path, 0, fsmProperty.setProperty); } TypeHelpers.subPropertyPath = ""; genericMenu.ShowAsContext(); }
private static void AddPropertyMenuItems(ref GenericMenu menu, Type type, string path, int depth, bool setProperty) { if (type != null && !type.get_IsEnum() && depth < 3) { List <MemberInfo> fieldsAndProperties = ReflectionUtils.GetFieldsAndProperties(type, 20); fieldsAndProperties.Sort((MemberInfo x, MemberInfo y) => string.CompareOrdinal(x.get_Name(), y.get_Name())); using (List <MemberInfo> .Enumerator enumerator = fieldsAndProperties.GetEnumerator()) { while (enumerator.MoveNext()) { MemberInfo current = enumerator.get_Current(); if (!TypeHelpers.FilterMember(current)) { Type memberUnderlyingType = ReflectionUtils.GetMemberUnderlyingType(current); string name = current.get_Name(); bool flag = memberUnderlyingType.get_IsClass() || (setProperty ? TypeHelpers.CanSetProperty(current) : TypeHelpers.CanGetProperty(current)); if (flag) { string text = (path != "") ? (path + '/' + name) : name; if (TypeHelpers.HasProperties(memberUnderlyingType)) { if (TypeHelpers.CanSetProperty(current)) { menu.AddItem(new GUIContent(text + '/' + Labels.StripNamespace(memberUnderlyingType.ToString())), false, new GenericMenu.MenuFunction2(TypeHelpers.SetFsmPropertyName), text); } } else { menu.AddItem(new GUIContent(text), false, new GenericMenu.MenuFunction2(TypeHelpers.SetFsmPropertyName), text); } } if (string.IsNullOrEmpty(TypeHelpers.subPropertyPath) && depth > 0 && memberUnderlyingType.IsSubclassOf(typeof(Component))) { menu.AddItem(new GUIContent(path + Strings.get_SubMenu_More_()), false, new GenericMenu.MenuFunction2(TypeHelpers.GenerateSubPropertyMenu), path); break; } if (flag || memberUnderlyingType.IsSubclassOf(typeof(Component))) { TypeHelpers.AddPropertyMenuItems(ref menu, memberUnderlyingType, (path != "") ? (path + '/' + name) : name, depth + 1, setProperty); } } } } } }