namespace UIWidgets.Examples { using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Serialization; /// /// Schedule view. /// public class ScheduleView : TracksViewCustom { [Multiline] [SerializeField] string dateFormat = "dd MMM yyyy"; /// /// Date format. /// public string DateFormat { get { return dateFormat; } set { dateFormat = value; PointsNamesView.UpdateView(); } } [SerializeField] RectTransform todayHighlight; /// /// Today highlight. /// public RectTransform TodayHighlight { get { return todayHighlight; } set { todayHighlight = value; todayHighlight.pivot = new Vector2(0f, 1f); UpdateDateHighlights(); } } [SerializeField] RectTransform weekendHighlightsDefaultItem; /// /// Default item to display weekend highlights. /// public RectTransform WeekendHighlightsDefaultItem { get { return weekendHighlightsDefaultItem; } set { weekendHighlightsDefaultItem = value; weekendHighlightsDefaultItem.pivot = new Vector2(0f, 1f); weekendHighlights.Template = value; UpdateDateHighlights(); } } [SerializeField] [HideInInspector] List weekendHighlightsActive = new List(); [SerializeField] [HideInInspector] List weekendHighlightsCache = new List(); ListComponentPool weekendHighlights; /// /// Weekend highlights. /// protected ListComponentPool WeekendHighlights { get { if (weekendHighlights == null) { weekendHighlights = new ListComponentPool(weekendHighlightsDefaultItem, weekendHighlightsActive, weekendHighlightsCache, TracksDataView.content); } return weekendHighlights; } } /// /// Minimal length of the item in hours. /// [SerializeField] [Tooltip("Minimal length of the item in hours.")] protected int MinHours = 1; DateTime Today; [SerializeField] [FormerlySerializedAs("GroupByName")] bool groupByName; /// /// Group tasks with same name on one line. /// public bool GroupByName { get { return groupByName; } set { if (groupByName != value) { groupByName = value; if (isScheduleInited) { Layout = null; UpdateView(); } } } } bool isScheduleInited; /// /// Init this instance. /// public override void Init() { if (isScheduleInited) { return; } isScheduleInited = true; Today = DateTime.Today; valueAtCenter = Today; if (TodayHighlight != null) { TodayHighlight.pivot = new Vector2(0f, 1f); } if (WeekendHighlightsDefaultItem != null) { WeekendHighlightsDefaultItem.pivot = new Vector2(0f, 1f); } base.Init(); } /// /// Update view. /// protected override void UpdateView() { base.UpdateView(); UpdateDateHighlights(); } /// /// Update view. /// protected override void UpdateDataViewPositions() { base.UpdateDataViewPositions(); UpdateDateHighlights(); } [NonSerialized] readonly List weekends = new List(); /// /// Update date highlights. /// protected virtual void UpdateDateHighlights() { if (TodayHighlight != null) { SetPosition(TodayHighlight, Today); } if (weekendHighlightsDefaultItem != null) { weekends.Clear(); var half = PointsNamesView.Count / 2; for (int i = -half; i <= half; i++) { var day = ValueAtCenter.AddDays(i); if (IsWeekend(day)) { weekends.Add(day); } } WeekendHighlights.Require(weekends.Count); for (int i = 0; i < weekends.Count; i++) { SetPosition(WeekendHighlights[i], weekends[i]); } } } /// /// Set highlight position for the specified date. /// /// RectTransform. /// Date. protected void SetPosition(RectTransform rect, DateTime date) { var pos = rect.localPosition; pos.x = Point2Position(date); rect.localPosition = pos; rect.SetAsFirstSibling(); } /// /// Check is date is weekend. /// /// Date. /// true if date is weekend; otherwise false. protected virtual bool IsWeekend(DateTime date) { return date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday; } /// /// Convert point to base value. /// /// Point. /// Base value. protected override float Point2Base(DateTime point) { var delta = point - ValueAtCenter; return delta.Days + (delta.Hours / 24f); } /// /// Convert base value to point. /// /// Base value. /// Point. protected override DateTime Base2Point(float baseValue) { var days = Mathf.FloorToInt(baseValue); var hours = Mathf.RoundToInt((baseValue - days) * 24); var result = ValueAtCenter.AddDays(days); result = result.AddHours(hours); return result; } /// /// Get string representation of ValueAtCenter at specified distance. /// /// Distance. /// String representation of value at specified distance. protected override string Value2Text(int distance) { return ChangeValue(distance).ToString(DateFormat, UtilitiesCompare.Culture); } /// /// Change ValueAtCenter on specified delta. /// /// Delta. /// New value. protected override DateTime ChangeValue(int delta) { return ValueAtCenter.AddDays(delta); } /// /// Copy data from source to target. /// /// Source. /// Target. public override void DataCopy(TrackData source, TrackData target) { source.CopyTo(target); } /// /// Get minimal width of the item. /// /// Minimal width. protected override float GetItemMinWidth() { return GetPointHeaderWidth() / 24f * MinHours; } /// /// Set track settings. /// /// Track. protected override void SetTrackSettings(Track track) { track.SeparateGroups = !GroupByName; track.Layout = Layout; track.ItemsToTop = ItemsToTop; } /// /// Get layout for the tracks. /// /// Layout function. protected override TrackLayout GetLayout() { return GroupByName ? new TrackLayoutByName() : base.GetLayout(); } /// /// Check if target item has intersection with items in the track within range and order. /// /// Track. /// Start point. /// End item. /// New order of the target item. /// Target item. Will be ignored if presents in the items list. /// true if any items has intersection; otherwise false. public override bool TrackIntersection(Track track, DateTime start, DateTime end, int order, TrackData target) { var is_new = !track.Data.Contains(target); if ((!is_new) && (target.Order != order) && (!GroupByName)) { return false; } GetPossibleIntersections(track.Data, order, target, TempList); var result = ListIntersection(TempList, start, end, order, target); TempList.Clear(); return result; } /// /// Get possible intersections with the target. /// /// Items. /// Order. /// Target. /// List of the possible intersections, protected override void GetPossibleIntersections(ObservableList items, int order, TrackData target, List output) { if (GroupByName) { foreach (var item in items) { if ((item.Name == target.Name) && !ReferenceEquals(item, target)) { output.Add(item); } } } else { base.GetPossibleIntersections(items, order, target, output); } } #if UNITY_EDITOR /// /// Validate data. /// protected override void OnValidate() { base.OnValidate(); if (MinHours < 1) { MinHours = 1; } } #endif } }