Tanoda
ScrollRectEx.cs
Go to the documentation of this file.
1
4
5/*USAGE:
6Simply place the script on the ScrollRect that contains the selectable children we'll be scrolling to
7and drag'n'drop the RectTransform of the options "container" that we'll be scrolling.*/
8
9using System;
11
13{
14 [AddComponentMenu("UI/Extensions/ScrollRectEx")]
15 public class ScrollRectEx : ScrollRect
16 {
17 private bool routeToParent = false;
18
22 private void DoForParents<T>(Action<T> action) where T : IEventSystemHandler
23 {
24 Transform parent = transform.parent;
25 while (parent != null)
26 {
27 foreach (var component in parent.GetComponents<Component>())
28 {
29 if (component is T)
30 action((T)(IEventSystemHandler)component);
31 }
32 parent = parent.parent;
33 }
34 }
35
39 public override void OnInitializePotentialDrag(PointerEventData eventData)
40 {
41 DoForParents<IInitializePotentialDragHandler>((parent) => { parent.OnInitializePotentialDrag(eventData); });
42 base.OnInitializePotentialDrag(eventData);
43 }
44
48 public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
49 {
50 if (routeToParent)
51 DoForParents<IDragHandler>((parent) => { parent.OnDrag(eventData); });
52 else
53 base.OnDrag(eventData);
54 }
55
59 public override void OnBeginDrag(UnityEngine.EventSystems.PointerEventData eventData)
60 {
61 if (!horizontal && Math.Abs(eventData.delta.x) > Math.Abs(eventData.delta.y))
62 routeToParent = true;
63 else if (!vertical && Math.Abs(eventData.delta.x) < Math.Abs(eventData.delta.y))
64 routeToParent = true;
65 else
66 routeToParent = false;
67
68 if (routeToParent)
69 DoForParents<IBeginDragHandler>((parent) => { parent.OnBeginDrag(eventData); });
70 else
71 base.OnBeginDrag(eventData);
72 }
73
77 public override void OnEndDrag(UnityEngine.EventSystems.PointerEventData eventData)
78 {
79 if (routeToParent)
80 DoForParents<IEndDragHandler>((parent) => { parent.OnEndDrag(eventData); });
81 else
82 base.OnEndDrag(eventData);
83 routeToParent = false;
84 }
85
86 public override void OnScroll(PointerEventData eventData)
87 {
88 if (!horizontal && Math.Abs(eventData.scrollDelta.x) > Math.Abs(eventData.scrollDelta.y))
89 {
90 routeToParent = true;
91 }
92 else if (!vertical && Math.Abs(eventData.scrollDelta.x) < Math.Abs(eventData.scrollDelta.y))
93 {
94 routeToParent = true;
95 }
96 else
97 {
98 routeToParent = false;
99 }
100
101 if (routeToParent)
102 DoForParents<IScrollHandler>((parent) => {
103 parent.OnScroll(eventData);
104 });
105 else
106 base.OnScroll(eventData);
107 }
108 }
109}
UnityEngine.Component Component
Es.InkPainter.Math Math
Definition: PaintTest.cs:7
override void OnScroll(PointerEventData eventData)
Definition: ScrollRectEx.cs:86
override void OnBeginDrag(UnityEngine.EventSystems.PointerEventData eventData)
Begin drag event
Definition: ScrollRectEx.cs:59
override void OnInitializePotentialDrag(PointerEventData eventData)
Always route initialize potential drag event to parents
Definition: ScrollRectEx.cs:39
override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
Drag event
Definition: ScrollRectEx.cs:48
override void OnEndDrag(UnityEngine.EventSystems.PointerEventData eventData)
End drag event
Definition: ScrollRectEx.cs:77
Credit Erdener Gonenc - @PixelEnvision.