summaryrefslogtreecommitdiff
path: root/Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs')
-rw-r--r--Pathfinding Visualizer/Assets/CodeMonkey/Utils/Button_UI.cs228
1 files changed, 228 insertions, 0 deletions
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<PointerEventData> 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<RectTransform>().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<RectTransform>().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<RectTransform>().anchoredPosition;
+ posEnter = transform.GetComponent<RectTransform>().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<bool> testPassthroughFunc) {
+ return InterceptAction("ClickFunc", testPassthroughFunc);
+ }
+ public InterceptActionHandler InterceptAction(string fieldName, Func<bool> testPassthroughFunc) {
+ return InterceptAction(GetType().GetField(fieldName), testPassthroughFunc);
+ }
+ public InterceptActionHandler InterceptAction(System.Reflection.FieldInfo fieldInfo, Func<bool> 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