private static List <IConformObject> CompareSerializedObject(SerializedObject template, SerializedObject asset) { SerializedProperty templateIter = template.GetIterator(); SerializedProperty assetIter = asset.GetIterator(); assetIter.NextVisible(true); templateIter.NextVisible(true); List <IConformObject> infos = new List <IConformObject>(); do { if (assetIter.name == "m_UserData") { templateIter.NextVisible(false); continue; } // TODO Performance: Is there a better way to find the properties? // possibly could use utility method to get all properties in one loop?? (this may not work, NextVisible will not work this way) PropertyConformObject conformObject = new PropertyConformObject(templateIter.name); conformObject.SetSerializedProperties(template.FindProperty(templateIter.name), asset.FindProperty(assetIter.name)); infos.Add(conformObject); templateIter.NextVisible(false); } while(assetIter.NextVisible(false)); return(infos); }
protected override void ContextClickedItem(int id) { ConformObjectTreeViewItem item = FindItem(id, rootItem) as ConformObjectTreeViewItem; Assert.IsNotNull(item); if (item.conforms) { return; } // TODO ask the ConformObject to do this PropertyConformObject propertyConformObject = item.conformObject as PropertyConformObject; if (propertyConformObject != null) { GenericMenu menu = new GenericMenu(); if (propertyConformObject.TemplateType == SerializedPropertyType.Generic) { menu.AddItem(new GUIContent("Set children to Template Values"), false, FixCallback, item); } else if (propertyConformObject.TemplateType == SerializedPropertyType.ArraySize) { menu.AddDisabledItem(new GUIContent("Cannot set array size")); } else { menu.AddItem(new GUIContent("Set to " + propertyConformObject.TemplateValue), false, FixCallback, item); } menu.ShowAsContext(); } }
private List <IConformObject> CompareSerializedObject(SerializedObject template, SerializedObject asset) { SerializedProperty ruleIter = template.GetIterator(); SerializedProperty assetIter = asset.GetIterator(); assetIter.NextVisible(true); ruleIter.NextVisible(true); List <IConformObject> infos = new List <IConformObject>(); do { PropertyConformObject conformObject = new PropertyConformObject(ruleIter.name); // TODO better way to do this? could use utility method to get all properties in one loop conformObject.SetSerializedProperties(template.FindProperty(ruleIter.name), asset.FindProperty(assetIter.name)); infos.Add(conformObject); ruleIter.NextVisible(false); } while(assetIter.NextVisible(false)); return(infos); }
public List <IConformObject> GetConformObjects(string asset) { AssetImporter assetImporter = AssetImporter.GetAtPath(asset); if (m_ImporterReference == null) { return(new List <IConformObject>(0)); } SerializedObject assetImporterSO = new SerializedObject(assetImporter); SerializedObject profileImporterSO = new SerializedObject(ReferenceAssetImporter); // TODO check to make sure these are valid constraints if (m_ConstrainProperties.Count == 0) { return(CompareSerializedObject(profileImporterSO, assetImporterSO)); } List <IConformObject> infos = new List <IConformObject>(); for (int i = 0; i < m_ConstrainProperties.Count; ++i) { string propertyName = m_ConstrainProperties[i]; SerializedProperty assetRuleSP = profileImporterSO.FindProperty(propertyName); if (assetRuleSP == null) { continue; // could be properties from another Object } SerializedProperty foundAssetSP = assetImporterSO.FindProperty(propertyName); PropertyConformObject conformObject = new PropertyConformObject(propertyName); conformObject.SetSerializedProperties(assetRuleSP, foundAssetSP); infos.Add(conformObject); } return(infos); }
public override List <IConformObject> GetConformObjects(string asset, ImportDefinitionProfile profile) { AssetImporter assetImporter = AssetImporter.GetAtPath(asset); if (m_ImporterReference == null) { return(new List <IConformObject>(0)); } SerializedObject assetImporterSO = new SerializedObject(assetImporter); SerializedObject profileImporterSO = new SerializedObject(ReferenceAssetImporter); // TODO Performance: if there are any. check to make sure these are valid constraints, if not, don't include them in the count if (m_ConstrainProperties.Count == 0) { return(CompareSerializedObject(profileImporterSO, assetImporterSO)); } List <IConformObject> infos = new List <IConformObject>(); for (int i = 0; i < m_ConstrainProperties.Count; ++i) { SerializedProperty assetRuleSP = profileImporterSO.FindProperty(m_ConstrainProperties[i]); if (assetRuleSP == null) { continue; // could be properties from another Object } SerializedProperty foundAssetSP = assetImporterSO.FindProperty(m_ConstrainProperties[i]); PropertyConformObject conformObject = new PropertyConformObject(m_ConstrainProperties[i]); conformObject.SetSerializedProperties(assetRuleSP, foundAssetSP); infos.Add(conformObject); } return(infos); }
private static void AddChildProperty(string parentPath, PropertyViewItem parent, PropertyConformObject propertyConformObject, AssetViewItem assetItem, int depth, int arrayIndex = -1) { string extra = arrayIndex >= 0 ? arrayIndex.ToString() : ""; string activePath = parentPath + propertyConformObject.Name + extra; PropertyViewItem property = new PropertyViewItem(activePath, depth, propertyConformObject) { assetViewItem = assetItem }; parent.AddChild(property); for (int i = 0; i < propertyConformObject.SubObjects.Count; ++i) { // TODO will this be slow? , need to see if there is a better way to cache object type if (propertyConformObject.SubObjects[i] is PropertyConformObject) { AddChildProperty(activePath, property, (PropertyConformObject)propertyConformObject.SubObjects[i], assetItem, depth + 1, propertyConformObject.AssetSerializedProperty.isArray ? i : -1); } } }