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);
        }
Exemplo n.º 2
0
        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();
            }
        }