From 5f9e8f979deb94e9219113ed09b49142c040cb57 Mon Sep 17 00:00:00 2001 From: Simon O'Shea Date: Mon, 31 Jul 2023 18:45:01 -0400 Subject: import successful, grid has visuals cell values and grid lines are displayed. no interaction available yet. --- .../Assets/CodeMonkey/Utils/Button_UI.cs | 228 +++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs (limited to 'Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs') diff --git a/Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs b/Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs new file mode 100644 index 0000000..d0bd30e --- /dev/null +++ b/Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs @@ -0,0 +1,228 @@ +/* + ------------------- Code Monkey ------------------- + + Thank you for downloading the Code Monkey Utilities + I hope you find them useful in your projects + If you have any questions use the contact form + Cheers! + + unitycodemonkey.com + -------------------------------------------------- + */ + +//#define SOUND_MANAGER // Has Sound_Manager in project +//#define CURSOR_MANAGER // Has Cursor_Manager in project + +using System; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; + +namespace CodeMonkey.Utils { + + /* + * Button in the UI + * */ + public class Button_UI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler { + + public Action ClickFunc = null; + public Action MouseRightClickFunc = null; + public Action MouseMiddleClickFunc = null; + public Action MouseDownOnceFunc = null; + public Action MouseUpFunc = null; + public Action MouseOverOnceTooltipFunc = null; + public Action MouseOutOnceTooltipFunc = null; + public Action MouseOverOnceFunc = null; + public Action MouseOutOnceFunc = null; + public Action MouseOverFunc = null; + public Action MouseOverPerSecFunc = null; //Triggers every sec if mouseOver + public Action MouseUpdate = null; + public Action OnPointerClickFunc; + + public enum HoverBehaviour { + Custom, + Change_Color, + Change_Color_Auto, + Change_Image, + Change_SetActive, + } + public HoverBehaviour hoverBehaviourType = HoverBehaviour.Custom; + private Action hoverBehaviourFunc_Enter, hoverBehaviourFunc_Exit; + + public Color hoverBehaviour_Color_Enter, hoverBehaviour_Color_Exit; + public Image hoverBehaviour_Image; + public Sprite hoverBehaviour_Sprite_Exit, hoverBehaviour_Sprite_Enter; + public bool hoverBehaviour_Move = false; + public Vector2 hoverBehaviour_Move_Amount = Vector2.zero; + private Vector2 posExit, posEnter; + public bool triggerMouseOutFuncOnClick = false; + private bool mouseOver; + private float mouseOverPerSecFuncTimer; + + private Action internalOnPointerEnterFunc = null, internalOnPointerExitFunc = null, internalOnPointerClickFunc = null; + +#if SOUND_MANAGER + public Sound_Manager.Sound mouseOverSound, mouseClickSound; +#endif +#if CURSOR_MANAGER + public CursorManager.CursorType cursorMouseOver, cursorMouseOut; +#endif + + + public virtual void OnPointerEnter(PointerEventData eventData) { + if (internalOnPointerEnterFunc != null) internalOnPointerEnterFunc(); + if (hoverBehaviour_Move) transform.GetComponent().anchoredPosition = posEnter; + if (hoverBehaviourFunc_Enter != null) hoverBehaviourFunc_Enter(); + if (MouseOverOnceFunc != null) MouseOverOnceFunc(); + if (MouseOverOnceTooltipFunc != null) MouseOverOnceTooltipFunc(); + mouseOver = true; + mouseOverPerSecFuncTimer = 0f; + } + + public virtual void OnPointerExit(PointerEventData eventData) { + if (internalOnPointerExitFunc != null) internalOnPointerExitFunc(); + if (hoverBehaviour_Move) transform.GetComponent().anchoredPosition = posExit; + if (hoverBehaviourFunc_Exit != null) hoverBehaviourFunc_Exit(); + if (MouseOutOnceFunc != null) MouseOutOnceFunc(); + if (MouseOutOnceTooltipFunc != null) MouseOutOnceTooltipFunc(); + mouseOver = false; + } + + public virtual void OnPointerClick(PointerEventData eventData) { + if (internalOnPointerClickFunc != null) internalOnPointerClickFunc(); + if (OnPointerClickFunc != null) OnPointerClickFunc(eventData); + if (eventData.button == PointerEventData.InputButton.Left) { + if (triggerMouseOutFuncOnClick) { + OnPointerExit(eventData); + } + if (ClickFunc != null) ClickFunc(); + } + if (eventData.button == PointerEventData.InputButton.Right) + if (MouseRightClickFunc != null) MouseRightClickFunc(); + if (eventData.button == PointerEventData.InputButton.Middle) + if (MouseMiddleClickFunc != null) MouseMiddleClickFunc(); + } + + public void Manual_OnPointerExit() { + OnPointerExit(null); + } + + public bool IsMouseOver() { + return mouseOver; + } + + public void OnPointerDown(PointerEventData eventData) { + if (MouseDownOnceFunc != null) MouseDownOnceFunc(); + } + + public void OnPointerUp(PointerEventData eventData) { + if (MouseUpFunc != null) MouseUpFunc(); + } + + private void Update() { + if (mouseOver) { + if (MouseOverFunc != null) MouseOverFunc(); + mouseOverPerSecFuncTimer -= Time.unscaledDeltaTime; + if (mouseOverPerSecFuncTimer <= 0) { + mouseOverPerSecFuncTimer += 1f; + if (MouseOverPerSecFunc != null) MouseOverPerSecFunc(); + } + } + if (MouseUpdate != null) MouseUpdate(); + + } + + private void Awake() { + posExit = transform.GetComponent().anchoredPosition; + posEnter = transform.GetComponent().anchoredPosition + hoverBehaviour_Move_Amount; + SetHoverBehaviourType(hoverBehaviourType); + +#if SOUND_MANAGER + // Sound Manager + internalOnPointerEnterFunc += () => { if (mouseOverSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseOverSound); }; + internalOnPointerClickFunc += () => { if (mouseClickSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseClickSound); }; +#endif + +#if CURSOR_MANAGER + // Cursor Manager + internalOnPointerEnterFunc += () => { if (cursorMouseOver != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOver); }; + internalOnPointerExitFunc += () => { if (cursorMouseOut != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOut); }; +#endif + } + + public void SetHoverBehaviourType(HoverBehaviour hoverBehaviourType) { + this.hoverBehaviourType = hoverBehaviourType; + switch (hoverBehaviourType) { + case HoverBehaviour.Change_Color: + hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Enter; }; + hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Exit; }; + break; + case HoverBehaviour.Change_Image: + hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Enter; }; + hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Exit; }; + break; + case HoverBehaviour.Change_SetActive: + hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.gameObject.SetActive(true); }; + hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.gameObject.SetActive(false); }; + break; + case HoverBehaviour.Change_Color_Auto: + Color color = hoverBehaviour_Image.color; + if (color.r >= 1f) color.r = .9f; + if (color.g >= 1f) color.g = .9f; + if (color.b >= 1f) color.b = .9f; + Color colorOver = color * 1.3f; // Over color lighter + hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = colorOver; }; + hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = color; }; + break; + } + } + + public void RefreshHoverBehaviourType() { + SetHoverBehaviourType(hoverBehaviourType); + } + + + + + + + + + + + /* + * Class for temporarily intercepting a button action + * Useful for Tutorial disabling specific buttons + * */ + public class InterceptActionHandler { + + private Action removeInterceptFunc; + + public InterceptActionHandler(Action removeInterceptFunc) { + this.removeInterceptFunc = removeInterceptFunc; + } + public void RemoveIntercept() { + removeInterceptFunc(); + } + } + public InterceptActionHandler InterceptActionClick(Func testPassthroughFunc) { + return InterceptAction("ClickFunc", testPassthroughFunc); + } + public InterceptActionHandler InterceptAction(string fieldName, Func testPassthroughFunc) { + return InterceptAction(GetType().GetField(fieldName), testPassthroughFunc); + } + public InterceptActionHandler InterceptAction(System.Reflection.FieldInfo fieldInfo, Func testPassthroughFunc) { + Action backFunc = fieldInfo.GetValue(this) as Action; + InterceptActionHandler interceptActionHandler = new InterceptActionHandler(() => fieldInfo.SetValue(this, backFunc)); + fieldInfo.SetValue(this, (Action)delegate () { + if (testPassthroughFunc()) { + // Passthrough + interceptActionHandler.RemoveIntercept(); + backFunc(); + } + }); + + return interceptActionHandler; + } + } +} \ No newline at end of file -- cgit v1.3.1-4-g156e