summaryrefslogtreecommitdiff
path: root/Runtime/Export/GUIUtility.txt
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Export/GUIUtility.txt
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Export/GUIUtility.txt')
-rw-r--r--Runtime/Export/GUIUtility.txt476
1 files changed, 476 insertions, 0 deletions
diff --git a/Runtime/Export/GUIUtility.txt b/Runtime/Export/GUIUtility.txt
new file mode 100644
index 0000000..99fcbc9
--- /dev/null
+++ b/Runtime/Export/GUIUtility.txt
@@ -0,0 +1,476 @@
+C++RAW
+
+#include "UnityPrefix.h"
+#include "Runtime/Misc/AssetBundle.h"
+#include "Runtime/Misc/ResourceManager.h"
+#include "Runtime/Mono/MonoBehaviour.h"
+#include "Runtime/IMGUI/GUIStyle.h"
+#include "Runtime/Filters/Misc/Font.h"
+#include "Runtime/Misc/InputEvent.h"
+#include "Runtime/GfxDevice/GfxDevice.h"
+#include "Runtime/Camera/CameraUtil.h"
+#include "Runtime/IMGUI/GUIManager.h"
+#include "Runtime/Utilities/CopyPaste.h"
+#include "Runtime/IMGUI/GUIState.h"
+#include "Runtime/IMGUI/GUIClip.h"
+#include "Runtime/IMGUI/IMGUIUtils.h"
+#include "Runtime/IMGUI/GUIWindows.h"
+#include "Runtime/Input/InputManager.h"
+#include "Runtime/Scripting/ScriptingUtility.h"
+#if UNITY_EDITOR
+
+#include "Editor/Src/EditorHelper.h"
+#include "Editor/Mono/MonoEditorUtility.h"
+#include "Editor/Src/OptimizedGUIBlock.h"
+#include "Editor/Src/AssetPipeline/AssetDatabase.h"
+#include "Editor/Src/Undo/UndoManager.h"
+
+extern float s_GUIStyleIconSizeX;
+extern float s_GUIStyleIconSizeY;
+#endif
+
+using namespace Unity;
+using namespace std;
+
+CSRAW
+
+// Use this define to debug who grabs and releases hotcontrol
+//#define DEBUG_HOTCONTROL
+
+// Use this define to debug controlID consistency together with 's_LogControlID' (default false) to enable logging in
+// a codepath thats needs tested for consistency. E.g:
+// if (Event.current.rawType == EventType.MouseUp)
+// GUIUtility.s_LogControlID = true;
+// And remember to set s_LogControlID to false at end of secion of interest.
+//#define DEBUG_CONTROLID
+
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Collections;
+
+namespace UnityEngine
+{
+
+// Throw this to immediately exit from GUI code.
+// *undocumented*
+CLASS ExitGUIException : System.Exception
+END
+
+// Used by GUIUtility.GetcontrolID to inform the UnityGUI system if a given control can get keyboard focus.
+ENUM FocusType
+ // This control can get keyboard focus on Windows, but not on Mac. Used for buttons, checkboxes and other "pressable" things.
+ Native = 0,
+ // This is a proper keyboard control. It can have input focus on all platforms. Used for TextField and TextArea controls
+ Keyboard = 1,
+ // This control can never recieve keyboard focus.
+ Passive = 2
+END
+
+CSRAW
+
+// Utility class for making new GUI controls.
+NONSEALED_CLASS GUIUtility
+
+ /// *listonly*
+ CSRAW public static int GetControlID (FocusType focus)
+ {
+ return GetControlID (0, focus);
+ }
+ /// *listonly*
+ CUSTOM public static int GetControlID (int hint, FocusType focus)
+ {
+ return GetGUIState().GetControlID (hint, focus);
+ }
+ /// *listonly*
+ CSRAW public static int GetControlID (GUIContent contents,FocusType focus)
+ {
+ return GetControlID (contents.hash, focus);
+ }
+ /// *listonly*
+ CSRAW public static int GetControlID (FocusType focus, Rect position)
+ {
+ return Internal_GetNextControlID2 (0, focus, position);
+ }
+ /// *listonly*
+ CSRAW public static int GetControlID (int hint, FocusType focus, Rect position)
+ {
+ return Internal_GetNextControlID2 (hint, focus, position);
+ }
+ // Get a unique ID for a control.
+ CSRAW static public int GetControlID (GUIContent contents, FocusType focus, Rect position)
+ {
+ return Internal_GetNextControlID2 (contents.hash, focus, position);
+ }
+
+ CUSTOM private static int Internal_GetNextControlID2 (int hint, FocusType focusType, Rect rect)
+ {
+ return GetGUIState().GetControlID (hint, focusType, rect);
+ }
+
+ // Get a state object from a controlID.
+ CSRAW public static object GetStateObject (Type t, int controlID) { return GUIStateObjects.GetStateObject (t, controlID); }
+
+ // Get an existing state object from a controlID.
+ CSRAW public static object QueryStateObject (Type t, int controlID) { return GUIStateObjects.QueryStateObject (t, controlID); }
+
+ CUSTOM static internal int GetPermanentControlID ()
+ {
+ return GetGUIState().m_EternalGUIState->GetNextUniqueID ();
+ }
+
+CSRAW
+ #if DEBUG_HOTCONTROL
+ static public string s_WhoGrabbedHotControl, s_WhoReleasedHotControl;
+ #endif
+
+ #if DEBUG_CONTROLID
+ static public bool s_LogControlID = false;
+ #endif
+
+
+ // The controlID of the current hot control.
+ CSRAW public static int hotControl { get { return Internal_GetHotControl(); }
+ set {
+ #if DEBUG_HOTCONTROL
+ if (value != 0)
+ {
+ s_WhoGrabbedHotControl = StackTraceUtility.ExtractStackTrace();
+ Debug.Log("GRABBED " + s_WhoGrabbedHotControl);
+ }
+ else
+ {
+ s_WhoReleasedHotControl = StackTraceUtility.ExtractStackTrace();
+ Debug.Log("RELEASE: " + s_WhoReleasedHotControl);
+ }
+ #endif
+
+ Internal_SetHotControl (value);
+ } }
+
+ CUSTOM private static int Internal_GetHotControl ()
+ {
+ return IMGUI::GetHotControl (GetGUIState());
+ }
+ CUSTOM private static void Internal_SetHotControl (int value)
+ {
+ IMGUI::SetHotControl (GetGUIState(), value);
+ }
+
+ CUSTOM internal static void UpdateUndoName ()
+ {
+ #if UNITY_EDITOR
+ GetUndoManager().UpdateUndoName ();
+ #endif
+ }
+
+ // The controlID of the control that has keyboard focus.
+ CUSTOM_PROP static int keyboardControl
+ { return IMGUI::GetKeyboardControl (GetGUIState()); }
+ { IMGUI::SetKeyboardControl (GetGUIState(), value); }
+
+// Keep for debugging keyboardControl (prints the callstack when keyboardControl changes)
+// CSRAW public static int keyboardControl
+// {
+// get { return GetKeyboardControl (); }
+// set { Debug.Log ("Set keyboardControl " + value); SetKeyboardControl (value);}
+// }
+// CUSTOM static int GetKeyboardControl () {return IMGUI::GetKeyboardControl (GetGUIState()); }
+// CUSTOM static void SetKeyboardControl (int id) {IMGUI::SetKeyboardControl (GetGUIState(), id); }
+
+ //*undocumented*
+ CSRAW public static void ExitGUI ()
+ {
+ // We have to always throw the ExitGUIException otherwise the exiting out of recursive on GUI will not work.
+ throw new ExitGUIException ();
+ }
+
+ CUSTOM internal static void SetDidGUIWindowsEatLastEvent (bool value) {
+ GUIManager::SetDidGUIWindowsEatLastEvent (value);
+ }
+
+ // Get access to the system-wide pasteboard.
+ CUSTOM_PROP static internal string systemCopyBuffer { return scripting_string_new(GetCopyBuffer ()); } { SetCopyBuffer (value); }
+
+ CSRAW internal static GUISkin GetDefaultSkin() {
+ return Internal_GetDefaultSkin (s_SkinMode);
+ }
+
+ CUSTOM private static GUISkin Internal_GetDefaultSkin (int skinMode) {
+ return GetDefaultSkin (skinMode)->GetInstance ();
+ }
+
+ CUSTOM private static Object Internal_GetBuiltinSkin (int skin) {
+ return GetBuiltinSkin (skin)->GetInstance ();
+ }
+
+ // internal so we can get to it from EditorGUIUtility.GetBuiltinSkin
+ CSRAW internal static GUISkin GetBuiltinSkin (int skin) {
+ return Internal_GetBuiltinSkin (skin) as GUISkin;
+ }
+
+ [NotRenamed] static internal int s_SkinMode;
+ [NotRenamed] static internal int s_OriginalID;
+ CSRAW internal static void BeginGUI (int skinMode, int instanceID, int useGUILayout ) {
+ s_SkinMode = skinMode;
+ s_OriginalID = instanceID;
+ GUI.skin = null;
+
+ // Switch to the correct ID list & clear keyboard loop if we're about to layout (we rebuild it during layout, so we want it cleared beforehand)
+ if (useGUILayout != 0)
+ {
+ GUILayoutUtility.SelectIDList (instanceID, false);
+ GUILayoutUtility.Begin (instanceID);
+ }
+
+ GUI.changed = false;
+ }
+
+ CUSTOM private static void Internal_ExitGUI ()
+ {
+ #if UNITY_EDITOR
+ OptimizedGUIBlock::Abandon ();
+ s_GUIStyleIconSizeX = 0.0f;
+ s_GUIStyleIconSizeY = 0.0f;
+ #endif
+ }
+
+ // End the 2D GUI.
+ CSRAW internal static void EndGUI (int layoutType)
+ {
+ try
+ {
+ if (Event.current.type == EventType.Layout)
+ {
+ switch (layoutType)
+ {
+ case 0: // kNoLayout
+ break;
+ case 1: // kGameLayout
+ GUILayoutUtility.Layout ();
+ break;
+ case 2: // kEditorLayout
+ GUILayoutUtility.LayoutFromEditorWindow ();
+ break;
+ }
+ }
+
+ GUILayoutUtility.SelectIDList (s_OriginalID, false);
+ GUIContent.ClearStaticCache();
+ }
+ finally {
+ Internal_ExitGUI();
+ }
+ }
+
+ // End the 2D GUI.
+ CSRAW internal static bool EndGUIFromException (System.Exception exception) {
+ // Check if the exception is a ExitGUIException
+ if (exception == null)
+ return false;
+ if (exception as ExitGUIException == null
+#if !UNITY_FLASH && !UNITY_WEBGL
+ && exception.InnerException as ExitGUIException == null
+#endif
+ )
+ return false;
+
+ Internal_ExitGUI ();
+
+ return true;
+ }
+
+ // Only allow calling GUI functions from inside OnGUI
+ CSRAW static internal void CheckOnGUI() {
+ if (Internal_GetGUIDepth () <= 0)
+ {
+ throw new ArgumentException("You can only call GUI functions from inside OnGUI.");
+ }
+ }
+
+ CUSTOM static internal int Internal_GetGUIDepth ()
+ {
+ return GetGUIState().m_OnGUIDepth;
+ }
+
+ CUSTOM_PROP static internal bool mouseUsed
+ { return GetGUIState().m_CanvasGUIState.m_IsMouseUsed != 0; }
+ { GetGUIState().m_CanvasGUIState.m_IsMouseUsed = value ? 1 : 0; }
+
+ CSRAW
+
+ static internal Vector2 s_EditorScreenPointOffset = Vector2.zero;
+ static internal bool s_HasKeyboardFocus = false;
+
+ // Convert a point from GUI position to screen space.
+ CSRAW public static Vector2 GUIToScreenPoint (Vector2 guiPoint)
+ {
+ return GUIClip.Unclip (guiPoint) + s_EditorScreenPointOffset;
+ }
+
+ // Convert a rect from GUI position to screen space.
+ CSRAW internal static Rect GUIToScreenRect (Rect guiRect)
+ {
+ Vector2 screenPoint = GUIToScreenPoint (new Vector2 (guiRect.x, guiRect.y));
+ guiRect.x = screenPoint.x;
+ guiRect.y = screenPoint.y;
+ return guiRect;
+ }
+
+ // Convert a point from screen space to GUI position.
+ CSRAW public static Vector2 ScreenToGUIPoint (Vector2 screenPoint)
+ {
+ return GUIClip.Clip (screenPoint) - s_EditorScreenPointOffset;
+ }
+
+ // Convert a rect from screen space to GUI position.
+ CSRAW public static Rect ScreenToGUIRect (Rect screenRect)
+ {
+ Vector2 guiPoint = ScreenToGUIPoint (new Vector2 (screenRect.x, screenRect.y));
+ screenRect.x = guiPoint.x;
+ screenRect.y = guiPoint.y;
+ return screenRect;
+ }
+
+ // Helper function to rotate the GUI around a point.
+ public static void RotateAroundPivot (float angle, Vector2 pivotPoint) {
+ Matrix4x4 mat = GUI.matrix;
+ GUI.matrix = Matrix4x4.identity;
+ Vector2 point = GUIClip.Unclip(pivotPoint);
+ Matrix4x4 newMat = Matrix4x4.TRS (point, Quaternion.Euler (0,0,angle), Vector3.one) * Matrix4x4.TRS (-point, Quaternion.identity, Vector3.one);
+ GUI.matrix = newMat *mat;
+ }
+
+ // Helper function to scale the GUI around a point.
+ public static void ScaleAroundPivot (Vector2 scale, Vector2 pivotPoint) {
+ Matrix4x4 mat = GUI.matrix;
+ Vector2 point = GUIClip.Unclip(pivotPoint);
+ Matrix4x4 newMat = Matrix4x4.TRS (point, Quaternion.identity, new Vector3 (scale.x, scale.y, 1)) * Matrix4x4.TRS (-point, Quaternion.identity, Vector3.one);
+ GUI.matrix = newMat * mat;
+ }
+
+ // Check to see if there's a modal IMGUI window that's currently open
+ CUSTOM_PROP public static bool hasModalWindow
+ {
+ GUIState& state = GetGUIState();
+ return state.m_MultiFrameGUIState.m_Windows != NULL && state.m_MultiFrameGUIState.m_Windows->m_ModalWindow != NULL;
+ }
+
+ //*undocumented*
+ CUSTOM_PROP static internal bool textFieldInput
+ { return GetInputManager().GetTextFieldInput (); }
+ { GetInputManager().SetTextFieldInput (value); }
+END
+
+
+CLASS internal GUIClip
+ // Push a clip rect to the stack with pixel offsets.
+ CUSTOM internal static void Push (Rect screenRect, Vector2 scrollOffset, Vector2 renderOffset, bool resetOffset)
+ {
+ GetGUIState().m_CanvasGUIState.m_GUIClipState.Push (IMGUI::GetCurrentEvent(GetGUIState()), screenRect, scrollOffset, renderOffset, resetOffset);
+ }
+
+ // Removes the topmost clipping rectangle, undoing the effect of the latest GUIClip.Push
+ CUSTOM internal static void Pop ()
+ {
+ GetGUIState().m_CanvasGUIState.m_GUIClipState.Pop (IMGUI::GetCurrentEvent(GetGUIState()));
+ }
+
+ // Get the topmost rectangle
+ CUSTOM internal static Rect GetTopRect ()
+ {
+ return GetGUIState().m_CanvasGUIState.m_GUIClipState.GetTopRect ();
+ }
+
+
+ CUSTOM_PROP static bool enabled
+ { return GetGUIState().m_CanvasGUIState.m_GUIClipState.GetEnabled(); }
+
+
+ // Unclips /pos/ to physical device coordinates.
+ CSRAW static public Vector2 Unclip (Vector2 pos)
+ {
+ Unclip_Vector2(ref pos);
+ return pos;
+ }
+
+ CUSTOM private static void Unclip_Vector2 (ref Vector2 pos)
+ {
+ pos = GetGUIState().m_CanvasGUIState.m_GUIClipState.Unclip (pos);
+ }
+
+ // The topmost physical rect in unclipped coordinates
+ // Used in editor to clip cursor rects inside scrollviews
+ CUSTOM_PROP static Rect topmostRect
+ { return GetGUIState().m_CanvasGUIState.m_GUIClipState.GetTopMostPhysicalRect (); }
+
+
+ // Unclips /rect/ to physical device coordinates.
+ CSRAW public static Rect Unclip (Rect rect)
+ {
+ Unclip_Rect(ref rect);
+ return rect;
+ }
+ CUSTOM private static void Unclip_Rect (ref Rect rect)
+ {
+ rect = GetGUIState().m_CanvasGUIState.m_GUIClipState.Unclip(rect);
+ }
+
+ // Clips /absolutePos/ to drawing coordinates
+ CSRAW static public Vector2 Clip (Vector2 absolutePos)
+ {
+ Clip_Vector2 (ref absolutePos);
+ return absolutePos;
+ }
+
+ CUSTOM private static void Clip_Vector2 (ref Vector2 absolutePos)
+ {
+ absolutePos = GetGUIState().m_CanvasGUIState.m_GUIClipState.Clip(absolutePos);
+ }
+
+ // Convert /absoluteRect/ to drawing coordinates
+ CSRAW static public Rect Clip (Rect absoluteRect)
+ {
+ Internal_Clip_Rect (ref absoluteRect);
+ return absoluteRect;
+ }
+
+ CUSTOM static private void Internal_Clip_Rect (ref Rect absoluteRect)
+ {
+ absoluteRect = GetGUIState().m_CanvasGUIState.m_GUIClipState.Clip (absoluteRect);
+ }
+
+ // Reapply the clipping info.
+ CUSTOM internal static void Reapply ()
+ {
+ GetGUIState().m_CanvasGUIState.m_GUIClipState.Reapply (IMGUI::GetCurrentEvent(GetGUIState()));
+ }
+
+ // Set the GUIMatrix. This is here as this class handles all coordinate transforms anyways.
+ CUSTOM internal static Matrix4x4 GetMatrix()
+ {
+ return GetGUIState().m_CanvasGUIState.m_GUIClipState.GetMatrix();
+ }
+
+ CUSTOM internal static void SetMatrix (Matrix4x4 m)
+ {
+ GetGUIState().m_CanvasGUIState.m_GUIClipState.SetMatrix(IMGUI::GetCurrentEvent(GetGUIState()), m);
+ }
+
+ // The visible rectangle.
+ CUSTOM_PROP static Rect visibleRect
+ { return GetGUIState().m_CanvasGUIState.m_GUIClipState.GetVisibleRect (); }
+
+ CSRAW public static Vector2 GetAbsoluteMousePosition ()
+ {
+ Vector2 vec;
+ Internal_GetAbsoluteMousePosition(out vec);
+ return vec;
+ }
+ CUSTOM private static void Internal_GetAbsoluteMousePosition (out Vector2 output)
+ {
+ *output = GetGUIState().m_CanvasGUIState.m_GUIClipState.GetAbsoluteMousePosition();
+ }
+END
+
+CSRAW }