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) { } } }