5f9e8f979d
cell values and grid lines are displayed. no interaction available yet.
228 lines
9.4 KiB
C#
228 lines
9.4 KiB
C#
/*
|
|
------------------- 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;
|
|
}
|
|
}
|
|
} |