Example #1
0
        public override void OnInspectorGUI()
        {
            GUILayout.Space(10);
            EditorGUILayout.HelpBox("This tile randomly chooses a sprite from the list below to render. It is based on position and the seed.", MessageType.Info);
            tile.globalSeed = EditorGUILayout.IntField("Global Seed:", tile.globalSeed);
            GUILayout.Space(10);

            GUILayout.BeginHorizontal();
            GUILayout.Label("Sprites:", MyStyles.leftBoldLabel);
            GUILayout.FlexibleSpace();
            GUI.color = new Color(0.5f, 1, 0.5f);
            if (GUILayout.Button("Add New"))
            {
                tile.sprites.Add(tile.sprites[tile.sprites.Count - 1]);
            }
            GUI.color = Color.white;
            GUILayout.EndHorizontal();
            GUILayout.Space(10);
            float width = EditorGUIUtility.labelWidth / 3;

            for (int i = 0; i < tile.sprites.Count; i++)
            {
                GUILayout.BeginHorizontal();
                if (!tile.IsValid)
                {
                    GUI.color = new Color(1, 0.5f, 0.5f);
                }
                if (GUILayout.Button(GUIContent.none, MyStyles.centerWhiteBoldLabel, GUILayout.Width(width), GUILayout.Height(width)))
                {
                    EditorGUIUtility.ShowObjectPicker <Sprite>(tile.sprites[i], false, "", i);
                }
                Rect r = GUILayoutUtility.GetLastRect();

                Texture2D texture = tile.IsValid ? tile.sprites[i].ToTexture2D() : new Texture2D(16, 16);
                GUI.DrawTexture(r, texture);
                GUI.color = Color.white;

                GUIStyle labelStyle = new GUIStyle(MyStyles.centerWhiteBoldLabel);
                if (!tile.sprites[i])
                {
                    GUI.Label(r, "Tile not valid!\nSprite cannot be left empty", labelStyle);
                }
                else if (!tile.IsValid)
                {
                    GUI.Label(r, "Tile not valid!\nEnable Read/Write in import settings", labelStyle);
                }

                GUILayout.FlexibleSpace();
                GUI.color = new Color(1, 0.5f, 0.5f);
                if (GUILayout.Button("Delete"))
                {
                    tile.sprites.RemoveAt(i);
                }
                GUI.color = Color.white;
                GUILayout.EndHorizontal();
                MyGUILayout.Splitter();
            }

            /*
             *          if (!tile.sprite)
             *                  EditorGUILayout.HelpBox ("This tile is not valid, main sprite (15) cannot be left empty.", MessageType.Error);
             *          else if (!tile.IsValid)
             *                  EditorGUILayout.HelpBox ("This tile is not valid, please check that Read/Write is enabled in the main sprite (15)'s import settings", MessageType.Error);
             */
            if (Event.current.commandName == "ObjectSelectorUpdated")
            {
                int index = EditorGUIUtility.GetObjectPickerControlID();
                tile.sprites[index] = EditorGUIUtility.GetObjectPickerObject() as Sprite;
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(this);
            }
        }
        private void ToolbarWindow(int id)
        {
            string text = "None";
            Rect   secondaryTileRect = new Rect(tileMap.toolbarWindowPosition.width - 5 - tileMap.toolbarWindowPosition.width * 0.4f, 25 + tileMap.toolbarWindowPosition.width * 0.4f, tileMap.toolbarWindowPosition.width * 0.4f, tileMap.toolbarWindowPosition.width * 0.4f);

            tileMap.secondaryTilePickerToggle = GUI.Toggle(secondaryTileRect, tileMap.secondaryTilePickerToggle, GUIContent.none, "Label");

            GUI.DrawTexture(secondaryTileRect, new Texture2D(16, 16));
            GUI.contentColor = Color.black;
            if (tileMap.secondaryTile)
            {
                GUI.DrawTexture(secondaryTileRect, tileMap.secondaryTile.GetIcon());
                GUI.contentColor = Color.white;
                text             = tileMap.secondaryTile.Name;
            }
            GUI.Label(secondaryTileRect, text, MyStyles.centerWhiteMiniLabel);

            Rect primaryTileRect = new Rect(5, 25, tileMap.toolbarWindowPosition.width * 0.6f, tileMap.toolbarWindowPosition.width * 0.6f);

            tileMap.primaryTilePickerToggle = GUI.Toggle(primaryTileRect, tileMap.primaryTilePickerToggle, GUIContent.none, "Label");

            text = "None";

            GUI.DrawTexture(primaryTileRect, new Texture2D(16, 16));
            GUI.contentColor = Color.black;
            if (tileMap.primaryTile)
            {
                GUI.DrawTexture(primaryTileRect, tileMap.primaryTile.GetIcon());
                GUI.contentColor = Color.white;
                text             = tileMap.primaryTile.Name;
            }
            GUI.Label(primaryTileRect, text, MyStyles.centerWhiteBoldLabel);
            GUI.contentColor = Color.white;

            float tileHeight = 10 + primaryTileRect.height + 0.5f * secondaryTileRect.height;

            GUILayout.Space(tileHeight);

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Swap [X]"))
            {
                Swap <ScriptableTile> (ref tileMap.primaryTile, ref tileMap.secondaryTile);
            }
            GUI.color = new Color(1, 0.5f, 0.5f);
            if (GUILayout.Button("Clear"))
            {
                tileMap.primaryTile   = null;
                tileMap.secondaryTile = null;
            }

            GUI.color = Color.white;
            GUILayout.EndHorizontal();

            MyGUILayout.Splitter();

            GUILayout.BeginHorizontal();

            GUI.enabled = tileMap.CanUndo;
            if (GUILayout.Button("Undo [Z]"))
            {
                tileMap.Undo();
                SetTileMapDirty();
            }
            GUI.enabled = tileMap.CanRedo;
            if (GUILayout.Button("Redo [R]"))
            {
                tileMap.Redo();
                SetTileMapDirty();
            }
            GUI.enabled = true;

            GUILayout.EndHorizontal();
            MyGUILayout.Splitter();


            GUILayout.Label("Tools", MyStyles.leftBoldLabel);
            EditorGUILayout.HelpBox("[RMB] to toggle tool", MessageType.Info, true);

            for (int i = 0; i < tileMap.scriptableToolCache.Count; i++)
            {
                bool selected = (i == tileMap.selectedScriptableTool);
                EditorGUI.BeginChangeCheck();
                string labelName = tileMap.scriptableToolCache [i].Shortcut != KeyCode.None ?
                                   string.Format("{1} [{0}]", tileMap.scriptableToolCache [i].Shortcut.ToString(), tileMap.scriptableToolCache [i].Name) :
                                   tileMap.scriptableToolCache [i].Name;

                GUIContent content = new GUIContent(labelName, tileMap.scriptableToolCache [i].Description);
                GUILayout.Toggle(selected, content, EditorStyles.radioButton, GUILayout.Width(100));
                if (EditorGUI.EndChangeCheck())
                {
                    tileMap.lastSelectedScriptableTool = tileMap.selectedScriptableTool;

                    tileMap.selectedScriptableTool = i;

                    if (selected)
                    {
                        tileMap.selectedScriptableTool = -1;
                    }
                }
            }
            if (tileMap.selectedScriptableTool == -1)
            {
                EditorGUILayout.HelpBox("No Tool selected, select one from above.", MessageType.Warning, true);
            }
            if (tileMap.selectedScriptableTool >= 0 && tileMap.selectedScriptableTool < tileMap.scriptableToolCache.Count)
            {
                const BindingFlags flags  = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;
                FieldInfo []       fields = tileMap.scriptableToolCache [tileMap.selectedScriptableTool].GetType().GetFields(flags);

                if (fields.Length > 0)
                {
                    GUILayout.Label("Settings", MyStyles.leftBoldLabel, GUILayout.Width(100));
                    for (int i = 0; i < fields.Length; i++)
                    {
                        FieldInfo field     = fields [i];
                        Type      type      = field.FieldType;
                        string    fieldName = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(field.Name);

                        GUILayout.BeginHorizontal(GUILayout.Width(100));
                        GUILayout.Label(fieldName, EditorStyles.miniLabel);
                        if (type == typeof(bool))
                        {
                            bool v  = (bool)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            bool nv = EditorGUILayout.Toggle(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(float))
                        {
                            float v  = (float)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            float nv = EditorGUILayout.FloatField(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(int))
                        {
                            int v  = (int)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            int nv = EditorGUILayout.IntField(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Enum))
                        {
                            int v  = (int)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            int nv = EditorGUILayout.IntField(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Vector2))
                        {
                            Vector2 v  = (Vector2)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            Vector2 nv = Vector2.zero;
                            nv.x = EditorGUILayout.FloatField(v.x);
                            nv.y = EditorGUILayout.FloatField(v.y);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Vector3))
                        {
                            Vector3 v  = (Vector3)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            Vector3 nv = Vector3.zero;
                            nv.x = EditorGUILayout.FloatField(v.x);
                            nv.y = EditorGUILayout.FloatField(v.y);
                            nv.z = EditorGUILayout.FloatField(v.z);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Color))
                        {
                            Color v  = (Color)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            Color nv = EditorGUILayout.ColorField(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(AnimationCurve))
                        {
                            AnimationCurve v  = (AnimationCurve)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            AnimationCurve nv = EditorGUILayout.CurveField(v);
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(GameObject))
                        {
                            GameObject v  = (GameObject)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            GameObject nv = EditorGUILayout.ObjectField(v, typeof(GameObject), false) as GameObject;
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Texture2D))
                        {
                            Texture2D v  = (Texture2D)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            Texture2D nv = EditorGUILayout.ObjectField(v, typeof(Texture2D), false) as Texture2D;
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(Sprite))
                        {
                            Sprite v  = (Sprite)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            Sprite nv = EditorGUILayout.ObjectField(v, typeof(Sprite), false) as Sprite;
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type == typeof(UnityEngine.Object))
                        {
                            UnityEngine.Object v  = (UnityEngine.Object)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            UnityEngine.Object nv = EditorGUILayout.ObjectField(v, typeof(UnityEngine.Object), false) as UnityEngine.Object;
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else if (type.IsEnum)
                        {
                            int v  = (int)field.GetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool]);
                            int nv = EditorGUILayout.Popup(v, Enum.GetNames(type));
                            field.SetValue(tileMap.scriptableToolCache [tileMap.selectedScriptableTool], nv);
                        }
                        else
                        {
                            Debug.LogErrorFormat("Exposing public variable type '{0}' is currently not supported by Tooles \n Feel free to add support for it though!", type.Name);
                        }
                        GUILayout.EndHorizontal();
                    }
                }
                else
                {
                    EditorGUILayout.HelpBox("Tool has no public variables to edit.", MessageType.Info, true);
                }
            }


            GUI.DragWindow();
        }