public static void SizeSceneGUI(SizePositionCategory category, IPlatformLayer layer, ISizeData roomSize)
        {
            if (category == SizePositionCategory.None)
            {
                return;
            }
            var             bounds = GetBounds(layer);
            var             button = DrawSizePositionHandles(category, bounds);
            SizePositionMod mod    = default;

            SizeToolsButtonToData(category, button, ref mod);
            ApplySizeTool(layer, layer, roomSize, mod);
        }
        static SizePositionButton DrawSizePositionHandles(SizePositionCategory category, Bounds bounds)
        {
            var minX = bounds.min.x;
            var maxX = bounds.max.x;
            var minZ = bounds.min.z;
            var maxZ = bounds.max.z;
            var c    = bounds.center;

            var isSizeTool = category == SizePositionCategory.Size;
            var size       = 1.5f;
            var pickSize   = 2f;
            var offset     = isSizeTool ? 5f : 2f;
            var l          = new Vector3(minX - offset, c.y, c.z);
            var r          = new Vector3(maxX + offset, c.y, c.z);
            var t          = new Vector3(c.x, c.y, maxZ + offset);
            var b          = new Vector3(c.x, c.y, minZ - offset);

            var button = SizePositionButton.None;

            using (new ColorScope(Color.magenta))
                if (Handles.Button(l, Quaternion.Euler(0f, -90f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.Left;
                }
            using (new ColorScope(Color.red))
                if (Handles.Button(r, Quaternion.Euler(0f, 90f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.Right;
                }
            using (new ColorScope(Color.blue))
                if (Handles.Button(t, Quaternion.Euler(0f, 0f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.Up;
                }
            using (new ColorScope(Color.cyan))
                if (Handles.Button(b, Quaternion.Euler(0f, 180f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.Down;
                }

            if (!isSizeTool)
            {
                return(button);
            }
            offset = 2f;
            l      = new Vector3(minX - offset, c.y, c.z);
            r      = new Vector3(maxX + offset, c.y, c.z);
            t      = new Vector3(c.x, c.y, maxZ + offset);
            b      = new Vector3(c.x, c.y, minZ - offset);

            using (new ColorScope(Color.magenta))
                if (Handles.Button(r, Quaternion.Euler(0f, -90f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.SizeRightEdgeLeft;
                }

            using (new ColorScope(Color.red))
                if (Handles.Button(l, Quaternion.Euler(0f, 90f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.SizeLeftEdgeRight;
                }

            using (new ColorScope(Color.blue))
                if (Handles.Button(b, Quaternion.Euler(0f, 0f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.SizeBottomUp;
                }

            using (new ColorScope(Color.cyan))
                if (Handles.Button(t, Quaternion.Euler(0f, 180f, 0f), size, pickSize, Handles.ConeHandleCap))
                {
                    button = SizePositionButton.SizeTopDown;
                }

            return(button);
        }
        static void SizeToolsButtonToData(SizePositionCategory cat, SizePositionButton button, ref SizePositionMod mod)
        {
            switch (cat)
            {
            case SizePositionCategory.Size: switch (button)
                {
                case SizePositionButton.SizeTopUp:
                    mod.SizeModifier = Vector2Int.up;
                    break;

                case SizePositionButton.SizeTopDown:
                    mod.SizeModifier = Vector2Int.down;
                    break;

                case SizePositionButton.SizeLeftEdgeRight:
                    mod.SizeModifier = Vector2Int.left;
                    mod.PosModifier  = Vector2Int.right;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeLeftEdgeLeft:
                    mod.SizeModifier = Vector2Int.right;
                    mod.PosModifier  = Vector2Int.left;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeRightEdgeRight:
                    mod.SizeModifier = Vector2Int.right;
                    break;

                case SizePositionButton.SizeRightEdgeLeft:
                    mod.SizeModifier = Vector2Int.left;
                    break;

                case SizePositionButton.SizeBottomDown:
                    mod.SizeModifier = Vector2Int.up;
                    mod.PosModifier  = Vector2Int.down;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeBottomUp:
                    mod.SizeModifier = Vector2Int.down;
                    mod.PosModifier  = Vector2Int.up;
                    mod.SpecialCase  = true;
                    break;
                }
                break;

            case SizePositionCategory.Position: switch (button)
                {
                case SizePositionButton.Left: mod.PosModifier = Vector2Int.left; break;

                case SizePositionButton.Up: mod.PosModifier = Vector2Int.up; break;

                case SizePositionButton.Down: mod.PosModifier = Vector2Int.down; break;

                case SizePositionButton.Right: mod.PosModifier = Vector2Int.right; break;
                }
                break;

            case SizePositionCategory.Tiles: switch (button)
                {
                case SizePositionButton.Left: mod.TileModifier = Vector2Int.left; break;

                case SizePositionButton.Up: mod.TileModifier = Vector2Int.up; break;

                case SizePositionButton.Down: mod.TileModifier = Vector2Int.down; break;

                case SizePositionButton.Right: mod.TileModifier = Vector2Int.right; break;
                }
                break;
            }
        }
 public static void SizeToolsCategoryGUI(ref SizePositionCategory cat) => cat = (SizePositionCategory)EditorGUILayout.EnumPopup("Size/Position: ", cat);
        // ReSharper disable once MethodTooLong
        static SizePositionButton SizeToolsInnerGUI(out SizePositionCategory cat, out SizePositionButton button)
        {
            cat    = SizePositionCategory.None;
            button = SizePositionButton.None;

            using (new GUILayout.HorizontalScope())
            {
                using (new GUILayout.VerticalScope())
                {
                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(57);
                        if (GUILayout.Button("^", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeTopUp;
                        }
                    }
                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(57);
                        if (GUILayout.Button("v", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeTopDown;
                        }
                    }
                    using (new GUILayout.HorizontalScope())
                    {
                        if (GUILayout.Button("<", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeLeftEdgeLeft;
                        }
                        if (GUILayout.Button(">", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeLeftEdgeRight;
                        }
                        GUILayout.Label("Size", GUILayout.Width(30));
                        if (GUILayout.Button("<", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeRightEdgeLeft;
                        }
                        if (GUILayout.Button(">", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeRightEdgeRight;
                        }
                    }
                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(57);
                        if (GUILayout.Button("^", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeBottomUp;
                        }
                    }
                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(57);
                        if (GUILayout.Button("v", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Size; button = SizePositionButton.SizeBottomDown;
                        }
                    }
                }

                //GUILayout.Space(100);
                using (new GUILayout.VerticalScope())
                {
                    GUILayout.Space(14);

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(42);
                        if (GUILayout.Button("^", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Position; button = SizePositionButton.Up;
                        }
                    }
                    GUILayout.Space(10);

                    using (new GUILayout.HorizontalScope())
                    {
                        if (GUILayout.Button("<", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Position; button = SizePositionButton.Left;
                        }
                        GUILayout.Label("Position", GUILayout.Width(50));
                        if (GUILayout.Button(">", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Position; button = SizePositionButton.Right;
                        }
                    }
                    GUILayout.Space(10);

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(42);
                        if (GUILayout.Button("v", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Position; button = SizePositionButton.Down;
                        }
                    }
                }

                using (new GUILayout.VerticalScope())
                {
                    GUILayout.Space(14);

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(42);
                        if (GUILayout.Button("^", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Tiles; button = SizePositionButton.Up;
                        }
                    }
                    GUILayout.Space(10);

                    using (new GUILayout.HorizontalScope())
                    {
                        if (GUILayout.Button("<", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Tiles; button = SizePositionButton.Left;
                        }
                        GUILayout.Label("  Tiles", GUILayout.Width(50));
                        if (GUILayout.Button(">", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Tiles; button = SizePositionButton.Right;
                        }
                    }
                    GUILayout.Space(10);

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Space(42);
                        if (GUILayout.Button("v", GUILayout.Width(20)))
                        {
                            cat = SizePositionCategory.Tiles; button = SizePositionButton.Down;
                        }
                    }
                }
            }

            GUILayout.Space(10);
            return(button);
        }