Tanoda
Segment.cs
Go to the documentation of this file.
1
3
4using System;
5using System.Collections;
8
10{
11 [AddComponentMenu("UI/Extensions/Segmented Control/Segment")]
12 [RequireComponent(typeof(Selectable))]
13 public class Segment :
14 UIBehaviour,
15 IPointerClickHandler,
16 ISubmitHandler,
17 IPointerEnterHandler, IPointerExitHandler,
18 IPointerDownHandler, IPointerUpHandler,
19 ISelectHandler, IDeselectHandler
20 {
21 internal int index;
22 internal SegmentedControl segmentedControl;
23
24 internal bool leftmost
25 {
26 get { return index == 0; }
27 }
28 internal bool rightmost
29 {
30 get { return index == segmentedControl.segments.Length - 1; }
31 }
32
33 public bool selected
34 {
35 get { return segmentedControl.selectedSegment == this.button; }
36 set { SetSelected(value); }
37 }
38
39 internal Selectable button
40 {
41 get { return GetComponent<Selectable>(); }
42 }
43
44 internal Sprite cutSprite;
45
46 protected Segment()
47 { }
48
49 protected override void Start()
50 {
51 StartCoroutine(DelayedInit());
52 }
53
54 IEnumerator DelayedInit()
55 {
56 yield return null;
57 yield return null;
58
59 button.image.overrideSprite = cutSprite;
60 if (selected)
61 MaintainSelection();
62 }
63
64 public virtual void OnPointerClick(PointerEventData eventData)
65 {
66 if (eventData.button != PointerEventData.InputButton.Left)
67 return;
68
69 selected = true;
70 }
71
72 public virtual void OnPointerEnter(PointerEventData eventData)
73 {
74 MaintainSelection();
75 }
76
77 public virtual void OnPointerExit(PointerEventData eventData)
78 {
79 MaintainSelection();
80 }
81
82 public virtual void OnPointerDown(PointerEventData eventData)
83 {
84 MaintainSelection();
85 }
86
87 public virtual void OnPointerUp(PointerEventData eventData)
88 {
89 MaintainSelection();
90 }
91
92 public virtual void OnSelect(BaseEventData eventData)
93 {
94 MaintainSelection();
95 }
96
97 public virtual void OnDeselect(BaseEventData eventData)
98 {
99 MaintainSelection();
100 }
101
102 protected override void OnEnable()
103 {
104 base.OnEnable();
105 if (segmentedControl)
106 MaintainSelection();
107 }
108
109 public virtual void OnSubmit(BaseEventData eventData)
110 {
111 selected = true;
112 }
113
114 private void SetSelected(bool value)
115 {
116 if (value && button.IsActive() && button.IsInteractable())
117 {
118 if (segmentedControl.selectedSegment == this.button)
119 {
120 if (segmentedControl.allowSwitchingOff)
121 {
122 Deselect();
123 }
124 else
125 {
126 MaintainSelection();
127 }
128 }
129 else
130 {
131 if (segmentedControl.selectedSegment)
132 {
133 var segment = segmentedControl.selectedSegment.GetComponent<Segment>();
134 segmentedControl.selectedSegment = null;
135 if (segment)
136 {
137 segment.TransitionButton();
138 }
139 }
140
141 segmentedControl.selectedSegment = this.button;
142 TransitionButton();
143 segmentedControl.onValueChanged.Invoke(index);
144 }
145 }
146 else if (segmentedControl.selectedSegment == this.button)
147 {
148 Deselect();
149 }
150 }
151
152 private void Deselect()
153 {
154 segmentedControl.selectedSegment = null;
155 TransitionButton();
156 segmentedControl.onValueChanged.Invoke(-1);
157 }
158
159 void MaintainSelection()
160 {
161 if (button != segmentedControl.selectedSegment)
162 return;
163
164 TransitionButton(true);
165 }
166
167 internal void TransitionButton()
168 {
169 TransitionButton(false);
170 }
171
172 internal void TransitionButton(bool instant)
173 {
174 Color tintColor = selected ? button.colors.pressedColor : button.colors.normalColor;
175 Color textColor = selected ? button.colors.normalColor : button.colors.pressedColor;
176 Sprite transitionSprite = selected ? button.spriteState.pressedSprite : cutSprite;
177 string triggerName = selected ? button.animationTriggers.pressedTrigger : button.animationTriggers.normalTrigger;
178
179 switch (button.transition)
180 {
181 case Selectable.Transition.ColorTint:
182 button.image.overrideSprite = cutSprite;
183 StartColorTween(tintColor * button.colors.colorMultiplier, instant);
184 ChangeTextColor(textColor * button.colors.colorMultiplier);
185 break;
186 case Selectable.Transition.SpriteSwap:
187 if (transitionSprite != cutSprite)
188 transitionSprite = SegmentedControl.CutSprite(transitionSprite, leftmost, rightmost);
189 DoSpriteSwap(transitionSprite);
190 break;
191 case Selectable.Transition.Animation:
192 button.image.overrideSprite = cutSprite;
193 TriggerAnimation(triggerName);
194 break;
195 }
196 }
197
198 void StartColorTween(Color targetColor, bool instant)
199 {
200 if (button.targetGraphic == null)
201 return;
202
203 button.targetGraphic.CrossFadeColor(targetColor, instant ? 0f : button.colors.fadeDuration, true, true);
204 }
205
206 void ChangeTextColor(Color targetColor)
207 {
208 var text = GetComponentInChildren<Text>();
209 if (!text)
210 return;
211
212 text.color = targetColor;
213 }
214
215 void DoSpriteSwap(Sprite newSprite)
216 {
217 if (button.image == null)
218 return;
219
220 button.image.overrideSprite = newSprite;
221 }
222
223 void TriggerAnimation(string triggername)
224 {
225 if (button.animator == null || !button.animator.isActiveAndEnabled || !button.animator.hasBoundPlayables || string.IsNullOrEmpty(triggername))
226 return;
227
228 button.animator.ResetTrigger(button.animationTriggers.normalTrigger);
229 button.animator.ResetTrigger(button.animationTriggers.pressedTrigger);
230 button.animator.ResetTrigger(button.animationTriggers.highlightedTrigger);
231 button.animator.ResetTrigger(button.animationTriggers.disabledTrigger);
232
233 button.animator.SetTrigger(triggername);
234 }
235 }
236}
UnityEngine.Color Color
Definition: TestScript.cs:32
virtual void OnPointerClick(PointerEventData eventData)
Definition: Segment.cs:64
virtual void OnDeselect(BaseEventData eventData)
Definition: Segment.cs:97
virtual void OnSelect(BaseEventData eventData)
Definition: Segment.cs:92
virtual void OnSubmit(BaseEventData eventData)
Definition: Segment.cs:109
virtual void OnPointerExit(PointerEventData eventData)
Definition: Segment.cs:77
virtual void OnPointerDown(PointerEventData eventData)
Definition: Segment.cs:82
virtual void OnPointerEnter(PointerEventData eventData)
Definition: Segment.cs:72
virtual void OnPointerUp(PointerEventData eventData)
Definition: Segment.cs:87
Credit Erdener Gonenc - @PixelEnvision.