namespace UIWidgets
{
using System;
using System.Collections.Generic;
using UnityEngine;
///
/// Base class for TracksView.
///
/// Data type.
/// Point type.
/// DataView type.
/// TrackView type.
/// TrackBackground type.
/// TrackDataDialog type.
/// TrackDataForm type.
/// TrackDialog type.
/// TrackForm type.
public abstract partial class TracksViewCustom : TracksViewBase
where TData : class, ITrackData
where TPoint : IComparable
where TDataView : TrackDataViewBase
where TTrackView : TrackViewBase
where TTrackBackground : TrackBackgroundBase
where TTrackDataDialog : TrackDataDialogBase
where TTrackDataForm : TrackDataFormBase
where TTrackDialog : TrackDialogBase
where TTrackForm : TrackFormBase
{
[SerializeField]
TDataView defaultItem;
///
/// Default item to display data.
///
public TDataView DefaultItem
{
get
{
return defaultItem;
}
set
{
if (defaultItem != value)
{
defaultItem = value;
var rt = defaultItem.transform as RectTransform;
rt.pivot = new Vector2(0f, 1f);
DefaultItemSize = rt.rect.size;
DataViews.Template = defaultItem;
ChangeDefaultItemResizable();
UpdateView();
}
}
}
[SerializeField]
[HideInInspector]
List dataViewsActive = new List();
[SerializeField]
[HideInInspector]
List dataViewsCache = new List();
ListComponentPool dataViews;
///
/// Data views.
///
protected ListComponentPool DataViews
{
get
{
if (dataViews == null)
{
dataViews = new ListComponentPool(DefaultItem, dataViewsActive, dataViewsCache, TracksDataView.content);
}
return dataViews;
}
}
[SerializeField]
TTrackView defaultTrackHeader;
///
/// Default item to display tracks headers.
///
public TTrackView DefaultTrackHeader
{
get
{
return defaultTrackHeader;
}
set
{
if (defaultTrackHeader != value)
{
defaultTrackHeader = value;
var rt = defaultTrackHeader as RectTransform;
rt.pivot = new Vector2(0f, 1f);
TracksHeaders.Template = defaultTrackHeader;
UpdateView();
}
}
}
[SerializeField]
[HideInInspector]
List trackHeadersActive = new List();
[SerializeField]
[HideInInspector]
List trackHeadersCache = new List();
ListComponentPool tracksHeaders;
///
/// Tracks headers.
///
protected ListComponentPool TracksHeaders
{
get
{
if (tracksHeaders == null)
{
tracksHeaders = new ListComponentPool(DefaultTrackHeader, trackHeadersActive, trackHeadersCache, TracksNamesView.content);
}
return tracksHeaders;
}
}
[SerializeField]
TTrackBackground defaultTrackBackground;
///
/// Default item to display tracks backgrounds.
///
public TTrackBackground DefaultTrackBackground
{
get
{
return defaultTrackBackground;
}
set
{
if (defaultTrackBackground != value)
{
defaultTrackBackground = value;
var rt = defaultTrackBackground as RectTransform;
rt.pivot = new Vector2(0f, 1f);
TracksBackgrounds.Template = defaultTrackBackground;
UpdateView();
}
}
}
[SerializeField]
[HideInInspector]
List tracksBackgroundsActive = new List();
[SerializeField]
[HideInInspector]
List tracksBackgroundsCache = new List();
ListComponentPool tracksBackgrounds;
///
/// Tracks backgrounds.
///
protected ListComponentPool TracksBackgrounds
{
get
{
if (tracksBackgrounds == null)
{
tracksBackgrounds = new ListComponentPool(DefaultTrackBackground, tracksBackgroundsActive, tracksBackgroundsCache, TracksDataView.content);
}
return tracksBackgrounds;
}
}
///
/// Dialog to add/edit data.
///
[SerializeField]
public TTrackDataDialog TrackDataDialog;
///
/// Dialog to add/edit track.
///
[SerializeField]
public TTrackDialog TrackDialog;
///
/// Views for the visible data.
///
[NonSerialized]
protected TracksDataViews VisibleDataViews;
///
/// Visible items of the track.
/// Reusable list.
///
[NonSerialized]
protected List TrackVisibleItems = new List();
bool isCustomInited;
///
/// Init this instance.
///
public override void Init()
{
if (isCustomInited)
{
return;
}
isCustomInited = true;
base.Init();
var rt = DefaultItem.transform as RectTransform;
rt.pivot = new Vector2(0f, 1f);
DefaultItemSize = rt.rect.size;
var t_rt = DefaultTrackHeader.transform as RectTransform;
t_rt.pivot = new Vector2(0f, 1f);
var tb_rt = DefaultTrackBackground.transform as RectTransform;
tb_rt.pivot = new Vector2(0f, 1f);
ChangeDefaultItemResizable();
EnableDataView(TracksDataView);
EnableTracksView(TracksNamesView);
EnablePointsView(PointsNamesView);
VisibleDataViews = new TracksDataViews(this, DataViews);
UpdateView();
}
///
/// Change settings of DefaultItem.Resizable component.
///
protected override void ChangeDefaultItemResizable()
{
var width = GetItemMinWidth();
var size = new Vector2(width, DefaultItemSize.y);
SetResizableSize(DefaultItem, size);
for (int i = 0; i < dataViewsActive.Count; i++)
{
SetResizableSize(dataViewsActive[i], size);
}
for (int i = 0; i < dataViewsCache.Count; i++)
{
SetResizableSize(dataViewsCache[i], size);
}
}
///
/// Set Resizable.MinSize for the specified component.
///
/// Component.
/// Size.
protected void SetResizableSize(TDataView component, Vector2 size)
{
var resizable = Utilities.GetOrAddComponent(component);
resizable.MinSize = size;
}
///
/// Process destroy event.
///
protected override void OnDestroy()
{
dataViews = null;
tracksHeaders = null;
tracksBackgrounds = null;
base.OnDestroy();
}
///
/// Update data view.
///
protected override void UpdateDataView()
{
VisibleDataViews.Clear();
var height = 0f;
foreach (var track in Tracks)
{
track.VisibleRangeSet(VisibleStart, VisibleEnd);
track.GetVisibleItems(TrackVisibleItems);
foreach (var data in TrackVisibleItems)
{
VisibleDataViews.Add(track, data, height);
}
TrackVisibleItems.Clear();
height += TrackHeight(track) + TracksSpacing;
}
if (Tracks.Count > 0)
{
height -= TracksSpacing;
}
VisibleDataViews.UpdateView();
var view_height = Mathf.Max(height, (TracksDataView.transform as RectTransform).rect.height);
TracksDataView.content.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, view_height);
TracksNamesView.content.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, view_height);
}
///
/// Update data view positions.
///
protected override void UpdateDataViewPositions()
{
VisibleDataViews.UpdateViewPositions();
}
///
/// Update tracks view.
///
protected override void UpdateTracksView()
{
TracksHeaders.Require(Tracks.Count);
TracksBackgrounds.Require(Tracks.Count);
var position = new Vector2(Point2Position(VisibleStart), 0f);
var size = new Vector2(Point2Position(VisibleEnd) - position.x, 0f);
for (int i = 0; i < Tracks.Count; i++)
{
var track = Tracks[i];
size.y = TrackHeight(track);
var header = TracksHeaders[i];
header.Owner = this;
header.SetData(track);
header.SetHeight(size.y);
header.SetVerticalPosition(position.y);
var bg = TracksBackgrounds[i];
bg.Owner = this;
bg.SetData(track);
bg.SetSize(size);
bg.SetPosition(position);
bg.transform.SetAsFirstSibling();
position.y += size.y + TracksSpacing;
}
}
///
/// Open dialog to create track.
///
public override void OpenCreateTrackDialog()
{
TrackDialog.Create(Tracks.Add);
}
///
/// Open dialog to edit track.
///
/// Track.
public override void OpenEditTrackDialog(Track track)
{
#if CSHARP_7_3_OR_NEWER
void Action(Track x)
#else
Action