/// <summary>
        ///     Write the save file.
        /// </summary>
        public static void WriteSave()
        {
            if (Loaded == null)
            {
                Loaded = new EnhancedGUISave();
            }
            foreach (var renderer in EnhancedGUIRenderer.Renderers)
            {
                foreach (var window in renderer.Windows)
                {
                    var data = Loaded.GetWindowData(window.Name);
                    if (data == null)
                    {
                        data = new SerializableWindow();
                        Loaded.Windows.Add(data);
                    }

                    data.Name            = window.Name;
                    data.Ready           = true;
                    data.X               = window.Rect.x;
                    data.Y               = window.Rect.y;
                    data.Height          = window.Rect.height;
                    data.Width           = window.Rect.width;
                    data.IsContentActive = window.IsContentActive;
                }
            }

            File.WriteAllText(SaveFileName, JsonUtility.ToJson(Loaded, true));
        }
Esempio n. 2
0
        /// <summary>
        ///     Get rect for next window.
        /// </summary>
        internal static Rect NextWindow(string name, out bool isContentActive, out bool isWindowOpen, out int depth, out string guid)
        {
            EnhancedGUIWindow window;

            if (Renderer.WindowsIndex >= Renderer.Windows.Length)
            {
                if (!EnhancedGUISave.GetWindowRect(name, out var rect, out var active))
                {
                    rect            = new Rect(LastWindow.Rect.x + 20f, LastWindow.Rect.y + 20f, 300f, 200f);
                    isContentActive = true;
                }
                else
                {
                    isContentActive = active;
                }

                window = LastWindow = new EnhancedGUIWindow(Guid.NewGuid().ToString(), name)
                {
                    Rect  = rect,
                    Depth = _isFirstRect ? 0 : Renderer.WindowsIndex + 1
                };

                var list = new List <EnhancedGUIWindow>(Renderer.Windows)
                {
                    window
                };
                Renderer.Windows = list.ToArray();
                Renderer.WindowsIndex++;
            }
 /// <summary>
 ///     Load the save.
 /// </summary>
 public static void LoadSave()
 {
     if (!File.Exists(SaveFileName))
     {
         Loaded = new EnhancedGUISave();
     }
     else
     {
         Loaded = JsonUtility.FromJson <EnhancedGUISave>(File.ReadAllText(SaveFileName));
     }
 }
 internal static void ApplyWindowOnce(string name, Rect rect, bool content)
 {
     if (Loaded == null)
     {
         Loaded = new EnhancedGUISave();
     }
     for (var index = 0; index < Loaded.Windows.Count; index++)
     {
         var w = Loaded.Windows[index];
         if (w.Name == name) // TODO: Check for duplicates
         {
             w.X               = rect.x;
             w.Y               = rect.y;
             w.Height          = rect.height;
             w.Width           = rect.width;
             w.IsContentActive = content;
         }
     }
 }
Esempio n. 5
0
        /// <summary>
        ///     Begins new window area.
        /// </summary>
        internal static void InternalBegin(string windowName, ref bool isWindowOpen, bool canDeactivate)
        {
            if (!Renderer.CanBeginWindow)
            {
                throw new InvalidOperationException("You are calling Begin() without first ending previous window by calling End().");
            }

            Renderer.CanDrawControl = true;
            Renderer.CanBeginWindow = false;

            //
            // CONST
            //
            const int headerHeight     = 25;
            const int resizeButtonSize = 20;

            //
            // INIT
            //
            var pushDepth    = false;
            var originalRect = NextWindow(windowName, out bool isContentActive, out bool isWindowOpen2, out var depth, out var guid);
            var pushingRect  = new Rect(originalRect);
            var header       = new Rect(originalRect.x, originalRect.y, originalRect.width, headerHeight);

            GUI.depth = depth;
            var enabled = GUI.depth == 0;

            if (!isWindowOpen)
            {
                _nextWindowIsInactive = true;

                if (isWindowOpen2)
                {
                    // need to save last window state here to be able to restore rect for next activation
                    EnhancedGUISave.ApplyWindowOnce(windowName, originalRect, isContentActive);
                }

                PushWindow(pushingRect, header, isContentActive, false);
                return;
            }

            //
            // DRAW: HEADER
            //

            var headerStyle = isContentActive ? Renderer.ActiveSkin.Header : Renderer.ActiveSkin.HeaderClosed;

            if (!enabled)
            {
                headerStyle = isContentActive ? Renderer.ActiveSkin.HeaderInactive : Renderer.ActiveSkin.HeaderInactiveClosed;
            }

            GUILayout.BeginArea(header, headerStyle);
            {
                GUILayout.BeginHorizontal();
                var foldoutStyle = isContentActive ? Renderer.ActiveSkin.FoldoutClose : Renderer.ActiveSkin.FoldoutOpen;
                if (GUILayout.Button((isContentActive ? EnhancedGUISkin.DownwardsArrowChar : EnhancedGUISkin.RightwardsArrowChar).ToString(), foldoutStyle))
                {
                    isContentActive = !isContentActive;
                }

                var windowNameWidth = canDeactivate ? header.width - headerHeight - foldoutStyle.fixedWidth - 5 : header.width - foldoutStyle.fixedWidth - 15;
                GUILayout.Label(windowName, Renderer.ActiveSkin.HeaderText, GUILayout.Width(windowNameWidth));
                GUILayout.EndHorizontal();
            }
            GUILayout.EndArea();

            var headerClose = new Rect(header.x + header.width - header.height, header.y, header.height, header.height);

            if (canDeactivate)
            {
                if (GUI.Button(headerClose, "X", Renderer.ActiveSkin.HeaderClose))
                {
                    isWindowOpen = false;
                }
            }

            //
            // TEST RAYCAST: Test what window is on top.
            //
            var e = Event.current;

            EnhancedGUIRenderer.TestRaycast(e.mousePosition, window => window.IsContentActive ? window.Rect : window.Header, out var hit);
            if (hit.Name == windowName)
            {
                if (!enabled && e.type == EventType.MouseDown)
                {
                    pushDepth = true;
                }
            }

            //
            // INPUT: Window movement.
            //
            if (Renderer.FrameTarget == -1 && hit.Guid == guid)
            {
                if (header.Contains(e.mousePosition))
                {
                    SetCursor(Renderer.ActiveSkin.CursorPoint);
                    if (e.type == EventType.MouseDown)
                    {
                        Renderer.IsWindowMoving     = true;
                        Renderer.StartRect          = originalRect;
                        Renderer.MouseStartPosition = e.mousePosition;

                        Renderer.FrameTarget = Renderer.WindowsIndex;
                        pushDepth            = true;
                    }
                }
            }

            if (e.type == EventType.MouseUp)
            {
                Renderer.IsWindowMoving = false;
                Renderer.FrameTarget    = -1;
            }

            //
            //  PROCESS: Window Movement.
            //
            if (CanInteract() && Renderer.IsWindowMoving && Renderer.FrameTarget == Renderer.WindowsIndex)
            {
                SetCursor(Renderer.ActiveSkin.CursorDrag);

                var delta = new Vector2(e.mousePosition.x - Renderer.MouseStartPosition.x, e.mousePosition.y - Renderer.MouseStartPosition.y);
                pushingRect.position = new Vector2(Renderer.StartRect.x + delta.x, Renderer.StartRect.y + delta.y);

                pushingRect.height = header.height;
                ClampRectToScreen(ref pushingRect, Renderer.ScreenRect);
                pushingRect.height = originalRect.height;
            }

            //
            //  DRAW: Begin window area.
            //
            var windowRect = new Rect(originalRect.x,
                                      originalRect.y + header.height,
                                      originalRect.width,
                                      isContentActive ? originalRect.height - header.height : 0);

            GUILayout.BeginArea(windowRect, isContentActive ? Renderer.ActiveSkin.Window : Renderer.ActiveSkin.Hidden);
            // GUILayout.Label($"{GUI.depth}, {guid}");

            //
            //  INPUT: RESIZE.
            //
            var resizeButton = new Rect(originalRect.width - resizeButtonSize - 1,
                                        originalRect.height - header.height - resizeButtonSize - 1,
                                        resizeButtonSize,
                                        resizeButtonSize);

            GUI.enabled = enabled;
            GUI.Box(resizeButton, string.Empty, Renderer.ActiveSkin.Resize);
            GUI.enabled = true;

            //
            //  INPUT: Window Resize.
            //
            if (Renderer.FrameTarget == -1 && hit.Guid == guid)
            {
                if (resizeButton.Contains(e.mousePosition))
                {
                    SetCursor(Renderer.ActiveSkin.CursorPoint);
                    if (e.type == EventType.MouseDown && Renderer.FrameTarget == -1)
                    {
                        Renderer.IsWindowResize     = true;
                        Renderer.StartRect          = originalRect;
                        Renderer.MouseStartPosition = e.mousePosition;

                        Renderer.FrameTarget = Renderer.WindowsIndex;
                        pushDepth            = true;
                    }
                }
            }

            if (e.type == EventType.MouseUp)
            {
                Renderer.IsWindowResize = false;
                Renderer.FrameTarget    = -1;
            }

            //
            //  PROCESS: Window Resize.
            //
            if (CanInteract() && Renderer.IsWindowResize && Renderer.FrameTarget == Renderer.WindowsIndex)
            {
                SetCursor(Renderer.ActiveSkin.CursorDrag);

                var delta = new Vector2(e.mousePosition.x - Renderer.MouseStartPosition.x,
                                        e.mousePosition.y - Renderer.MouseStartPosition.y);
                pushingRect.size =
                    new Vector2(Renderer.StartRect.size.x + delta.x, Renderer.StartRect.size.y + delta.y);

                ClampRectSize(ref pushingRect);
            }

            if (hit.Guid == guid && e.type == EventType.MouseDown && Renderer.FrameTarget == -1 && pushingRect.Contains(e.mousePosition))
            {
                pushDepth = true;
            }

            if (pushDepth)
            {
                PushDepth();
            }
            PushWindow(pushingRect, header, isContentActive, true);

            GUI.enabled = enabled;
        }