/// <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)); }
/// <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; } } }
/// <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; }