namespace UIWidgets
{
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
///
/// Base class for TracksView.
///
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1619:GenericTypeParametersMustBeDocumentedPartialClass", Justification = "Reviewed.")]
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
{
///
/// Class needed to have consistent connection between data and view.
///
protected class TracksDataViews
{
///
/// Visible item info.
///
protected class VisibleItem
{
///
/// Track.
///
public Track Track;
///
/// Data.
///
public TData Data;
///
/// Height.
///
public float Height;
///
/// View.
///
public TDataView View;
///
/// Set view data.
///
/// Owner.
public void SetData(TracksViewBase owner)
{
View.Owner = owner;
View.SetData(Track, Data, Height);
View.transform.SetAsLastSibling();
}
}
///
/// Cache.
///
protected Stack Cache = new Stack();
///
/// Data.
///
protected List Data = new List();
///
/// Indices of the views to disable.
///
protected List DisableIndices = new List();
///
/// Views component pool.
///
protected ListComponentPool Views;
///
/// Owner.
///
protected TracksViewBase Owner;
///
/// Initializes a new instance of the class.
///
/// Owner.
/// Views.
public TracksDataViews(TracksViewBase owner, ListComponentPool views)
{
Owner = owner;
Views = views;
}
///
/// Clear.
///
public void Clear()
{
foreach (var item in Data)
{
item.View = null;
Cache.Push(item);
}
Data.Clear();
DisableIndices.Clear();
}
///
/// Add data.
///
/// Track.
/// Item.
/// Height.
public void Add(Track track, TData data, float height)
{
var v_item = Cache.Count > 0 ? Cache.Pop() : new VisibleItem();
v_item.Track = track;
v_item.Data = data;
v_item.Height = height;
v_item.View = null;
Data.Add(v_item);
}
///
/// Find item by data.
///
/// Data.
/// Item or null.
protected VisibleItem Find(TData data)
{
foreach (var visible in Data)
{
if ((visible.View == null) && (visible.Data == data))
{
return visible;
}
}
return null;
}
///
/// Update view.
///
public void UpdateView()
{
for (int i = 0; i < Views.Count; i++)
{
var view = Views[i];
var visible = Find(view.Data);
if (visible != null)
{
visible.View = view;
}
else
{
DisableIndices.Add(i);
}
}
Views.Disable(DisableIndices);
foreach (var v_item in Data)
{
if (v_item.View == null)
{
v_item.View = Views.GetInstance();
}
v_item.SetData(Owner);
}
}
///
/// Update view positions.
///
public void UpdateViewPositions()
{
foreach (var v_item in Data)
{
v_item.View.SetPosition();
}
}
}
}
}