163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | namespace SRDebugger.UI | |||
|  | { | |||
|  |     using Other; | |||
|  |     using SRF; | |||
|  |     using UnityEngine; | |||
|  |     using UnityEngine.UI; | |||
|  | 
 | |||
|  |     public class MobileMenuController : SRMonoBehaviourEx | |||
|  |     { | |||
|  |         private UnityEngine.UI.Button _closeButton; | |||
|  | 
 | |||
|  |         [SerializeField] private float _maxMenuWidth = 185f; | |||
|  | 
 | |||
|  |         [SerializeField] private float _peekAmount = 45f; | |||
|  | 
 | |||
|  |         private float _targetXPosition; | |||
|  | 
 | |||
|  |         [RequiredField] public RectTransform Content; | |||
|  | 
 | |||
|  |         [RequiredField] public RectTransform Menu; | |||
|  | 
 | |||
|  |         [RequiredField] public UnityEngine.UI.Button OpenButton; | |||
|  | 
 | |||
|  |         [RequiredField] public SRTabController TabController; | |||
|  | 
 | |||
|  |         public float PeekAmount | |||
|  |         { | |||
|  |             get { return _peekAmount; } | |||
|  |         } | |||
|  | 
 | |||
|  |         public float MaxMenuWidth | |||
|  |         { | |||
|  |             get { return _maxMenuWidth; } | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override void OnEnable() | |||
|  |         { | |||
|  |             base.OnEnable(); | |||
|  | 
 | |||
|  |             var parent = Menu.parent as RectTransform; | |||
|  | 
 | |||
|  |             var layoutElement = Menu.GetComponent<LayoutElement>(); | |||
|  |             layoutElement.ignoreLayout = true; | |||
|  | 
 | |||
|  |             // Set up menu anchors so it stretches to full height and has the screen width | |||
|  |             Menu.pivot = new Vector2(1, 1); | |||
|  | 
 | |||
|  |             Menu.offsetMin = new Vector2(1f, 0f); | |||
|  |             Menu.offsetMax = new Vector2(1f, 1f); | |||
|  | 
 | |||
|  |             Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, | |||
|  |                 Mathf.Clamp(parent.rect.width - PeekAmount, 0, MaxMenuWidth)); | |||
|  | 
 | |||
|  |             Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, parent.rect.height); | |||
|  | 
 | |||
|  |             Menu.anchoredPosition = new Vector2(0, 0); | |||
|  | 
 | |||
|  |             if (_closeButton == null) | |||
|  |             { | |||
|  |                 CreateCloseButton(); | |||
|  |             } | |||
|  | 
 | |||
|  |             OpenButton.gameObject.SetActive(true); | |||
|  | 
 | |||
|  |             TabController.ActiveTabChanged += TabControllerOnActiveTabChanged; | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override void OnDisable() | |||
|  |         { | |||
|  |             base.OnDisable(); | |||
|  | 
 | |||
|  |             var layoutElement = Menu.GetComponent<LayoutElement>(); | |||
|  |             layoutElement.ignoreLayout = false; | |||
|  | 
 | |||
|  |             // Reset content position in case it has been moved by opening the menu | |||
|  |             Content.anchoredPosition = new Vector2(0, 0); | |||
|  | 
 | |||
|  |             _closeButton.gameObject.SetActive(false); | |||
|  |             OpenButton.gameObject.SetActive(false); | |||
|  | 
 | |||
|  |             TabController.ActiveTabChanged -= TabControllerOnActiveTabChanged; | |||
|  |         } | |||
|  | 
 | |||
|  |         private void CreateCloseButton() | |||
|  |         { | |||
|  |             var go = new GameObject("SR_CloseButtonCanvas", typeof(RectTransform)); | |||
|  |             go.transform.SetParent(Content, false); | |||
|  |             var c = go.AddComponent<Canvas>(); | |||
|  |             go.AddComponent<GraphicRaycaster>(); | |||
|  |             var rect = go.GetComponentOrAdd<RectTransform>(); | |||
|  | 
 | |||
|  |             c.overrideSorting = true; | |||
|  |             c.sortingOrder = 122; | |||
|  | 
 | |||
|  |             go.AddComponent<LayoutElement>().ignoreLayout = true; | |||
|  | 
 | |||
|  |             SetRectSize(rect); | |||
|  | 
 | |||
|  |             var cGo = new GameObject("SR_CloseButton", typeof(RectTransform)); | |||
|  |             cGo.transform.SetParent(rect, false); | |||
|  |             var cRect = cGo.GetComponent<RectTransform>(); | |||
|  | 
 | |||
|  |             SetRectSize(cRect); | |||
|  |             cGo.AddComponent<Image>().color = new Color(0, 0, 0, 0); | |||
|  | 
 | |||
|  |             _closeButton = cGo.AddComponent<UnityEngine.UI.Button>(); | |||
|  |             _closeButton.transition = Selectable.Transition.None; | |||
|  |             _closeButton.onClick.AddListener(CloseButtonClicked); | |||
|  |             _closeButton.gameObject.SetActive(false); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void SetRectSize(RectTransform rect) | |||
|  |         { | |||
|  |             rect.anchorMin = new Vector2(0, 0); | |||
|  |             rect.anchorMax = new Vector2(1, 1); | |||
|  |             rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Content.rect.width); | |||
|  |             rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Content.rect.height); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void CloseButtonClicked() | |||
|  |         { | |||
|  |             Close(); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override void Update() | |||
|  |         { | |||
|  |             base.Update(); | |||
|  | 
 | |||
|  |             var from = Content.anchoredPosition.x; | |||
|  | 
 | |||
|  |             if (Mathf.Abs(_targetXPosition - from) < 2.5f) | |||
|  |             { | |||
|  |                 Content.anchoredPosition = new Vector2(_targetXPosition, Content.anchoredPosition.y); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 Content.anchoredPosition = | |||
|  |                     new Vector2(SRMath.SpringLerp(from, _targetXPosition, 15f, Time.unscaledDeltaTime), | |||
|  |                         Content.anchoredPosition.y); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void TabControllerOnActiveTabChanged(SRTabController srTabController, SRTab srTab) | |||
|  |         { | |||
|  |             Close(); | |||
|  |         } | |||
|  | 
 | |||
|  |         [ContextMenu("Open")] | |||
|  |         public void Open() | |||
|  |         { | |||
|  |             _targetXPosition = Menu.rect.width; | |||
|  |             _closeButton.gameObject.SetActive(true); | |||
|  |         } | |||
|  | 
 | |||
|  |         [ContextMenu("Close")] | |||
|  |         public void Close() | |||
|  |         { | |||
|  |             _targetXPosition = 0; | |||
|  |             _closeButton.gameObject.SetActive(false); | |||
|  |         } | |||
|  |     } | |||
|  | } |