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
}
}