Files
Ultimate-Fishing-Simulator-…/Assets/Plugins/Assembly-CSharp-firstpass/DebuggingEssentials/WindowManager.cs
2026-03-04 09:37:33 +08:00

372 lines
8.2 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace DebuggingEssentials
{
[DefaultExecutionOrder(-99999999)]
public class WindowManager : MonoBehaviour
{
public class MouseCursor
{
public CursorLockMode lockState;
public bool visible = true;
public void GetCurrentState()
{
if (Cursor.lockState != CursorLockMode.None)
{
lockState = Cursor.lockState;
}
if (!Cursor.visible)
{
visible = Cursor.visible;
}
}
public void RestoreState()
{
Cursor.lockState = lockState;
Cursor.visible = visible;
}
public void SetActive()
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
public class EventHandling
{
private FastList<EventSystem> eventSystemList = new FastList<EventSystem>();
public bool hasEntered;
public void OnEnter()
{
if (!hasEntered)
{
hasEntered = true;
EventSystem current = EventSystem.current;
if (!(current == null) && current.enabled)
{
current.enabled = false;
eventSystemList.Add(current);
}
}
}
public void OnExit()
{
if (hasEntered)
{
hasEntered = false;
for (int i = 0; i < eventSystemList.Count; i++)
{
eventSystemList.items[i].enabled = true;
}
eventSystemList.Clear();
}
}
}
public static WindowManager instance;
public static EventHandling eventHandling = new EventHandling();
private static string tooltip = string.Empty;
private static int lastWindowId;
private static MouseCursor mouseCursor = new MouseCursor();
private static RenderTexture rtCanvas;
private static RenderTexture rtOld;
public SO_WindowManager windowData;
public bool useDontDestroyOnLoadScene;
public bool onlyUseViewToggleKeys;
public bool useCanvas;
public GameObject canvasGO;
public RawImage rawImage;
private RuntimeInspector runtimeInspector;
private RuntimeConsole runtimeConsole;
private Vector2 size;
private int oldScreenWidth;
private int oldScreenHeight;
public static void CheckMouseCursorState()
{
mouseCursor.GetCurrentState();
if (RuntimeInspector.show || RuntimeConsole.show)
{
mouseCursor.SetActive();
}
else
{
mouseCursor.RestoreState();
}
}
public static void ResetAllStatic()
{
RuntimeInspector.ResetStatic();
NavigationCamera.ResetStatic();
GUIChangeBool.ResetStatic();
DrawEnum.ResetStatic();
CullGroup.ResetStatic();
HtmlDebug.ResetStatic();
}
private void Awake()
{
if (useDontDestroyOnLoadScene)
{
Object.DontDestroyOnLoad(base.gameObject);
}
ResetAllStatic();
instance = this;
HtmlDebug.timeSinceStartup.Stop();
HtmlDebug.timeSinceStartup.Start();
UpdateUseCanvas(useCanvas);
}
private void Init()
{
if (!runtimeInspector)
{
runtimeInspector = GetComponentInChildren<RuntimeInspector>(includeInactive: true);
}
if (!runtimeConsole)
{
runtimeConsole = GetComponentInChildren<RuntimeConsole>(includeInactive: true);
}
RuntimeConsole.instance = runtimeConsole;
if ((bool)runtimeInspector && !runtimeInspector.gameObject.activeInHierarchy)
{
SetActiveDeactive(runtimeInspector.gameObject);
}
if ((bool)runtimeConsole && !runtimeConsole.gameObject.activeInHierarchy)
{
SetActiveDeactive(runtimeConsole.gameObject);
}
if (!runtimeConsole && (bool)runtimeInspector)
{
RuntimeConsole.accessLevel = AccessLevel.Admin;
}
if ((bool)runtimeInspector || (bool)runtimeConsole)
{
RuntimeInspector.InitAssemblies();
}
}
private void InitCanvasRenderTexture()
{
if (rtCanvas == null || Screen.width != oldScreenWidth || Screen.height != oldScreenHeight)
{
GraphicsHelper.Dispose(ref rtCanvas);
rtCanvas = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
rtCanvas.anisoLevel = 0;
rtCanvas.filterMode = FilterMode.Point;
rtCanvas.useMipMap = false;
rtCanvas.Create();
rawImage.texture = rtCanvas;
oldScreenWidth = Screen.width;
oldScreenHeight = Screen.height;
}
}
public void UpdateUseCanvas(bool useCanvas)
{
canvasGO.SetActive(useCanvas);
if (!useCanvas)
{
GraphicsHelper.Dispose(ref rtCanvas);
}
}
public static void BeginRenderTextureGUI(bool clear = false)
{
if (!instance.useCanvas || Event.current.type != EventType.Repaint)
{
return;
}
rtOld = RenderTexture.active;
if (rtCanvas != null && RenderTexture.active != rtCanvas)
{
RenderTexture.active = rtCanvas;
if (clear)
{
GL.Clear(clearDepth: false, clearColor: true, new Color(0f, 0f, 0f, 0f));
}
}
}
public static void EndRenderTextureGUI()
{
if (instance.useCanvas && Event.current.type == EventType.Repaint)
{
RenderTexture.active = rtOld;
}
}
private void OnEnable()
{
instance = this;
Init();
}
private void SetActiveDeactive(GameObject go)
{
go.SetActive(value: true);
go.SetActive(value: false);
}
private void OnDestroy()
{
if (instance == this)
{
instance = null;
}
GraphicsHelper.Dispose(ref rtCanvas);
}
private void Update()
{
HtmlDebug.frameTime = (float)HtmlDebug.timeSinceStartup.ElapsedMilliseconds / 1000f;
HtmlDebug.currentFrame = Time.frameCount;
if ((bool)HtmlDebug.instance)
{
HtmlDebug.instance.UpdateLogs();
}
if ((bool)RuntimeConsole.instance)
{
RuntimeConsole.instance.ManualUpdate();
}
if ((bool)RuntimeInspector.instance)
{
RuntimeInspector.instance.ManualUpdate();
}
}
private void LateUpdate()
{
EventInput.ResetInput();
}
private void OnGUI()
{
if (useCanvas)
{
InitCanvasRenderTexture();
}
BeginRenderTextureGUI(clear: true);
float value = windowData.guiScale.value;
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(value, value, value));
if (Event.current.type == EventType.Layout)
{
GUIChangeBool.ApplyUpdates();
}
else
{
EventInput.GetInput();
}
if ((bool)runtimeInspector)
{
runtimeInspector.MyOnGUI();
}
if ((bool)runtimeConsole)
{
runtimeConsole.MyOnGUI();
}
if (DoWindowsContainMousePos())
{
eventHandling.OnEnter();
}
else
{
eventHandling.OnExit();
}
if ((bool)runtimeInspector && runtimeInspector.windowData.showTooltip)
{
DrawTooltip(EventInput.mousePos);
}
GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3.one);
EndRenderTextureGUI();
}
public static bool DoWindowsContainMousePos()
{
if ((bool)instance.runtimeInspector)
{
WindowSettings hierarchyWindow = instance.runtimeInspector.windowData.hierarchyWindow;
WindowSettings inspectorWindow = instance.runtimeInspector.windowData.inspectorWindow;
if (RuntimeInspector.show && (hierarchyWindow.ContainsMousePos(EventInput.mousePos) || (RuntimeInspector.ShouldInspectorWindowShow() && inspectorWindow.ContainsMousePos(EventInput.mousePos))))
{
return true;
}
}
if ((bool)instance.runtimeConsole)
{
WindowSettings consoleWindow = instance.runtimeConsole.windowData.consoleWindow;
if (RuntimeConsole.show && consoleWindow.ContainsMousePos(EventInput.mousePos))
{
return true;
}
}
return false;
}
public static void SetToolTip(int windowId)
{
if (GUI.tooltip.Length > 0)
{
lastWindowId = windowId;
tooltip = GUI.tooltip;
}
else if (windowId == lastWindowId)
{
tooltip = string.Empty;
}
}
private void DrawTooltip(Vector2 mousePos)
{
if (tooltip.Length > 0)
{
size = GUI.skin.label.CalcSize(Helper.GetGUIContent(tooltip));
size.x += 10f;
size.y += 2.5f;
Rect clientRect = new Rect(mousePos.x, mousePos.y, size.x, size.y);
clientRect.x += 5f;
clientRect.y += 20f;
clientRect = GUI.Window(423423, clientRect, DoWindow, GUIContent.none);
}
}
private void DoWindow(int windowId)
{
GUI.BringWindowToFront(windowId);
Rect position = new Rect(0f, 0f, size.x, size.y);
GUI.backgroundColor = new Color(0.1f, 0.1f, 0.1f, 0.5f);
GUI.Box(position, GUIContent.none);
GUI.backgroundColor = Color.white;
position.x += 5f;
GUI.Label(position, tooltip);
}
}
}