public static void DrawToggleField(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            bool result = EditorGUILayout.Toggle(_field.Name, (bool)_field.GetValue(comp));
            _field.SetValue(comp, result);
#endif
        }
        public override void PropertyDrawer(FieldInfo field, DIVisualComponent comp)
        {
            base.PropertyDrawer(field, comp);
            GetString _string = field.GetValue(comp) as GetString;

            DrawGetString(_string);
        }
        public static void DrawEnumPopup(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            var result = EditorGUILayout.EnumPopup(_field.Name, (System.Enum)_field.GetValue(comp));
            _field.SetValue(comp, result);
#endif
        }
        public static void DrawObjectField(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            UnityEngine.Object result = EditorGUILayout.ObjectField(_field.Name, (UnityEngine.Object)_field.GetValue(comp), _field.FieldType, true) as UnityEngine.Object;
            _field.SetValue(comp, result);
#endif
        }
Ejemplo n.º 5
0
        public override void PropertyDrawer(FieldInfo field, DIVisualComponent comp)
        {
            EditorGUILayout.LabelField(field.Name, EditorStyles.boldLabel);
            GetVariableBase _base = field.GetValue(comp) as GetVariableBase;

            DrawBaseVariable(_base);
        }
        public static void DrawStringField(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            string result = EditorGUILayout.TextField(_field.Name, (string)_field.GetValue(comp));
            _field.SetValue(comp, result);
#endif
        }
        public static void DrawFloatField(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            float result = EditorGUILayout.FloatField(_field.Name, (float)_field.GetValue(comp));
            _field.SetValue(comp, result);
#endif
        }
        public static void DrawConnectLine(this DIVisualComponent self, float percentageFromLeft, DIVisualComponent nextComponent)
        {
#if UNITY_EDITOR
            Vector2 fromPos = self.position.position + Vector2.right * self.position.width * percentageFromLeft + Vector2.up * self.position.height;
            Vector2 toPos   = nextComponent.position.position + Vector2.right * nextComponent.position.width / 2;
            if (DIVisualScriptingData.bezierLine)
            {
                UnityEditor.Handles.DrawBezier(fromPos, toPos, fromPos + Vector2.up * 50, toPos + Vector2.down * 50, Color.black, null, 2);
            }
            else
            {
                int midLine = (int)((toPos.y - fromPos.y) / 2);
                if (midLine < 0)
                {
                    midLine = 20;
                }
                Vector2 midPoint = fromPos + Vector2.up * midLine;
                Color   _color   = Handles.color;
                Handles.color = Color.black;
                Handles.DrawAAPolyLine(2, new Vector3[4] {
                    fromPos, midPoint, new Vector2(toPos.x, midPoint.y), toPos
                });
                Handles.color = _color;
            }
            UnityEditor.Handles.Label(fromPos - Vector2.right * 7, UnityEditor.EditorGUIUtility.Load("radio on") as Texture);
            UnityEditor.Handles.Label(toPos - Vector2.right * 7 + Vector2.down * 12, UnityEditor.EditorGUIUtility.Load("radio on") as Texture);
#endif
        }
        public static void DrawIntField(FieldInfo _fieldInt, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            int result = EditorGUILayout.IntField(_fieldInt.Name, (int)_fieldInt.GetValue(comp));
            _fieldInt.SetValue(comp, result);
#endif
        }
        public static void DrawGameObjectField(FieldInfo _field, DIVisualComponent comp)
        {
#if UNITY_EDITOR
            GameObject result = EditorGUILayout.ObjectField(_field.Name, (GameObject)_field.GetValue(comp), typeof(GameObject), true) as GameObject;
            _field.SetValue(comp, result);
#endif
        }
        /// <summary>
        /// Save current component
        /// </summary>
        /// <param name="self"></param>
        /// <param name="rootParent">null for saving, not null for export</param>
        /// <param name="previous">previous comp</param>
        /// <param name="autoAssignNextComponentOfPrevious">jadi result.previous.next akan diassign otomatis, jika component hasil dari percabangan (ex : branch, if) atur ke false untuk menonaktifkan automatisasi</param>
        public static DIVisualComponent _SaveComponent(this DIVisualComponent self, UnityEngine.Object rootParent, DIVisualComponent previous, bool autoAssignNextComponentOfPrevious = true)
        {
#if UNITY_EDITOR
            string debug = "";
            self.name  = string.IsNullOrEmpty(self.windowName) ? self.GetType().ToString() : self.windowName;
            self.name += " - " + DIVisualScriptingData.inspectRootField.Name;
            DIVisualComponent result = null;
            //export
            if (rootParent != null)
            {
                debug          += "Export ";
                result          = Object.Instantiate(self);
                result.previous = previous;
                if (autoAssignNextComponentOfPrevious)
                {
                    result.previous.next = result;
                }
                result.name = self.name;
                AssetDatabase.AddObjectToAsset(result, rootParent);
                debug += " - New";
            }
            //Save to scene
            else
            {
                if (UnityEditor.AssetDatabase.IsSubAsset(self) || UnityEditor.AssetDatabase.IsMainAsset(self))
                {
                    result      = Object.Instantiate(self);
                    result.name = self.name;
                    result.next = self.next;
                    if (previous != null)
                    {
                        result.previous = previous;
                        if (autoAssignNextComponentOfPrevious)
                        {
                            result.previous.next = result;
                        }
                    }
                    result.position = self.position;
                }
                else
                {
                    result = self;
                }
                debug += "Saved";
            }

            debug += " - " + self.name;

#if DI_DEBUG
            Debug.Log(debug);
#endif

            if (result.next != null)
            {
                result.next.SaveComponent(rootParent, result);
            }
            return(result);
#endif
        }
        public static void DrawField(FieldInfo _fieldInfo, DIVisualComponent comp, bool ignoreNotSupportedType)
        {
#if UNITY_EDITOR
            if (_fieldInfo.FieldType == typeof(int))
            {
                DrawIntField(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType == typeof(float))
            {
                DrawFloatField(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType == typeof(string))
            {
                DrawStringField(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType == typeof(bool))
            {
                DrawToggleField(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType.BaseType == typeof(System.Enum))
            {
                DrawEnumPopup(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType == typeof(GameObject))
            {
                DrawGameObjectField(_fieldInfo, comp);
            }
            else if (_fieldInfo.FieldType.IsSubclassOf(typeof(UnityEngine.Object)))
            {
                DrawObjectField(_fieldInfo, comp);
            }

            /* TODO : Array or List Property Drawer
             * else if (typeof(IList).IsAssignableFrom(_fieldInfo.FieldType)) {
             *      EditorGUILayout.HelpBox("Array are not supported", MessageType.Warning);
             *      DrawList(_fieldInfo, comp);
             * }
             */
            else
            {
                bool founded = false;
                foreach (DIAttributeData.VSCustomPropertyDrawerAttributeData att in DIAttributeData.Instance.propertyDrawers)
                {
                    if (_fieldInfo.FieldType == att.att.type)
                    {
                        att.type.GetMethod("PropertyDrawer").Invoke(att.instance, new object[2] {
                            _fieldInfo, comp
                        });
                        founded = true;
                    }
                }
                if (!founded && !ignoreNotSupportedType)
                {
                    EditorGUILayout.HelpBox(_fieldInfo.FieldType + " : are not supported", MessageType.Warning);
                }
            }
#endif
        }
Ejemplo n.º 13
0
        DIVisualComponent AddBranch()
        {
            DIVisualComponent comp = (DIVisualComponent.CreateInstance <DIVisualComponent>());

            comp.previous           = this;
            comp.position           = position;
            comp.position.position += Vector2.up * (position.height + 45);
            return(comp);
        }
Ejemplo n.º 14
0
        void RemoveBranch(int index)
        {
            DIVisualComponent removedComp = splitedComponent[index];

            if (removedComp != null)
            {
                removedComp.FindChildAndDestroy();
            }
            splitedComponent.RemoveAt(index);
        }
Ejemplo n.º 15
0
        void RemoveBranch()
        {
            DIVisualComponent removedComp = splitedComponent[splitedComponent.Count - 1];

            if (removedComp != null)
            {
                removedComp.FindChildAndDestroy();
            }
            splitedComponent.RemoveAt(splitedComponent.Count - 1);
        }
        /// <summary>
        /// Change the current component without delete existing
        /// </summary>
        public void changeThisComponent(DIVisualComponent withThis)
        {
            withThis.position = position;

            //Set next Component neighbor
            if (next != null)
            {
                withThis.next = next;
                next.previous = withThis;
            }

            //if previous not null, set the previous component next to new component
            if (previous != null)
            {
                withThis.previous = previous;
                if (previous.next == this)
                {
                    previous.next = withThis;
                }
                else
                {
                    //use refelection to get real field name, because on previous component not always connected to next, like DICompare, can connected to true event
                    foreach (FieldInfo info in previous.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic))
                    {
                        //looping with fieldinfo of previous component
                        //if fieldInfo is DIVisualComponent
                        if (info.FieldType == typeof(DIVisualComponent) || info.FieldType.IsSubclassOf(typeof(DIVisualComponent)))
                        {
                            //Cast as DIVC
                            DIVisualComponent target = info.GetValue(previous) as DIVisualComponent;
                            //Check if target is same with this component
                            if (target == this)
                            {
                                //true means FieldInfo connected with this
                                //so we need to set the field info with the newComp
                                info.SetValue(previous, withThis);
                                break;
                            }
                        }
                        else if (info.FieldType == typeof(List <DIVisualComponent>))
                        {
                            List <DIVisualComponent> comps = info.GetValue(previous) as List <DIVisualComponent>;
                            for (int i = 0; i < comps.Count; i++)
                            {
                                if (comps[i] == this)
                                {
                                    comps[i] = withThis;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
 void ComponentTypePopup()
 {
     _tempReplaceComp = this.ComponentChooser();
     if (_tempReplaceComp != null)
     {
         if (_tempReplaceComp.GetType() != GetType())
         {
             DIVisualScriptingData.atTheEnd += changeThisComponentWithDestroy;
         }
     }
 }
        public static DIVisualComponent ComponentChooser(this DIVisualComponent self)
        {
#if UNITY_EDITOR
            int i = EditorGUILayout.Popup(0, DIAttributeData.Instance.componentPathPopup.ToArray());
            if (i != 0)
            {
                DIVisualComponent next = ScriptableObject.CreateInstance(DIAttributeData.Instance.componentsWithAttribute[i - 1]) as DIVisualComponent;
                return(next);
            }
#endif
            return(null);
        }
Ejemplo n.º 19
0
        public override DIVisualComponent SaveComponent(Object rootParent, DIVisualComponent previous, bool autoAssignNextComponentOfPrevious = true)
        {
            FloatCompare result = base.SaveComponent(rootParent, previous, autoAssignNextComponentOfPrevious) as FloatCompare;

            if (trueEvent != null)
            {
                result.trueEvent = trueEvent.SaveComponent(rootParent, result, false);
            }
            if (falseEvent != null)
            {
                result.falseEvent = falseEvent.SaveComponent(rootParent, result, false);
            }
            return(result);
        }
 /// <summary>
 /// Create button to connect other Visual Component
 /// </summary>
 /// <param name="comp">Component will be connected as child, null to make creation mode, not null to insert mode</param>
 /// <param name="nextStr">Next button name</param>
 /// <param name="insertStr">Insert button name</param>
 protected void ConnectButtonFunc(ref DIVisualComponent comp, string nextStr, string insertStr, GUIStyle style = null)
 {
     if (style == null)
     {
         style = new GUIStyle(GUI.skin.button);
     }
     if (comp == null)
     {
         if (GUILayout.Button(nextStr, style))
         {
             //DIVisualScriptingWindow.Window.inspectTarget.start.components.Add(DIVisualComponent.CreateInstance<DIVisualComponent>());
             comp                    = (DIVisualComponent.CreateInstance <DIVisualComponent>());
             comp.previous           = this;
             comp.position           = position;
             comp.position.position += Vector2.up * (position.height + 45);
         }
     }
     else
     {
         if (GUILayout.Button(insertStr, style))
         {
             //DIVisualScriptingWindow.Window.inspectTarget.start.components.Add(DIVisualComponent.CreateInstance<DIVisualComponent>());
             DIVisualComponent _backupNext = comp;
             comp                    = (DIVisualComponent.CreateInstance <DIVisualComponent>());
             comp.previous           = this;
             comp.position           = position;
             comp.position.position += Vector2.up * (position.height + 45);
             comp.next               = _backupNext;
             comp.next.previous      = comp;
             if (_backupNext.position.y == comp.position.y)
             {
                 _backupNext.position.y += 40;
             }
         }
     }
 }
Ejemplo n.º 21
0
        public override DIVisualComponent SaveComponent(UnityEngine.Object rootParent, DIVisualComponent previous = null, bool autoAssignNextComponentOfPrevious = true)
        {
            DIBranch _branch = base.SaveComponent(rootParent, previous, autoAssignNextComponentOfPrevious) as DIBranch;

            for (int i = 0; i < splitedComponent.Count; i++)
            {
                if (splitedComponent[i] != null)
                {
                    //splitedComponent[i].SaveComponent(rootParent, this);
                    _branch.splitedComponent[i] = splitedComponent[i].SaveComponent(rootParent, _branch, false);
                }
                else
                {
                    RemoveBranch(i);
                }
            }
            return(_branch);
        }
Ejemplo n.º 22
0
        public override void PropertyDrawer(FieldInfo field, DIVisualComponent comp)
        {
            base.PropertyDrawer(field, comp);
            GetInt _int = field.GetValue(comp) as GetInt;

            if (_int.getFrom != GetFrom.Exact)
            {
                if (_int.targetObj == null)
                {
                    return;
                }
                var fieldInfos = _int.targetObj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance).ToList();
                for (int i = 0; i < fieldInfos.Count; i++)
                {
                    if (fieldInfos[i].FieldType == typeof(int) || fieldInfos[i].FieldType == typeof(DIVariableInt) ||
                        (typeof(IList).IsAssignableFrom(fieldInfos[i].FieldType) &&
                         (fieldInfos[i].FieldType == typeof(int[]) || fieldInfos[i].FieldType == typeof(DIVariableInt[]) ||
                          (fieldInfos[i].FieldType == typeof(List <int>) || fieldInfos[i].FieldType == typeof(List <DIVariableInt>))
                         )))
                    {
                        //DO NOTHING
                    }
                    else
                    {
                        fieldInfos.RemoveAt(i);
                        i -= 1;
                    }
                }

                var fieldInfoName = fieldInfos.Select(i => i.Name).ToList();
                if (fieldInfoName.Count == 0)
                {
                    fieldInfoName.Add("");
                }
                int fieldIdx = fieldInfoName.IndexOf(_int.fieldName);
                if (fieldIdx < 0)
                {
                    fieldIdx = 0;
                }
                fieldIdx       = EditorGUILayout.Popup("Field", fieldIdx, fieldInfoName.ToArray());
                _int.fieldName = fieldInfoName[fieldIdx];

                if (fieldInfos.Count == 0)
                {
                    return;
                }

                if (typeof(IList).IsAssignableFrom(fieldInfos[fieldIdx].FieldType))
                {
                    if (_int.indexArray > ((IList)fieldInfos[fieldIdx].GetValue(_int.targetObj)).Count)
                    {
                        _int.indexArray = ((IList)fieldInfos[fieldIdx].GetValue(_int.targetObj)).Count - 1;
                    }
                    List <string> fieldArrayNames = new List <string>();
                    var           fieldArray      = ((IList)fieldInfos[fieldIdx].GetValue(_int.targetObj));

                    //If regular, just show index
                    if (fieldInfos[fieldIdx].FieldType == typeof(int[]) || (fieldInfos[fieldIdx].FieldType == typeof(List <int>)))
                    {
                        for (int i = 0; i < fieldArray.Count; i++)
                        {
                            fieldArrayNames.Add("Index - " + i.ToString());
                        }
                        if (fieldArrayNames.Count == 0)
                        {
                            fieldArrayNames.Add("");
                        }
                        _int.indexArray = EditorGUILayout.Popup("Index", _int.indexArray, fieldArrayNames.ToArray());
                    }
                    //if DIVar show varname
                    else if (fieldInfos[fieldIdx].FieldType == typeof(DIVariableInt[]) || fieldInfos[fieldIdx].FieldType == typeof(List <DIVariableInt>))
                    {
                        for (int i = 0; i < fieldArray.Count; i++)
                        {
                            fieldArrayNames.Add(((DIVariableInt)fieldArray[i]).varName);
                        }
                        if (fieldArrayNames.Count == 0)
                        {
                            fieldArrayNames.Add("");
                        }
                        _int.indexArray = EditorGUILayout.Popup("Index", _int.indexArray, fieldArrayNames.ToArray());
                    }
                }
                else
                {
                    _int.indexArray = -1;
                }
            }
            //Exact value
            else
            {
                _int.exactValue = EditorGUILayout.IntField("Value", _int.exactValue);
            }
        }
        public override void PropertyDrawer(FieldInfo field, DIVisualComponent comp)
        {
            GetMethod _method = field.GetValue(comp) as GetMethod;

            //shifting to left
            _method.bindingFlags = (BindingFlags)((int)_method.bindingFlags << 1);
            _method.bindingFlags = (System.Reflection.BindingFlags)EditorGUILayout.MaskField(new GUIContent("Binding Flags"), (int)_method.bindingFlags, System.Enum.GetNames(typeof(BindingFlags)));
            //shifting to right, to the right value
            _method.bindingFlags = (BindingFlags)((int)_method.bindingFlags >> 1);

            GameObject oldGo = _method.target;

            _method.target = EditorGUILayout.ObjectField("Target", _method.target, typeof(GameObject), true) as GameObject;
            if (oldGo != _method.target)
            {
                _method.monoscript = null;
            }
            if (_method.target != null)
            {
                //Draw Monobehaviour
                var           monoBehaviours     = _method.target.GetComponents <MonoBehaviour>().ToList();
                List <string> monoBehaviourNames = new List <string>();
                for (int i = 0; i < monoBehaviours.Count; i++)
                {
                    monoBehaviourNames.Add("(" + i.ToString() + ")" + monoBehaviours[i].ToString().Replace(_method.target.name, ""));
                }
                int monoscriptIdx = monoBehaviours.IndexOf(_method.monoscript);
                if (monoscriptIdx < 0)
                {
                    monoscriptIdx = 0;
                }
                if (monoBehaviourNames.Count == 0)
                {
                    monoBehaviourNames.Add("");
                }
                monoscriptIdx = EditorGUILayout.Popup("Script", monoscriptIdx, monoBehaviourNames.ToArray());
                if (monoBehaviours.Count != 0)
                {
                    _method.monoscript = monoBehaviours[monoscriptIdx];
                }
            }

            if (_method.monoscript != null)
            {
                //draw method
                var methodNames = _method.monoscript.GetType().GetMethods(_method.bindingFlags).Select(i => i.Name).ToList();
                int methodIdx   = methodNames.IndexOf(_method.methodName);
                if (methodIdx == -1)
                {
                    methodIdx = 0;
                }
                if (methodNames.Count == 0)
                {
                    methodNames.Add("");
                }
                methodIdx          = EditorGUILayout.Popup("Method", methodIdx, methodNames.ToArray());
                _method.methodName = methodNames[methodIdx];
            }

            field.SetValue(comp, _method);
        }
 public override DIVisualComponent SaveComponent(Object rootParent, DIVisualComponent previous = null, bool autoAssignNextComponentOfPrevious = true)
 {
     return(base.SaveComponent(rootParent, previous, autoAssignNextComponentOfPrevious));
 }
Ejemplo n.º 25
0
 void DoubleClickGenerateRoot()
 {
     if (Event.current.clickCount >= 2)
     {
         DIVisualScriptingData.inspectRootField.SetValue(DIVisualScriptingData.inspectTarget, DIVisualComponent.CreateInstance <DIRootComponent>() as DIRootComponent);
         inspectRoot.position.position = Event.current.mousePosition;
     }
 }
 public virtual void PropertyDrawer(FieldInfo field, DIVisualComponent comp)
 {
 }
        /// <summary>
        /// Function to show component window
        /// </summary>
        /// <param name="component"></param>
        public static void ShowWindow(this DIVisualComponent component)
        {
#if UNITY_EDITOR
            UnityEditor.EditorGUI.BeginChangeCheck();
            UnityEditor.Undo.RecordObject(component, "Undo Visual Scripting");

            DIVisualScriptingData.currentWindowControl += 1;

            //Draw Window
            if (!component.isRemoveAction)
            {
                component.position = GUILayout.Window(DIVisualScriptingData.currentWindowControl, component.position, component.BuildWindow, component.windowName, GUILayout.Width(200), GUILayout.Height(20));
            }
            else
            {
                component.position = GUILayout.Window(DIVisualScriptingData.currentWindowControl, component.position, component.RemoveAction, component.windowName, GUILayout.Width(200), GUILayout.Height(20));
            }

            //normalize the value, because window only accept pixel, floating number will blur the content
            component.position = new Rect((int)component.position.x, (int)component.position.y, (int)component.position.width, (int)component.position.height);

            if (AssetDatabase.IsMainAsset((UnityEngine.Object)(DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget)))
                ||
                AssetDatabase.IsSubAsset((UnityEngine.Object)(DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget))))
            {
                GUI.Box(new Rect(component.position.x - 4, component.position.y - 4, component.position.width + 8, component.position.height + 8), MakeTexture((int)component.position.width + 8, (int)component.position.height + 8, Color.red), GUIStyle.none);
            }
            #region DEPRECATED

            /* Draw Box when new component Added
             * if (!Application.isPlaying && (DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget) as DIRootComponent).saveState != DIRootComponent.SaveState.Scene)
             * {
             *      //If not subasset,
             *      if (!AssetDatabase.IsSubAsset(component) &&
             *              //and the inspectorRoot is sub asset, means this asset is child of prefab
             *              (AssetDatabase.IsSubAsset((DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget) as DIRootComponent))
             *              //or if not main asset, that means prefab too
             || AssetDatabase.IsMainAsset((DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget) as DIRootComponent)))
             ||             )
             ||     {
             ||             //check again if inspectRoot doesn't have next and inspectRoot is Main Asset
             ||             if (AssetDatabase.IsMainAsset((DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget) as DIRootComponent)) && (DIVisualScriptingData.inspectRootField.GetValue(DIVisualScriptingData.inspectTarget) as DIRootComponent) == component && component.next == null)
             ||             {
             ||                     //Do not draw anything
             ||             }
             ||             else
             ||                     //then mark it with box, so we now if this component not saved yet
             ||                     GUI.Box(new Rect(component.position.x - 4, component.position.y - 4, component.position.width + 8, component.position.height + 8), MakeTexture((int)component.position.width + 8, (int)component.position.height + 8, Color.red), GUIStyle.none);
             ||     }
             ||}*/
            #endregion

            /* TO DO : Debugging window when application.isplaying
             * else if (isRunning) {
             *      //Draw blue rect for indicating current component is running
             *      GUI.Box(new Rect(_comp.position.x - 4, _comp.position.y - 4, _comp.position.width + 8, _comp.position.height + 8), DI.DIEditorHelper.MakeTexture((int)_comp.position.width + 8, (int)_comp.position.height + 8, Color.blue), GUIStyle.none);
             * }*/


            //Create side button
            Rect removeBtnRect = new Rect(component.position.x + component.position.width, component.position.y, 15, 15);
            if (GUI.Button(removeBtnRect, DIVisualScriptingData.removeTex, GUIStyle.none))
            {
                //Show Popup yes or no
                component.isRemoveAction = true;
            }
            Rect minimizeBtnRect = new Rect(component.position.x - 15, component.position.y, 15, 15);
            if (GUI.Button(minimizeBtnRect, component.isMinimize ? DIVisualScriptingData.maximizeTex : DIVisualScriptingData.minimizeTex, GUIStyle.none))
            {
                //Show Popup yes or no
                component.isMinimize = !component.isMinimize;
            }

            //Show next window
            if (component.next != null)
            {
                component.next.ShowWindow();
            }

            //function can be overriding to draw custom things
            component.LateShowWindow();


            if (UnityEditor.EditorGUI.EndChangeCheck())
            {
                UnityEditor.EditorUtility.SetDirty(component);
            }
#endif
        }
        //TO DO : Supported List / array

        /*
         * public static void DrawList(FieldInfo _field, DIVisualComponent comp)
         * {
         #if UNITY_EDITOR
         *      EditorGUILayout.LabelField(_field.Name, EditorStyles.boldLabel);
         *      var list = ((IList)_field.GetValue(comp));
         *      EGLBeginHorizontal();
         *      GUI.enabled = false;
         *      EditorGUILayout.IntField("Size", list.Count);
         *      GUI.enabled = true;
         *      if (GUILayout.Button("+"))
         *              list.Add(null);
         *      if (GUILayout.Button("-"))
         *              list.RemoveAt(list.Count - 1);
         *      EGLEndHorizontal();
         *      System.Type type = null;
         *      for (int i = 0; i < list.Count; i++) {
         *              if (type == null)
         *                      type = list[i].GetType();
         *              if (type == typeof(int))
         *                      DrawIntField(i.ToString(), (int)list[i]);
         *              else if (type == typeof(float))
         *                      DrawFloatField(i.ToString(), (float)list[i]);
         *              else if (type == typeof(string))
         *                      DrawStringField(i.ToString(), (string)list[i]);
         *              else if (type == typeof(bool))
         *                      DrawToggleField(i.ToString(), (bool)list[i]);
         *              else if (type == typeof(System.Enum))
         *                      DrawEnumPopup(i.ToString(), (System.Enum)list[i]);
         *              else if (type == typeof(GameObject))
         *                      DrawGameObjectField(i.ToString(), (GameObject)list[i]);
         *              else if (type == typeof(Object))
         *                      DrawObjectField(i.ToString(), (Object)list[i]);
         *              else {
         *                      EditorGUILayout.HelpBox("Type : " + type.ToString() + " not Supported!", MessageType.Warning);
         *              }
         *      }
         #endif
         * }
         *
         * public static int DrawIntField(string label, int value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.IntField(label, value);
         #endif
         * }
         * public static string DrawStringField(string label, string value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.TextField(label, value);
         #endif
         * }
         * public static float DrawFloatField(string label, float value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.FloatField(label, value);
         #endif
         * }
         * public static System.Enum DrawEnumPopup(string label, System.Enum selected)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.EnumPopup(label, selected);
         #endif
         * }
         * public static bool DrawToggleField(string label, bool value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.Toggle(label, value);
         #endif
         * }
         * public static GameObject DrawGameObjectField(string label, GameObject value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.ObjectField(label, value, typeof(GameObject), true) as GameObject;
         #endif
         * }
         * public static Object DrawObjectField(string label, Object value)
         * {
         #if UNITY_EDITOR
         *      return EditorGUILayout.ObjectField(label, value, typeof(UnityEngine.Object), true) as UnityEngine.Object;
         #endif
         * }*/

        public static FieldInfo[] GatherFieldInfos(DIVisualComponent comp)
        {
            return(comp.GetType().GetFields(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance));
        }
 /// <summary>
 /// Save Component to disk or scene
 /// </summary>
 /// <param name="rootParent">Root, can be .asset / prefab / null</param>
 /// <param name="previous">fill only if you want to duplicate mode</param>
 /// <param name="autoAssignNextComponentOfPrevious">jadi result.previous.next akan diassign otomatis, jika component hasil dari percabangan (ex : branch, if) atur ke false untuk menonaktifkan automatisasi</param>
 public virtual DIVisualComponent SaveComponent(UnityEngine.Object rootParent, DIVisualComponent previous, bool autoAssignNextComponentOfPrevious = true)
 {
     return(this._SaveComponent(rootParent, previous, autoAssignNextComponentOfPrevious));
 }