Skip to content

Commit 09cfbdf

Browse files
committed
Buttons
1 parent b57c8a3 commit 09cfbdf

File tree

3 files changed

+247
-0
lines changed

3 files changed

+247
-0
lines changed

Runtime/Ui/Buttons.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
using Juce.Core.Events.Consumer;
2+
using Juce.Core.Events.Generic;
3+
using Juce.CoreUnity.Pointers.Enums;
4+
using UnityEngine;
5+
using UnityEngine.EventSystems;
6+
using UnityEngine.UI;
7+
8+
namespace Juce.CoreUnity.Ui.Buttons
9+
{
10+
public class ButtonCallbacks : Selectable, ISubmitHandler, IPointerClickHandler
11+
{
12+
[SerializeField] private bool triggerPointerUpOnPointerExit = true;
13+
14+
private readonly EventConsumer<PointerCallbackEvents> eventConsumer = new EventConsumer<PointerCallbackEvents>();
15+
16+
public PointerCallbackPressState PressState { get; private set; } = PointerCallbackPressState.Up;
17+
public PointerCallbackPositionState PositionState { get; private set; } = PointerCallbackPositionState.Out;
18+
19+
public bool Selected { get; private set; }
20+
21+
public event GenericEvent<ButtonCallbacks, BaseEventData> OnSubmited;
22+
23+
public event GenericEvent<ButtonCallbacks, BaseEventData> OnSelected;
24+
public event GenericEvent<ButtonCallbacks, BaseEventData> OnDeselected;
25+
26+
public event GenericEvent<ButtonCallbacks, PointerEventData> OnEnter;
27+
public event GenericEvent<ButtonCallbacks, PointerEventData> OnExit;
28+
public event GenericEvent<ButtonCallbacks, PointerEventData> OnDown;
29+
public event GenericEvent<ButtonCallbacks, PointerEventData> OnUp;
30+
31+
private void OnApplicationFocus(bool hasFocus)
32+
{
33+
if (!hasFocus)
34+
{
35+
TrySetPressState(PointerCallbackPressState.Up, new PointerEventData(EventSystem.current));
36+
TrySetPositionState(PointerCallbackPositionState.Out, new PointerEventData(EventSystem.current));
37+
}
38+
}
39+
40+
public void SetAsSelected()
41+
{
42+
Select();
43+
44+
OnSelect(new BaseEventData(EventSystem.current));
45+
}
46+
47+
public override void OnSelect(BaseEventData eventData)
48+
{
49+
base.OnSelect(eventData);
50+
51+
Selected = true;
52+
53+
OnSelected?.Invoke(this, eventData);
54+
}
55+
56+
public override void OnDeselect(BaseEventData eventData)
57+
{
58+
base.OnDeselect(eventData);
59+
60+
Selected = false;
61+
62+
OnDeselected?.Invoke(this, eventData);
63+
}
64+
65+
public void OnSubmit(BaseEventData eventData)
66+
{
67+
if (!Selected)
68+
{
69+
return;
70+
}
71+
72+
bool isInteractable = IsInteractable();
73+
74+
if (!isInteractable)
75+
{
76+
return;
77+
}
78+
79+
OnSubmited?.Invoke(this, eventData);
80+
}
81+
82+
public void Consume(PointerCallbackEvents ev)
83+
{
84+
eventConsumer.Consume(ev);
85+
}
86+
87+
public override void OnPointerDown(PointerEventData pointerEventData)
88+
{
89+
base.OnPointerDown(pointerEventData);
90+
91+
bool isInteractable = IsInteractable();
92+
93+
if (!isInteractable)
94+
{
95+
return;
96+
}
97+
98+
TrySetPressState(PointerCallbackPressState.Down, pointerEventData);
99+
}
100+
101+
public override void OnPointerUp(PointerEventData pointerEventData)
102+
{
103+
base.OnPointerUp(pointerEventData);
104+
105+
TrySetPressState(PointerCallbackPressState.Up, pointerEventData);
106+
TrySetPositionState(PointerCallbackPositionState.Out, pointerEventData);
107+
}
108+
109+
public override void OnPointerEnter(PointerEventData pointerEventData)
110+
{
111+
base.OnPointerEnter(pointerEventData);
112+
113+
bool isInteractable = IsInteractable();
114+
115+
if (!isInteractable)
116+
{
117+
return;
118+
}
119+
120+
TrySetPositionState(PointerCallbackPositionState.In, pointerEventData);
121+
}
122+
123+
public override void OnPointerExit(PointerEventData pointerEventData)
124+
{
125+
base.OnPointerExit(pointerEventData);
126+
127+
TrySetPositionState(PointerCallbackPositionState.Out, pointerEventData);
128+
129+
if (triggerPointerUpOnPointerExit)
130+
{
131+
TrySetPressState(PointerCallbackPressState.Up, pointerEventData);
132+
}
133+
}
134+
135+
public void OnPointerClick(PointerEventData eventData)
136+
{
137+
bool isInteractable = IsInteractable();
138+
139+
if (!isInteractable)
140+
{
141+
return;
142+
}
143+
144+
bool alreadyConsumed = eventConsumer.Pop(PointerCallbackEvents.Click);
145+
146+
if (!alreadyConsumed)
147+
{
148+
OnSubmited?.Invoke(this, eventData);
149+
}
150+
}
151+
152+
private void TrySetPressState(PointerCallbackPressState pressState, PointerEventData pointerEventData)
153+
{
154+
switch (pressState)
155+
{
156+
case PointerCallbackPressState.Up:
157+
{
158+
if (PressState == PointerCallbackPressState.Down)
159+
{
160+
PressState = pressState;
161+
162+
bool alreadyConsumed = eventConsumer.Pop(PointerCallbackEvents.Up);
163+
164+
if (!alreadyConsumed)
165+
{
166+
OnUp?.Invoke(this, pointerEventData);
167+
}
168+
}
169+
}
170+
break;
171+
172+
case PointerCallbackPressState.Down:
173+
{
174+
if (PressState == PointerCallbackPressState.Up)
175+
{
176+
PressState = pressState;
177+
178+
bool alreadyConsumed = eventConsumer.Pop(PointerCallbackEvents.Down);
179+
180+
if (!alreadyConsumed)
181+
{
182+
OnDown?.Invoke(this, pointerEventData);
183+
}
184+
}
185+
}
186+
break;
187+
}
188+
}
189+
190+
private void TrySetPositionState(PointerCallbackPositionState positionState, PointerEventData pointerEventData)
191+
{
192+
switch (positionState)
193+
{
194+
case PointerCallbackPositionState.In:
195+
{
196+
if (PositionState == PointerCallbackPositionState.Out)
197+
{
198+
PositionState = positionState;
199+
200+
bool alreadyConsumed = eventConsumer.Pop(PointerCallbackEvents.Enter);
201+
202+
if (!alreadyConsumed)
203+
{
204+
OnEnter?.Invoke(this, pointerEventData);
205+
}
206+
}
207+
}
208+
break;
209+
210+
case PointerCallbackPositionState.Out:
211+
{
212+
if (PositionState == PointerCallbackPositionState.In)
213+
{
214+
PositionState = positionState;
215+
216+
bool alreadyConsumed = eventConsumer.Pop(PointerCallbackEvents.Exit);
217+
218+
if (!alreadyConsumed)
219+
{
220+
OnExit?.Invoke(this, pointerEventData);
221+
}
222+
}
223+
}
224+
break;
225+
}
226+
}
227+
}
228+
}

Runtime/Ui/Buttons/ButtonCallbacks.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)