/* Credit:
CaptainSchnittchen
https://forum.unity.com/threads/nested-scrollrect.268551/
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EnhancedScrollerDemos.NestedScrollers
{
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
public class ScrollRectEx : ScrollRect
{
private bool routeToParent = false;
///
/// Do action for all parents
///
private void DoForParents(Action action) where T : IEventSystemHandler
{
Transform parent = transform.parent;
while (parent != null)
{
foreach (var component in parent.GetComponents())
{
if (component is T)
action((T)(IEventSystemHandler)component);
}
parent = parent.parent;
}
}
///
/// Always route initialize potential drag event to parents
///
public override void OnInitializePotentialDrag(PointerEventData eventData)
{
DoForParents((parent) => { parent.OnInitializePotentialDrag(eventData); });
base.OnInitializePotentialDrag(eventData);
}
///
/// Drag event
///
public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
{
if (routeToParent)
DoForParents((parent) => { parent.OnDrag(eventData); });
else
base.OnDrag(eventData);
}
///
/// Begin drag event
///
public override void OnBeginDrag(UnityEngine.EventSystems.PointerEventData eventData)
{
if (!horizontal && Math.Abs(eventData.delta.x) > Math.Abs(eventData.delta.y))
routeToParent = true;
else if (!vertical && Math.Abs(eventData.delta.x) < Math.Abs(eventData.delta.y))
routeToParent = true;
else
routeToParent = false;
if (routeToParent)
DoForParents((parent) => { parent.OnBeginDrag(eventData); });
else
base.OnBeginDrag(eventData);
}
///
/// End drag event
///
public override void OnEndDrag(UnityEngine.EventSystems.PointerEventData eventData)
{
if (routeToParent)
DoForParents((parent) => { parent.OnEndDrag(eventData); });
else
base.OnEndDrag(eventData);
routeToParent = false;
}
}
}