mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-22 16:42:38 +08:00
92 lines
3.7 KiB
C#
92 lines
3.7 KiB
C#
#if CPP
|
|
using UnityEngine;
|
|
using Explorer.UnstripInternals;
|
|
|
|
namespace Explorer
|
|
{
|
|
public class Internal_LayoutUtility
|
|
{
|
|
public static Rect GetRect(float width, float height, GUIStyle style, params GUILayoutOption[] options)
|
|
{
|
|
switch (Event.current.type)
|
|
{
|
|
case EventType.Layout:
|
|
GUILayoutUtility.current.topLevel.Add(new GUILayoutEntry(width, width, height, height, style, options));
|
|
return GUILayoutUtility.kDummyRect;
|
|
case EventType.Used:
|
|
return GUILayoutUtility.kDummyRect;
|
|
default:
|
|
return GUILayoutUtility.current.topLevel.GetNext().rect;
|
|
}
|
|
}
|
|
|
|
public static Rect GetRect(GUIContent content, GUIStyle style, params GUILayoutOption[] options)
|
|
{
|
|
return DoGetRect(content, style, options);
|
|
}
|
|
|
|
static Rect DoGetRect(GUIContent content, GUIStyle style, GUILayoutOption[] options)
|
|
{
|
|
switch (Event.current.type)
|
|
{
|
|
case EventType.Layout:
|
|
if (style.isHeightDependantOnWidth)
|
|
{
|
|
GUILayoutUtility.current.topLevel.Add(new GUIWordWrapSizer(style, content, options));
|
|
}
|
|
else
|
|
{
|
|
Vector2 sizeConstraints = new Vector2(0, 0);
|
|
if (options != null)
|
|
{
|
|
foreach (var option in options)
|
|
{
|
|
if (float.TryParse(option.value.ToString(), out float f))
|
|
{
|
|
switch (option.type)
|
|
{
|
|
case GUILayoutOption.Type.maxHeight:
|
|
sizeConstraints.y = f;
|
|
break;
|
|
case GUILayoutOption.Type.maxWidth:
|
|
sizeConstraints.x = f;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Vector2 size = style.CalcSizeWithConstraints(content, sizeConstraints);
|
|
// This is needed on non-integer scale ratios to avoid errors to accumulate in further layout calculations
|
|
size.x = Mathf.Ceil(size.x);
|
|
size.y = Mathf.Ceil(size.y);
|
|
GUILayoutUtility.current.topLevel.Add(new GUILayoutEntry(size.x, size.x, size.y, size.y, style, options));
|
|
}
|
|
return GUILayoutUtility.kDummyRect;
|
|
|
|
case EventType.Used:
|
|
return GUILayoutUtility.kDummyRect;
|
|
default:
|
|
var entry = GUILayoutUtility.current.topLevel.GetNext();
|
|
//GUIDebugger.LogLayoutEntry(entry.rect, entry.marginLeft, entry.marginRight, entry.marginTop, entry.marginBottom, entry.style);
|
|
return entry.rect;
|
|
}
|
|
}
|
|
|
|
public static Rect GetLastRect()
|
|
{
|
|
EventType type = Event.current.type;
|
|
Rect last;
|
|
if (type != EventType.Layout && type != EventType.Used)
|
|
{
|
|
last = GUILayoutUtility.current.topLevel.Unstripped_GetLast();
|
|
}
|
|
else
|
|
{
|
|
last = GUILayoutUtility.kDummyRect;
|
|
}
|
|
return last;
|
|
}
|
|
}
|
|
}
|
|
#endif |