void OnAddElementGUI(Rect rect, ComposableObject composableObject) { bool Filter(MonoScript script) { var scriptClass = script.GetClass(); if (scriptClass == null) { return(false); } return(!scriptClass.IsAbstract && scriptClass.IsSubclassOf(composableObject.ElementType)); } ScriptableObject CreateFromScript(MonoScript script) { if (!script) { return(null); } if (script.GetClass() == null) { return(null); } var instance = (ComposableElement)CreateInstance(script.GetClass()); instance.name = script.GetClass().Name; var prop = dataArray.GetArrayElementAtIndex(dataArray.arraySize++); AddSubAsset(instance, prop, target); return(instance); } AddScriptWindow.Show(rect, composableObject.ElementType, CreateFromScript, Filter, composableObject.ElementTemplate); }
void OnAddElementGUI(Rect rect, ComposableObject composableObject) { var createFromScript = new Func <MonoScript, ScriptableObject>((script) => { if (!script) { return(null); } if (script.GetClass() == null) { return(null); } var instance = (ComposableElement)CreateInstance(script.GetClass()); instance.name = script.GetClass().Name; composableObject.InsertElement(instance, dataArray.arraySize); return(instance); }); if (AddComposableElementWindow.HasAssetToAdd()) { AddComposableElementWindow.Backup(createFromScript); } if (GUI.Button(rect, $"Add {ObjectNames.NicifyVariableName(composableObject.ElementType.Name)}")) { if (popup && HasFlag(Event.current.modifiers, EventModifiers.Control)) { popup.StaysOpen = false; popup.Focus(); popup = null; return; } var fudge = EditorGUIUtility.currentViewWidth % 2 == 0 ? 0 : 1; var windowRect = new Rect(rect.x - fudge, rect.y + rect.height, rect.width, 200); var minXY = GUIUtility.GUIToScreenPoint(windowRect.min); windowRect = new Rect(minXY.x, minXY.y, windowRect.width, windowRect.height); popup = CreateInstance <AddComposableElementWindow>(); popup.position = windowRect; popup.StaysOpen = HasFlag(Event.current.modifiers, EventModifiers.Control); popup.ScriptTemplate = composableObject.ElementTemplate; popup.Filter = (MonoScript script) => { var scriptClass = script.GetClass(); if (scriptClass == null) { return(false); } if (scriptClass.IsAbstract) { return(false); } if (scriptClass.GetCustomAttributes(true).OfType <HideFromScriptWindow>().Any()) { return(false); } if (!composableObject.SupportsType(scriptClass)) { return(false); } return(true); }; popup.Create = createFromScript; var IconName = $"TK_{composableObject.GetType().Name}_Icon"; var icon = AssetDatabase.FindAssets($"t:Texture2D {IconName}", searchFolders) .Select(AssetDatabase.GUIDToAssetPath) .Select(AssetDatabase.LoadAssetAtPath <Texture2D>) .FirstOrDefault(); popup.ScriptIcon = icon; popup.ShowPopup(); } }