diff --git a/Assets/Scripts/Studio/Managers/CursorManager.cs b/Assets/Scripts/Studio/Managers/CursorManager.cs index fc205a7e..8f147e27 100644 --- a/Assets/Scripts/Studio/Managers/CursorManager.cs +++ b/Assets/Scripts/Studio/Managers/CursorManager.cs @@ -1,6 +1,7 @@ using System.Drawing.Printing; using UnityEngine; using Studio.UI; +using System.Collections.Generic; namespace Studio.Manage { @@ -15,7 +16,9 @@ namespace Studio.Manage Texture2D cursor_DownLeft; Texture2D cursor_DownRight; + public List cursors = new List(); public UI_GUIWindow currentUseGUIWindow; + public Texture2D currentCursor; public override void Init() { @@ -27,6 +30,15 @@ namespace Studio.Manage cursor_UpRight = Resources.Load("Images/cursor_diag_b"); cursor_DownLeft = Resources.Load("Images/cursor_diag_b"); cursor_DownRight = Resources.Load("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) @@ -65,6 +77,8 @@ namespace Studio.Manage void ChangeCursor(Texture2D cursorTexture) { + currentCursor = cursorTexture; + Vector2 hotspot = new Vector2(16, 16); if (cursorTexture == null) @@ -74,5 +88,16 @@ namespace Studio.Manage Cursor.SetCursor(cursorTexture, hotspot, CursorMode.Auto); } + public bool IsResizeCursor() + { + foreach (var cursor in cursors) + { + if (currentCursor == cursor) + { + return true; + } + } + return false; + } } } diff --git a/Assets/Scripts/Studio/UI/Tag/UI_GUIWindow.cs b/Assets/Scripts/Studio/UI/Tag/UI_GUIWindow.cs index c6735b1a..214a7e08 100644 --- a/Assets/Scripts/Studio/UI/Tag/UI_GUIWindow.cs +++ b/Assets/Scripts/Studio/UI/Tag/UI_GUIWindow.cs @@ -29,6 +29,7 @@ namespace Studio.UI public class UI_GUIWindow : UIBase, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerMoveHandler, IDragHandler { RectTransform rect; + public UI_GUIWindowHeader header; public RectTransform Area; CursorManager cursorManager; @@ -66,7 +67,7 @@ namespace Studio.UI raycastImg.raycastTarget = true; raycastImg.color = Color.clear; - var header = GetComponentInChildren(); + header = GetComponentInChildren(); if (header == null) { Debug.LogError("GUIWindow¿¡ Header°¡ ¾øÀ½: " + gameObject.name); @@ -93,6 +94,8 @@ namespace Studio.UI if (!isCanResize) return; + SetHeaderSetting(); + switch (state) { case GUIState.Resize: @@ -290,42 +293,41 @@ namespace Studio.UI { if (rect == null) return false; - // ±âÁ¸ »çÀÌÁî¿Í ºñ±³ Vector2 currentSize = rect.rect.size; bool isShrinking = newSize.x <= currentSize.x && newSize.y <= currentSize.y; - // Ãà¼Ò¸é ¹«Á¶°Ç Çã¿ë if (isShrinking) return true; - // È®ÀåÀ̶ó¸é È­¸é ¾È¿¡ ÀÖÀ» ¶§¸¸ Çã¿ë - return IsRectTransformInsideCanvas(rect); + return WouldBeInsideCanvas(rect, newSize); } - public bool IsRectTransformInsideCanvas(RectTransform targetRect) + public bool WouldBeInsideCanvas(RectTransform targetRect, Vector2 newSize) { if (targetRect == null) return false; Canvas rootCanvas = targetRect.GetComponentInParent(); - if (rootCanvas == null || !rootCanvas.pixelRect.Contains(Vector2.zero)) + if (rootCanvas == null) return false; - RectTransform canvasRect = rootCanvas.GetComponent(); + 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]; - targetRect.GetWorldCorners(worldCorners); + Vector3 bottomLeft = position - new Vector3(pivot.x * scaledSize.x, pivot.y * scaledSize.y); + 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 (viewportPoint.x < 0 || viewportPoint.y < 0 || - viewportPoint.x > Screen.width || viewportPoint.y > Screen.height) + if (screenPoint.x < 0 || screenPoint.x > Screen.width || screenPoint.y < 0 || screenPoint.y > Screen.height) { - return false; // Çϳª¶óµµ È­¸é ¹Û¿¡ ÀÖÀ½ + return false; } } @@ -354,5 +356,21 @@ namespace Studio.UI { 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; + } + } + } } } diff --git a/Assets/Scripts/Studio/UI/Tag/UI_GUIWindowHeader.cs b/Assets/Scripts/Studio/UI/Tag/UI_GUIWindowHeader.cs index 865dd712..c5eac0d0 100644 --- a/Assets/Scripts/Studio/UI/Tag/UI_GUIWindowHeader.cs +++ b/Assets/Scripts/Studio/UI/Tag/UI_GUIWindowHeader.cs @@ -1,3 +1,4 @@ +using Studio.Manage; using UnityEngine; using UnityEngine.EventSystems; using XRLib.UI; @@ -6,15 +7,20 @@ namespace Studio.UI { public class UI_GUIWindowHeader : UIBase, IPointerDownHandler { + CursorManager cursorManager; UI_GUIWindow parentGUIWindow; public override void AfterAwake() { + cursorManager = ManagerHub.instance.Get(); parentGUIWindow = GetParentGUIWindow(); } public void OnPointerDown(PointerEventData eventData) { + if (cursorManager.IsResizeCursor()) + return; + parentGUIWindow.SetPanelAsLastSibling(); parentGUIWindow.SetMoveState(); }