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> Action = (x) => #endif { x.CopyTo(track); } #if !CSHARP_7_3_OR_NEWER ; #endif TrackDialog.Edit(track, Action); } /// /// Open dialog to create data. /// /// Track to created data. /// Start point for the data. public override void OpenCreateTrackDataDialog(Track track, TPoint startPoint) { TrackDataDialog.Create(startPoint, track.Data.Add); } /// /// Open dialog to edit data. /// /// Data. public override void OpenEditTrackDataDialog(TData data) { #if CSHARP_7_3_OR_NEWER void Action(TData x) #else Action Action = (x) => #endif { DataCopy(x, data); } #if !CSHARP_7_3_OR_NEWER ; #endif TrackDataDialog.Edit(data, Action); } } }