mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-16 14:17:51 +08:00
cleaned up the resizer, fixed a mistake in UIFactory
This commit is contained in:
parent
a82abe2ec3
commit
88cbd0e970
@ -30,29 +30,7 @@ namespace ExplorerBeta.UI
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var path = @"Mods\Explorer\cursor.png";
|
LoadCursorImage();
|
||||||
var data = File.ReadAllBytes(path);
|
|
||||||
|
|
||||||
var tex = new Texture2D(32, 32);
|
|
||||||
tex.LoadImage(data, false);
|
|
||||||
UnityEngine.Object.DontDestroyOnLoad(tex);
|
|
||||||
|
|
||||||
var size = new Rect();
|
|
||||||
size.width = 32;
|
|
||||||
size.height = 32;
|
|
||||||
var sprite = UIManager.CreateSprite(tex, size);
|
|
||||||
UnityEngine.Object.DontDestroyOnLoad(sprite);
|
|
||||||
|
|
||||||
m_resizeCursorImage = new GameObject("ResizeCursorImage");
|
|
||||||
m_resizeCursorImage.transform.SetParent(UIManager.CanvasRoot.transform);
|
|
||||||
|
|
||||||
var image = m_resizeCursorImage.AddComponent<Image>();
|
|
||||||
image.sprite = sprite;
|
|
||||||
var rect = image.transform.TryCast<RectTransform>();
|
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 32);
|
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 32);
|
|
||||||
|
|
||||||
m_resizeCursorImage.SetActive(false);
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@ -67,7 +45,7 @@ namespace ExplorerBeta.UI
|
|||||||
var resizePos = Panel.InverseTransformPoint(rawMousePos);
|
var resizePos = Panel.InverseTransformPoint(rawMousePos);
|
||||||
var dragPos = DragableArea.InverseTransformPoint(rawMousePos);
|
var dragPos = DragableArea.InverseTransformPoint(rawMousePos);
|
||||||
|
|
||||||
if (m_wasHoveringResize)
|
if (WasHoveringResize)
|
||||||
{
|
{
|
||||||
UpdateHoverImagePos();
|
UpdateHoverImagePos();
|
||||||
}
|
}
|
||||||
@ -114,7 +92,7 @@ namespace ExplorerBeta.UI
|
|||||||
var type = GetResizeType(resizePos);
|
var type = GetResizeType(resizePos);
|
||||||
OnHoverResize(type);
|
OnHoverResize(type);
|
||||||
}
|
}
|
||||||
else if (m_wasHoveringResize)
|
else if (WasHoveringResize)
|
||||||
{
|
{
|
||||||
OnHoverResizeEnd();
|
OnHoverResizeEnd();
|
||||||
}
|
}
|
||||||
@ -158,26 +136,23 @@ namespace ExplorerBeta.UI
|
|||||||
#region RESIZE
|
#region RESIZE
|
||||||
|
|
||||||
private const int RESIZE_THICKNESS = 10;
|
private const int RESIZE_THICKNESS = 10;
|
||||||
|
|
||||||
private bool WasResizing { get; set; }
|
private bool WasResizing { get; set; }
|
||||||
private ResizeTypes m_currentResizeType = ResizeTypes.NONE;
|
private ResizeTypes m_currentResizeType = ResizeTypes.NONE;
|
||||||
private Vector2 m_lastMousePos;
|
private Vector2 m_lastResizePos;
|
||||||
|
|
||||||
private bool m_wasHoveringResize;
|
private bool WasHoveringResize { get; set; }
|
||||||
private ResizeTypes m_lastResizeHoverType;
|
private ResizeTypes m_lastResizeHoverType;
|
||||||
private GameObject m_resizeCursorImage;
|
private GameObject m_resizeCursorImage;
|
||||||
|
|
||||||
private Rect m_outerResize;
|
private Rect m_cachedOuterResize;
|
||||||
private Rect m_innerResize;
|
|
||||||
private readonly Dictionary<ResizeTypes, Rect> m_cachedResizeAreas = new Dictionary<ResizeTypes, Rect>
|
private readonly Dictionary<ResizeTypes, Rect> m_resizeMask = new Dictionary<ResizeTypes, Rect>
|
||||||
{
|
{
|
||||||
{ ResizeTypes.Top, Rect.zero },
|
{ ResizeTypes.Top, Rect.zero },
|
||||||
{ ResizeTypes.Left, Rect.zero },
|
{ ResizeTypes.Left, Rect.zero },
|
||||||
{ ResizeTypes.Right, Rect.zero },
|
{ ResizeTypes.Right, Rect.zero },
|
||||||
{ ResizeTypes.Bottom, Rect.zero },
|
{ ResizeTypes.Bottom, Rect.zero },
|
||||||
{ ResizeTypes.TopLeft, Rect.zero },
|
|
||||||
{ ResizeTypes.TopRight, Rect.zero },
|
|
||||||
{ ResizeTypes.BottomLeft, Rect.zero },
|
|
||||||
{ ResizeTypes.BottomRight, Rect.zero },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
@ -194,160 +169,148 @@ namespace ExplorerBeta.UI
|
|||||||
BottomRight = Bottom | Right,
|
BottomRight = Bottom | Right,
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateHoverImagePos()
|
|
||||||
{
|
|
||||||
if (!m_resizeCursorImage)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_resizeCursorImage.transform.localPosition = UIManager.CanvasRoot.transform.TryCast<RectTransform>()
|
|
||||||
.InverseTransformPoint(InputManager.MousePosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateResizeCache()
|
private void UpdateResizeCache()
|
||||||
{
|
{
|
||||||
int halfThick = RESIZE_THICKNESS / 2;
|
int halfThick = RESIZE_THICKNESS / 2;
|
||||||
|
int dblThick = RESIZE_THICKNESS * 2;
|
||||||
|
|
||||||
// calculate main two rects
|
// calculate main outer rect
|
||||||
|
// the resize area is both outside and inside the panel,
|
||||||
|
// to give a bit of buffer and make it easier to use.
|
||||||
|
|
||||||
this.m_outerResize = new Rect();
|
// outer rect is the outer-most bounds of our resize area
|
||||||
m_outerResize.x = Panel.rect.x - halfThick;
|
var outer = new Rect();
|
||||||
m_outerResize.y = Panel.rect.y - halfThick;
|
outer.x = Panel.rect.x - halfThick;
|
||||||
m_outerResize.width = Panel.rect.width + (RESIZE_THICKNESS * 2);
|
outer.y = Panel.rect.y - halfThick;
|
||||||
m_outerResize.height = Panel.rect.height + (RESIZE_THICKNESS * 2);
|
outer.width = Panel.rect.width + dblThick;
|
||||||
|
outer.height = Panel.rect.height + dblThick;
|
||||||
|
m_cachedOuterResize = outer;
|
||||||
|
|
||||||
this.m_innerResize = new Rect();
|
// calculate the four cross sections to use as flags
|
||||||
m_innerResize.x = m_outerResize.x + RESIZE_THICKNESS;
|
|
||||||
m_innerResize.y = m_outerResize.y + RESIZE_THICKNESS;
|
|
||||||
m_innerResize.width = Panel.rect.width - RESIZE_THICKNESS;
|
|
||||||
m_innerResize.height = Panel.rect.height - RESIZE_THICKNESS;
|
|
||||||
|
|
||||||
// calculate resize areas
|
var bottom = new Rect();
|
||||||
|
bottom.x = outer.x;
|
||||||
var left = m_cachedResizeAreas[ResizeTypes.Left];
|
bottom.y = outer.y;
|
||||||
left.x = m_outerResize.x;
|
bottom.width = outer.width;
|
||||||
left.y = m_outerResize.y + RESIZE_THICKNESS;
|
|
||||||
left.width = RESIZE_THICKNESS;
|
|
||||||
left.height = m_innerResize.height - RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.Left] = left;
|
|
||||||
|
|
||||||
var topLeft = m_cachedResizeAreas[ResizeTypes.TopLeft];
|
|
||||||
topLeft.x = m_outerResize.x;
|
|
||||||
topLeft.y = m_innerResize.y + m_innerResize.height;
|
|
||||||
topLeft.width = RESIZE_THICKNESS;
|
|
||||||
topLeft.height = RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.TopLeft] = topLeft;
|
|
||||||
|
|
||||||
var top = m_cachedResizeAreas[ResizeTypes.Top];
|
|
||||||
top.x = m_innerResize.x;
|
|
||||||
top.y = m_innerResize.y + m_innerResize.height;
|
|
||||||
top.width = m_innerResize.width;
|
|
||||||
top.height = RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.Top] = top;
|
|
||||||
|
|
||||||
var topRight = m_cachedResizeAreas[ResizeTypes.TopRight];
|
|
||||||
topRight.x = m_innerResize.x + m_innerResize.width;
|
|
||||||
topRight.y = m_innerResize.y + m_innerResize.height;
|
|
||||||
topRight.width = RESIZE_THICKNESS;
|
|
||||||
topRight.height = RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.TopRight] = topRight;
|
|
||||||
|
|
||||||
var right = m_cachedResizeAreas[ResizeTypes.Right];
|
|
||||||
right.x = m_innerResize.x + m_innerResize.width;
|
|
||||||
right.y = m_innerResize.y + halfThick;
|
|
||||||
right.width = RESIZE_THICKNESS;
|
|
||||||
right.height = m_innerResize.height - RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.Right] = right;
|
|
||||||
|
|
||||||
var bottomRight = m_cachedResizeAreas[ResizeTypes.BottomRight];
|
|
||||||
bottomRight.x = m_innerResize.x + m_innerResize.width;
|
|
||||||
bottomRight.y = m_outerResize.y;
|
|
||||||
bottomRight.width = RESIZE_THICKNESS;
|
|
||||||
bottomRight.height = RESIZE_THICKNESS;
|
|
||||||
m_cachedResizeAreas[ResizeTypes.BottomRight] = bottomRight;
|
|
||||||
|
|
||||||
var bottom = m_cachedResizeAreas[ResizeTypes.Bottom];
|
|
||||||
bottom.x = m_innerResize.x;
|
|
||||||
bottom.y = m_outerResize.y;
|
|
||||||
bottom.width = m_innerResize.width;
|
|
||||||
bottom.height = RESIZE_THICKNESS;
|
bottom.height = RESIZE_THICKNESS;
|
||||||
m_cachedResizeAreas[ResizeTypes.Bottom] = bottom;
|
m_resizeMask[ResizeTypes.Bottom] = bottom;
|
||||||
|
|
||||||
var bottomLeft = m_cachedResizeAreas[ResizeTypes.BottomLeft];
|
var left = new Rect();
|
||||||
bottomLeft.x = m_outerResize.x;
|
left.x = outer.x;
|
||||||
bottomLeft.y = m_outerResize.y;
|
left.y = outer.y;
|
||||||
bottomLeft.width = RESIZE_THICKNESS;
|
left.width = RESIZE_THICKNESS;
|
||||||
bottomLeft.height = RESIZE_THICKNESS;
|
left.height = outer.height;
|
||||||
m_cachedResizeAreas[ResizeTypes.BottomLeft] = bottomLeft;
|
m_resizeMask[ResizeTypes.Left] = left;
|
||||||
|
|
||||||
|
var top = new Rect();
|
||||||
|
top.x = outer.x;
|
||||||
|
top.y = outer.y + Panel.rect.height;
|
||||||
|
top.width = outer.width;
|
||||||
|
top.height = RESIZE_THICKNESS;
|
||||||
|
m_resizeMask[ResizeTypes.Top] = top;
|
||||||
|
|
||||||
|
var right = new Rect();
|
||||||
|
right.x = outer.x + Panel.rect.width;
|
||||||
|
right.y = outer.y;
|
||||||
|
right.width = RESIZE_THICKNESS;
|
||||||
|
right.height = outer.height;
|
||||||
|
m_resizeMask[ResizeTypes.Right] = right;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MouseInResizeArea(Vector2 mousePos)
|
private bool MouseInResizeArea(Vector2 mousePos)
|
||||||
{
|
{
|
||||||
return m_outerResize.Contains(mousePos) && !m_innerResize.Contains(mousePos);
|
return m_cachedOuterResize.Contains(mousePos) && GetResizeType(mousePos) != ResizeTypes.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResizeTypes GetResizeType(Vector2 mousePos)
|
private ResizeTypes GetResizeType(Vector2 mousePos)
|
||||||
{
|
{
|
||||||
foreach (var entry in m_cachedResizeAreas)
|
// Calculate which part of the resize area we're in, if any.
|
||||||
{
|
// We do this via a bitmask with the ResizeTypes enum.
|
||||||
if (entry.Value.Contains(mousePos))
|
// We can return Top/Right/Bottom/Left, or a corner like TopLeft.
|
||||||
{
|
|
||||||
return entry.Key;
|
int mask = 0;
|
||||||
}
|
|
||||||
}
|
if (m_resizeMask[ResizeTypes.Top].Contains(mousePos))
|
||||||
return ResizeTypes.NONE;
|
mask |= (int)ResizeTypes.Top;
|
||||||
|
else if (m_resizeMask[ResizeTypes.Bottom].Contains(mousePos))
|
||||||
|
mask |= (int)ResizeTypes.Bottom;
|
||||||
|
|
||||||
|
if (m_resizeMask[ResizeTypes.Left].Contains(mousePos))
|
||||||
|
mask |= (int)ResizeTypes.Left;
|
||||||
|
else if (m_resizeMask[ResizeTypes.Right].Contains(mousePos))
|
||||||
|
mask |= (int)ResizeTypes.Right;
|
||||||
|
|
||||||
|
return (ResizeTypes)mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnHoverResize(ResizeTypes resizeType)
|
public void OnHoverResize(ResizeTypes resizeType)
|
||||||
{
|
{
|
||||||
if (m_wasHoveringResize && m_lastResizeHoverType == resizeType)
|
if (WasHoveringResize && m_lastResizeHoverType == resizeType)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// we are entering resize, or the resize type has changed.
|
// we are entering resize, or the resize type has changed.
|
||||||
|
|
||||||
m_wasHoveringResize = true;
|
WasHoveringResize = true;
|
||||||
m_lastResizeHoverType = resizeType;
|
m_lastResizeHoverType = resizeType;
|
||||||
|
|
||||||
m_resizeCursorImage.SetActive(true);
|
m_resizeCursorImage.SetActive(true);
|
||||||
|
|
||||||
float rotation = 0;
|
// set the rotation for the resize icon
|
||||||
|
float iconRotation = 0f;
|
||||||
switch (resizeType)
|
switch (resizeType)
|
||||||
{
|
{
|
||||||
case ResizeTypes.TopRight:
|
case ResizeTypes.TopRight:
|
||||||
case ResizeTypes.BottomLeft:
|
case ResizeTypes.BottomLeft:
|
||||||
rotation = 45f; break;
|
iconRotation = 45f; break;
|
||||||
case ResizeTypes.Top:
|
case ResizeTypes.Top:
|
||||||
case ResizeTypes.Bottom:
|
case ResizeTypes.Bottom:
|
||||||
rotation = 90f; break;
|
iconRotation = 90f; break;
|
||||||
case ResizeTypes.TopLeft:
|
case ResizeTypes.TopLeft:
|
||||||
case ResizeTypes.BottomRight:
|
case ResizeTypes.BottomRight:
|
||||||
rotation = 135f; break;
|
iconRotation = 135f; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var rot = m_resizeCursorImage.transform.rotation;
|
var rot = m_resizeCursorImage.transform.rotation;
|
||||||
rot.eulerAngles = new Vector3(0, 0, rotation);
|
rot.eulerAngles = new Vector3(0, 0, iconRotation);
|
||||||
m_resizeCursorImage.transform.rotation = rot;
|
m_resizeCursorImage.transform.rotation = rot;
|
||||||
|
|
||||||
UpdateHoverImagePos();
|
UpdateHoverImagePos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update the resize icon position to be above the mouse
|
||||||
|
private void UpdateHoverImagePos()
|
||||||
|
{
|
||||||
|
if (!m_resizeCursorImage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var t =
|
||||||
|
#if CPP
|
||||||
|
UIManager.CanvasRoot.transform.TryCast<RectTransform>();
|
||||||
|
#else
|
||||||
|
UIManager.CanvasRoot.transform as RectTransform;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_resizeCursorImage.transform.localPosition = t.InverseTransformPoint(InputManager.MousePosition);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnHoverResizeEnd()
|
public void OnHoverResizeEnd()
|
||||||
{
|
{
|
||||||
m_wasHoveringResize = false;
|
WasHoveringResize = false;
|
||||||
m_resizeCursorImage.SetActive(false);
|
m_resizeCursorImage.SetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnBeginResize(ResizeTypes resizeType)
|
public void OnBeginResize(ResizeTypes resizeType)
|
||||||
{
|
{
|
||||||
m_currentResizeType = resizeType;
|
m_currentResizeType = resizeType;
|
||||||
m_lastMousePos = InputManager.MousePosition;
|
m_lastResizePos = InputManager.MousePosition;
|
||||||
WasResizing = true;
|
WasResizing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnResize()
|
public void OnResize()
|
||||||
{
|
{
|
||||||
var mousePos = InputManager.MousePosition;
|
var mousePos = InputManager.MousePosition;
|
||||||
var diff = m_lastMousePos - (Vector2)mousePos;
|
var diff = m_lastResizePos - (Vector2)mousePos;
|
||||||
m_lastMousePos = mousePos;
|
m_lastResizePos = mousePos;
|
||||||
|
|
||||||
var diffX = (float)((decimal)diff.x / Screen.width);
|
var diffX = (float)((decimal)diff.x / Screen.width);
|
||||||
var diffY = (float)((decimal)diff.y / Screen.height);
|
var diffY = (float)((decimal)diff.y / Screen.height);
|
||||||
@ -385,6 +348,33 @@ namespace ExplorerBeta.UI
|
|||||||
UpdateResizeCache();
|
UpdateResizeCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void LoadCursorImage()
|
||||||
|
{
|
||||||
|
var path = @"Mods\Explorer\cursor.png";
|
||||||
|
var data = File.ReadAllBytes(path);
|
||||||
|
|
||||||
|
var tex = new Texture2D(32, 32);
|
||||||
|
tex.LoadImage(data, false);
|
||||||
|
UnityEngine.Object.DontDestroyOnLoad(tex);
|
||||||
|
|
||||||
|
var size = new Rect();
|
||||||
|
size.width = 32;
|
||||||
|
size.height = 32;
|
||||||
|
var sprite = UIManager.CreateSprite(tex, size);
|
||||||
|
UnityEngine.Object.DontDestroyOnLoad(sprite);
|
||||||
|
|
||||||
|
m_resizeCursorImage = new GameObject("ResizeCursorImage");
|
||||||
|
m_resizeCursorImage.transform.SetParent(UIManager.CanvasRoot.transform);
|
||||||
|
|
||||||
|
var image = m_resizeCursorImage.AddComponent<Image>();
|
||||||
|
image.sprite = sprite;
|
||||||
|
var rect = image.transform.TryCast<RectTransform>();
|
||||||
|
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 32);
|
||||||
|
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 32);
|
||||||
|
|
||||||
|
m_resizeCursorImage.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -76,7 +76,7 @@ namespace ExplorerBeta.UI
|
|||||||
Transform transform = go.transform;
|
Transform transform = go.transform;
|
||||||
for (int i = 0; i < transform.childCount; i++)
|
for (int i = 0; i < transform.childCount; i++)
|
||||||
{
|
{
|
||||||
SetLayerRecursively(transform.GetChild(i).gameObject, 5);
|
SetLayerRecursively(transform.GetChild(i).gameObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user