using UnityEngine; using UnityEditor; using System.Collections.Generic; using System; using System.IO; using System.Reflection; using Mapbox.Unity; using Mapbox.Unity.Map; namespace Mapbox.Editor { /// /// Pop up menu for selecting, creating and assigning modifier instances to AbstractMap. /// public class PopupSelectionMenu : PopupWindowContent { private Type _type; private List _modTypes; private SerializedProperty _finalize; private Vector2 _scrollPos; public override Vector2 GetWindowSize() { return new Vector2(250, 250); } public override void OnGUI(Rect rect) { if (_modTypes == null || _modTypes.Count == 0) { _modTypes = new List(); AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assemblies = currentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { Type[] types = assemblies[i].GetTypes(); for (int j = 0; j < types.Length; j++) { if (types[j].IsSubclassOf(_type)) { _modTypes.Add(types[j]); } } } } GUILayout.Label(String.Format("{0}s", _type.Name), EditorStyles.boldLabel); var st = new GUIStyle(); st.padding = new RectOffset(0, 0, 15, 15); _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, st); for (int i = 0; i < _modTypes.Count; i++) { Type asset = _modTypes[i]; if (asset == null) //yea turns out this can happen continue; var style = GUI.skin.button; style.alignment = TextAnchor.MiddleLeft; string shortTypeName = GetShortTypeName(asset.ToString()); if (GUILayout.Button(shortTypeName, style)) { CreateNewModiferInstance(asset, shortTypeName); editorWindow.Close(); } } EditorGUILayout.EndScrollView(); } /// /// Gets the short name of the type. /// /// The short type name. /// Input. private string GetShortTypeName(string input) { int pos = input.LastIndexOf(".", StringComparison.CurrentCulture) + 1; return input.Substring(pos, input.Length - pos); } /// /// Creates the new modifer instance. /// /// Type. /// Name. private void CreateNewModiferInstance(Type type, string name) { var modifierInstance = ScriptableObject.CreateInstance(type); string pathCandidate = Constants.Path.MAPBOX_USER_MODIFIERS; if (!Directory.Exists(pathCandidate)) { string userFolder = Constants.Path.MAPBOX_USER; if (!Directory.Exists(userFolder)) { string parentPath = System.IO.Path.Combine("Assets", "Mapbox"); AssetDatabase.CreateFolder(parentPath, "User"); } AssetDatabase.CreateFolder(userFolder, "Modifiers"); } foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) { pathCandidate = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(pathCandidate) && File.Exists(pathCandidate)) { pathCandidate = Path.GetDirectoryName(pathCandidate); break; } } string combinedPath = string.Format("{0}{1}.asset", Path.Combine(pathCandidate, "New"), name); string uniqueAssetPath = AssetDatabase.GenerateUniqueAssetPath(combinedPath); modifierInstance.name = name; AssetDatabase.CreateAsset(modifierInstance, uniqueAssetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); AddNewInstanceToArray(modifierInstance); Debug.Log(string.Format("Created new {0} modifer at {1}", name, uniqueAssetPath)); } /// /// Adds the new instance to array. /// /// Object. public void AddNewInstanceToArray(object obj) { ScriptableObject asset = obj as ScriptableObject; _finalize.arraySize++; _finalize.GetArrayElementAtIndex(_finalize.arraySize - 1).objectReferenceValue = asset; MapboxDataProperty mapboxDataProperty = (MapboxDataProperty)EditorHelper.GetTargetObjectWithProperty(_finalize); if (_finalize.serializedObject.ApplyModifiedProperties() && mapboxDataProperty != null) { mapboxDataProperty.HasChanged = true; } } /// /// Initializes a new instance of the class. /// /// T. /// P. public PopupSelectionMenu(Type t, SerializedProperty p) { _type = t; _finalize = p; } } }