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(); } } } } }