Window UI 확장 오류 수정 #176

Merged
jym merged 1 commits from jym/250624_01 into main 2025-06-24 11:37:57 +09:00
3 changed files with 65 additions and 16 deletions

View File

@@ -1,6 +1,7 @@
using System.Drawing.Printing; using System.Drawing.Printing;
using UnityEngine; using UnityEngine;
using Studio.UI; using Studio.UI;
using System.Collections.Generic;
namespace Studio.Manage namespace Studio.Manage
{ {
@@ -15,7 +16,9 @@ namespace Studio.Manage
Texture2D cursor_DownLeft; Texture2D cursor_DownLeft;
Texture2D cursor_DownRight; Texture2D cursor_DownRight;
public List<Texture2D> cursors = new List<Texture2D>();
public UI_GUIWindow currentUseGUIWindow; public UI_GUIWindow currentUseGUIWindow;
public Texture2D currentCursor;
public override void Init() public override void Init()
{ {
@@ -27,6 +30,15 @@ namespace Studio.Manage
cursor_UpRight = Resources.Load<Texture2D>("Images/cursor_diag_b"); cursor_UpRight = Resources.Load<Texture2D>("Images/cursor_diag_b");
cursor_DownLeft = Resources.Load<Texture2D>("Images/cursor_diag_b"); cursor_DownLeft = Resources.Load<Texture2D>("Images/cursor_diag_b");
cursor_DownRight = Resources.Load<Texture2D>("Images/cursor_diag_a"); cursor_DownRight = Resources.Load<Texture2D>("Images/cursor_diag_a");
cursors.Add(cursor_Up);
cursors.Add(cursor_Down);
cursors.Add(cursor_Left);
cursors.Add(cursor_Right);
cursors.Add(cursor_UpLeft);
cursors.Add(cursor_UpRight);
cursors.Add(cursor_DownLeft);
cursors.Add(cursor_DownRight);
} }
public void ChangeMouseCursor(ResizeDirection dir) public void ChangeMouseCursor(ResizeDirection dir)
@@ -65,6 +77,8 @@ namespace Studio.Manage
void ChangeCursor(Texture2D cursorTexture) void ChangeCursor(Texture2D cursorTexture)
{ {
currentCursor = cursorTexture;
Vector2 hotspot = new Vector2(16, 16); Vector2 hotspot = new Vector2(16, 16);
if (cursorTexture == null) if (cursorTexture == null)
@@ -74,5 +88,16 @@ namespace Studio.Manage
Cursor.SetCursor(cursorTexture, hotspot, CursorMode.Auto); Cursor.SetCursor(cursorTexture, hotspot, CursorMode.Auto);
} }
public bool IsResizeCursor()
{
foreach (var cursor in cursors)
{
if (currentCursor == cursor)
{
return true;
}
}
return false;
}
} }
} }

View File

