private void DisplayArray(object obj, ES2EditorType valueType, ES2Header header, string tag) { object[] array = obj as object[]; if (currentArrayFoldouts == null) { currentArrayFoldouts = new bool[array.Length]; } EditorGUILayout.IntField("Length", array.Length); EditorGUILayout.Space(); for (int i = 0; i < array.Length; i++) { if (currentArrayFoldouts[i] = EditorGUILayout.Foldout(currentArrayFoldouts[i], i.ToString())) { EditorGUI.indentLevel++; object guiFields = valueType.DisplayGUI(array[i]); EditorGUI.indentLevel--; if (guiFields == null) { EditorGUILayout.LabelField("This type cannot be viewed."); } else { array[i] = guiFields; } } } currentValue = array; }
private void DisplayList(object obj, ES2EditorType valueType, ES2Header header, string tag) { List <object> array = obj as List <object>; int count = array.Count; if (currentArrayFoldouts == null) { currentArrayFoldouts = new bool[count]; } EditorGUILayout.IntField("Length", count); EditorGUILayout.Space(); // If lengths are not equal, user has modified length field. /*if((Event.current.type == EventType.KeyUp) && (Event.current.keyCode == KeyCode.Return) && GUI.GetNameOfFocusedControl()=="arrayLength") * { * if(length > array.Length) * { * int difference = length-array.Length; * for(int i=0; i<difference; i++) * ArrayUtility.Add<object>(ref array, null); * } * else if(length < array.Length) * { * int difference = array.Length-length; * for(int i=0; i<difference; i++) * ArrayUtility.RemoveAt<object>(ref array, array.Length-difference); * } * * es2Data.loadedData[tag] = array; * }*/ for (int i = 0; i < count; i++) { if (currentArrayFoldouts[i] = EditorGUILayout.Foldout(currentArrayFoldouts[i], i.ToString())) { EditorGUI.indentLevel++; object guiFields = valueType.DisplayGUI(array[i]); EditorGUI.indentLevel--; if (guiFields == null) { EditorGUILayout.LabelField("This type cannot be viewed."); } else { array[i] = guiFields; } } } currentValue = array; }
private void SaveCurrentTag(ES2Header header) { try { ES2Type valueType = ES2TypeManager.GetES2Type(header.valueType); ES2Type keyType = ES2TypeManager.GetES2Type(header.keyType); ES2Settings settings = new ES2Settings(currentFilePath); settings.encrypt = header.settings.encrypt; settings.encryptionType = header.settings.encryptionType; settings.encryptionPassword = header.settings.encryptionPassword; using (ES2Writer writer = new ES2Writer(settings)) { if (header.collectionType == ES2Keys.Key._Null) { writer.Write(currentValue, currentTag, valueType); } else if (header.collectionType == ES2Keys.Key._NativeArray) { writer.Write(currentValue as object[], currentTag, valueType); } else if (header.collectionType == ES2Keys.Key._Dictionary) { writer.Write(currentValue as Dictionary <object, object>, currentTag, keyType, valueType); } else if (header.collectionType == ES2Keys.Key._List) { writer.Write(currentValue as List <object>, currentTag, valueType); } else if (header.collectionType == ES2Keys.Key._Queue) { writer.Write(currentValue as Queue <object>, currentTag, valueType); } else if (header.collectionType == ES2Keys.Key._Stack) { writer.Write(currentValue as Stack <object>, currentTag, valueType); } else if (header.collectionType == ES2Keys.Key._HashSet) { writer.Write(currentValue as HashSet <object>, currentTag, valueType); } writer.Save(); } } catch (Exception e) { EditorUtility.DisplayDialog("Could not save file", "An error was thrown when trying to save to this file. See below for details.\n\n" + "Details: " + e.Message, "Ok"); } }
protected void ProcessHeader(ES2Keys.Key expectedCollectionType, ES2Type expectedValue, ES2Type expectedKey, string tag) { if (ScanToTag(tag) == false) { Debug.LogError("Easy Save 2 Error: The data, tag, file or folder you are looking for does not exist. Please ensure that ES2.Exists(string identifier) returns true before calling this method."); } ES2Header header = ReadHeader(); /* Check that we're loading the correct types */ if (expectedValue == null) { Debug.LogError("This type is not supported by Easy Save, but you may be able to add support by going to 'Manage Types' in the 'Assets/Easy Save 2' menu."); } if (expectedCollectionType != header.collectionType) { // If the user is trying to load a non-collection with a collection method ... if (expectedCollectionType == ES2Keys.Key._Null) { Debug.LogError("Easy Save 2 Error: The data you are trying to load is a Collection. Please use the Load method for that type of collection (for example, ES2.LoadArray or ES2.LoadDictionary)"); } else { Debug.LogError("Easy Save 2 Error: The data you are trying to load is not a Collection, but you are using a Collection method to use it. Use ES2.Load instead."); } } if (expectedKey != null) { if (header.keyType != expectedKey.hash) { Debug.LogError("Easy Save 2 Error: The type of key in the Dictionary you are loading does not match the key you are trying to load with."); } } if (expectedValue != null) { if (header.valueType != expectedValue.hash) { Debug.LogError("Easy Save 2 Error: The data you are trying to load does not match the Load method you are using to load it. "); } } if (header.settings.encrypt) { this.settings.encrypt = true; } }
/* * Reads an object from the file, using the header data to determine type * and load appropriately using self-assigning method. Must be positioned before a tag before using. * Should not be used to load collections or non-value types. */ public void ReadObject(object obj) { ES2Header header = ReadHeader(); ES2Type es2Type = ES2TypeManager.GetES2Type(header.valueType); // Handle encrypted data if (header.settings.encrypt) { ReadEncrypted <System.Object>(es2Type, obj); } else { Read <System.Object>(es2Type, obj); } }
private string GetTypeName(ES2Header header, ES2EditorType valueType) { if (header.collectionType == ES2Keys.Key._Null) { return(valueType.type.ToString()); } else if (header.collectionType == ES2Keys.Key._NativeArray) { return(valueType.type.ToString() + "[]"); } else if (header.collectionType == ES2Keys.Key._Dictionary) { return("Dictionary<" + ES2TypeManager.GetES2Type(header.keyType).type.ToString() + "," + valueType.type.ToString() + ">"); } else { string enumName = header.collectionType.ToString(); return(enumName.Substring(1, enumName.Length - 1) + "<" + valueType.type.ToString() + ">"); } }
/* * Reads a Component from the file into Component on provided GameObject, * using the header data to determine exact type. * If GameObject doesn't contain Component, it will be added. */ public void ReadComponent(GameObject go) { ES2Header header = ReadHeader(); ES2Type es2Type = ES2TypeManager.GetES2Type(header.valueType); // Get Component from GameObject, or add it if it doesn't have one. Component c = go.GetComponent(es2Type.type); if (c == null) { c = go.AddComponent(es2Type.type); } // Handle encrypted data if (header.settings.encrypt) { ReadEncrypted <System.Object>(es2Type, c); } else { Read <System.Object>(es2Type, c); } }
private void DisplayDictionary(object obj, ES2EditorType valueType, ES2Header header, string tag) { Dictionary <object, object> dict = obj as Dictionary <object, object>; int count = dict.Count; object[] keys = dict.Keys.ToArray(); if (currentArrayFoldouts == null) { currentArrayFoldouts = new bool[count]; } EditorGUILayout.IntField("Count", count); EditorGUILayout.Space(); // If lengths are not equal, user has modified length field. /*if((Event.current.type == EventType.KeyUp) && (Event.current.keyCode == KeyCode.Return) && GUI.GetNameOfFocusedControl()=="arrayLength") * { * if(length > array.Length) * { * int difference = length-array.Length; * for(int i=0; i<difference; i++) * ArrayUtility.Add<object>(ref array, null); * } * else if(length < array.Length) * { * int difference = array.Length-length; * for(int i=0; i<difference; i++) * ArrayUtility.RemoveAt<object>(ref array, array.Length-difference); * } * * es2Data.loadedData[tag] = array; * }*/ for (int i = 0; i < count; i++) { if (currentArrayFoldouts[i] = EditorGUILayout.Foldout(currentArrayFoldouts[i], i.ToString())) { EditorGUI.indentLevel++; EditorGUILayout.LabelField("Key", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUI.indentLevel++; // Display Key object keyFields = ES2EditorType.Get(header.keyType).DisplayGUI(keys[i]); if (keyFields == null) { EditorGUILayout.LabelField("This type cannot be viewed."); } EditorGUI.indentLevel--; EditorGUILayout.LabelField("Value", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUI.indentLevel++; // Display Value object valueFields = valueType.DisplayGUI(dict[keys[i]]); if (valueFields == null) { EditorGUILayout.LabelField("This type cannot be viewed."); } else { dict[keys[i]] = valueFields; currentValue = dict; } EditorGUI.indentLevel--; EditorGUI.indentLevel--; } } }
private void DisplayTagInfo() { // If a tag has been selected but requires a password, show password field... if (currentTag != null && this.currentTagRequiresPassword) { EditorGUILayout.LabelField("This tag requires a password to view"); this.encryptionPassword = EditorGUILayout.TextField("Password", this.encryptionPassword); if (GUILayout.Button("Decrypt")) { OnTagChange(); } } // If a tag has been selected and doesn't explicity require a password... else if (currentTag != null && currentValue != null) { // Get type names from ES2Header data. ES2Header header = headers[currentTag]; ES2EditorType valueType = ES2EditorType.Get(header.valueType); // Only display this data if it's there's an ES2EditorType for it. if (valueType != null) { EditorGUILayout.BeginVertical(); rightScrollPosition = EditorGUILayout.BeginScrollView(rightScrollPosition); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Type", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUI.indentLevel++; EditorGUILayout.LabelField(GetTypeName(header, valueType)); EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Encryption", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUI.indentLevel++; EditorGUILayout.BeginHorizontal(); var tempLabelWidth = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 90; header.settings.encrypt = EditorGUILayout.Toggle("Encrypt?", header.settings.encrypt); if (header.settings.encrypt) { header.settings.encryptionPassword = EditorGUILayout.TextField(header.settings.encryptionPassword); } EditorGUIUtility.labelWidth = tempLabelWidth; EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Value", EditorStyles.boldLabel); EditorGUILayout.Space(); EditorGUI.indentLevel++; if (header.collectionType == ES2Keys.Key._Null) { DisplayObject(currentValue, valueType, currentTag); } else if (header.collectionType == ES2Keys.Key._NativeArray) { DisplayArray(currentValue, valueType, header, currentTag); } else if (header.collectionType == ES2Keys.Key._Dictionary) { DisplayDictionary(currentValue, valueType, header, currentTag); } else if (header.collectionType == ES2Keys.Key._List) { DisplayList(currentValue, valueType, header, currentTag); } else { EditorGUILayout.LabelField("The File Editor does not currently support Collections of this type."); } EditorGUI.indentLevel--; EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.EndScrollView(); // Save / Delete Tag Buttons EditorGUILayout.BeginHorizontal(); if (valueType != null) { if (GUILayout.Button("Save Tag", EditorStyles.toolbarButton)) { SaveCurrentTag(header); } } if (GUILayout.Button("Delete Tag", EditorStyles.toolbarButton)) { if (EditorUtility.DisplayDialog("Delete this Tag?", "Are you sure you want to permanently delete this tag?", "Delete Tag", "Cancel")) { DeleteCurrentTag(); } } // If adding something after 'delete tag', make sure tag hasn't been deleted first. EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } else { // There's not an ES2EditorType for this data. EditorGUILayout.LabelField("The File Editor does not currently support this type."); } } }
public System.Object ReadObject() { ES2Header header = ReadHeader(); ES2Type es2Type = ES2TypeManager.GetES2Type(header.valueType); // Handle encrypted data if (header.settings.encrypt) { // Handle non-encrypted data if (header.collectionType != ES2Keys.Key._Null) { if (header.collectionType == ES2Keys.Key._NativeArray) { return(ReadEncryptedArray <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._List) { return(ReadEncryptedList <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Queue) { return(ReadEncryptedQueue <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Stack) { return(ReadEncryptedStack <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._HashSet) { return(ReadEncryptedHashSet <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Dictionary) { ES2Type keyType = ES2TypeManager.GetES2Type(header.keyType); return(ReadEncryptedDictionary <System.Object, System.Object>(keyType, es2Type)); } } else { return(ReadEncrypted <System.Object>(es2Type)); } } else { // Handle non-encrypted data if (header.collectionType != ES2Keys.Key._Null) { if (header.collectionType == ES2Keys.Key._NativeArray) { return(ReadArray <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._List) { return(ReadList <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Queue) { return(ReadQueue <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Stack) { return(ReadStack <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._HashSet) { return(ReadHashSet <System.Object>(es2Type)); } else if (header.collectionType == ES2Keys.Key._Dictionary) { ES2Type keyType = ES2TypeManager.GetES2Type(header.keyType); return(ReadDictionary <System.Object, System.Object>(keyType, es2Type)); } } else { return(Read <System.Object>(es2Type)); } } return(null); }