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);
 | |
|         }
 | |
|     }
 | |
| }
 |