@@ -29,6 +29,7 @@ namespace Studio.UI
public class UI_GUIWindow : UIBase, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerMoveHandler, IDragHandler public class UI_GUIWindow : UIBase, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerMoveHandler, IDragHandler
{ {
RectTransform rect; RectTransform rect;
public UI_GUIWindowHeader header;
public RectTransform Area; public RectTransform Area;
CursorManager cursorManager; CursorManager cursorManager;
@@ -66,7 +67,7 @@ namespace Studio.UI
raycastImg.raycastTarget = true; raycastImg.raycastTarget = true;
raycastImg.color = Color.clear; raycastImg.color = Color.clear;
var header = GetComponentInChildren<UI_GUIWindowHeader>(); header = GetComponentInChildren<UI_GUIWindowHeader>();
if (header == null) if (header == null)
{ {
Debug.LogError("GUIWindow¿¡ Header°¡ ¾øÀ½: " + gameObject.name); Debug.LogError("GUIWindow¿¡ Header°¡ ¾øÀ½: " + gameObject.name);
@@ -93,6 +94,8 @@ namespace Studio.UI
if (!isCanResize) if (!isCanResize)
return; return;
SetHeaderSetting();
switch (state) switch (state)
{ {
case GUIState.Resize: case GUIState.Resize:
@@ -290,42 +293,41 @@ namespace Studio.UI
{ {
if (rect == null) return false; if (rect == null) return false;
// 기존 사이즈와 비교
Vector2 currentSize = rect.rect.size; Vector2 currentSize = rect.rect.size;
bool isShrinking = newSize.x <= currentSize.x && newSize.y <= currentSize.y; bool isShrinking = newSize.x <= currentSize.x && newSize.y <= currentSize.y;
// 축소면 무조건 허용
if (isShrinking) if (isShrinking)
return true; return true;
// 확장이라면 화면 안에 있을 때만 허용 return WouldBeInsideCanvas(rect, newSize);
return IsRectTransformInsideCanvas(rect);
} }
public bool IsRectTransformInsideCanvas(RectTransform targetRect) public bool WouldBeInsideCanvas(RectTransform targetRect, Vector2 newSize)
{ {
if (targetRect == null) if (targetRect == null)
return false; return false;
Canvas rootCanvas = targetRect.GetComponentInParent<Canvas>(); Canvas rootCanvas = targetRect.GetComponentInParent<Canvas>();
if (rootCanvas == null || !rootCanvas.pixelRect.Contains(Vector2.zero)) if (rootCanvas == null)
return false; return false;
RectTransform canvasRect = rootCanvas.GetComponent<RectTransform>(); Vector3 position = targetRect.position;
Vector2 pivot = targetRect.pivot;
Vector2 scaledSize = new Vector2(newSize.x * targetRect.lossyScale.x, newSize.y * targetRect.lossyScale.y);
Vector3[] worldCorners = new Vector3[4]; Vector3 bottomLeft = position - new Vector3(pivot.x * scaledSize.x, pivot.y * scaledSize.y);
targetRect.GetWorldCorners(worldCorners); Vector3 topRight = bottomLeft + new Vector3(scaledSize.x, scaledSize.y);
foreach (var corner in worldCorners) Vector3[] testCorners = new Vector3[] { bottomLeft, new Vector3(topRight.x, bottomLeft.y), new Vector3(bottomLeft.x, topRight.y), topRight };
foreach (var corner in testCorners)
{ {
Vector3 viewportPoint = RectTransformUtility.WorldToScreenPoint(null, corner); Vector3 screenPoint = RectTransformUtility.WorldToScreenPoint(null, corner);
// Canvas 크기 기준으로 판단 if (screenPoint.x < 0 || screenPoint.x > Screen.width || screenPoint.y < 0 || screenPoint.y > Screen.height)
if (viewportPoint.x < 0 || viewportPoint.y < 0 ||
viewportPoint.x > Screen.width || viewportPoint.y > Screen.height)
{ {
return false; // 하나라도 화면 밖에 있음 return false;
} }
} }
@@ -354,5 +356,21 @@ namespace Studio.UI
{ {
transform.SetAsLastSibling(); transform.SetAsLastSibling();
} }
private void SetHeaderSetting()
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(header.rectTransform, Input.mousePosition, null, out var localPoint);
if (header.rectTransform.rect.Contains(localPoint))
{
if (cursorManager.IsResizeCursor())
{
header.enabled = false;
}
else
{
header.enabled = true;
}
}
}
} }
} }

View File

@@ -1,3 +1,4 @@
using Studio.Manage;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using XRLib.UI; using XRLib.UI;
@@ -6,15 +7,20 @@ namespace Studio.UI
{ {
public class UI_GUIWindowHeader : UIBase, IPointerDownHandler public class UI_GUIWindowHeader : UIBase, IPointerDownHandler
{ {
CursorManager cursorManager;
UI_GUIWindow parentGUIWindow; UI_GUIWindow parentGUIWindow;
public override void AfterAwake() public override void AfterAwake()
{ {
cursorManager = ManagerHub.instance.Get<CursorManager>();
parentGUIWindow = GetParentGUIWindow(); parentGUIWindow = GetParentGUIWindow();
} }
public void OnPointerDown(PointerEventData eventData) public void OnPointerDown(PointerEventData eventData)
{ {
if (cursorManager.IsResizeCursor())
return;
parentGUIWindow.SetPanelAsLastSibling(); parentGUIWindow.SetPanelAsLastSibling();
parentGUIWindow.SetMoveState(); parentGUIWindow.SetMoveState();
} }