namespace UIWidgets
{
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// Base class for the track background.
///
/// Type of the data.
/// Type of the points.
[RequireComponent(typeof(Graphic))]
public class TrackBackgroundBase : TrackViewBase, IDropSupport
where TData : class, ITrackData
where TPoint : IComparable
{
///
/// Padding from start drag point to left border of the item.
/// Required for the correct StartPoint calculation.
///
[NonSerialized]
public float DragPositionPadding;
///
/// Process double click event.
///
/// Event data.
protected override void OnDoubleClick(PointerEventData eventData)
{
if (!Owner.IsInteractable())
{
return;
}
if (!AllowDialog)
{
return;
}
var start = Owner.Position2Point(GetPosition(eventData), eventData.pressEventCamera);
Owner.OpenCreateTrackDataDialog(Track, start);
}
///
/// Get position.
///
/// Event data.
/// Position.
protected Vector2 GetPosition(PointerEventData eventData)
{
var pos = eventData.position;
pos.x -= DragPositionPadding;
return pos;
}
///
/// Determines whether this instance can receive drop with the specified data and eventData.
///
/// true if this instance can receive drop with the specified data and eventData; otherwise, false.
/// Data.
/// Event data.
public virtual bool CanReceiveDrop(TData data, PointerEventData eventData)
{
if (data == null)
{
return true;
}
var prev_order = data.Order;
var start = Owner.Position2Point(eventData.position, eventData.pressEventCamera);
var end = data.EndPointByStartPoint(start);
var order = GetOrder(eventData);
var can_move = Owner.AllowIntersection || !Owner.TrackIntersection(Track, start, end, order, data);
if (can_move)
{
Track.Data.BeginUpdate();
data.ChangePoints(start, end);
if (!Track.Data.Contains(data))
{
Track.Data.Add(data);
prev_order = -1;
}
Track.SetItemOrder(data, order, prev_order);
Track.Data.EndUpdate();
}
return can_move;
}
///
/// Get order.
///
/// Event data.
/// Order.
protected virtual int GetOrder(PointerEventData eventData)
{
Vector2 point;
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, eventData.position, eventData.pressEventCamera, out point))
{
return 0;
}
var line = (-point.y) / (Owner.DefaultItemSize.y + Owner.ItemsSpacing);
return Mathf.FloorToInt(line);
}
///
/// Handle dropped data.
///
/// Data.
/// Event data.
public virtual void Drop(TData data, PointerEventData eventData)
{
}
///
/// Handle canceled drop.
///
/// Data.
/// Event data.
public virtual void DropCanceled(TData data, PointerEventData eventData)
{
}
}
}