using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace Bitsplash.DatePicker { /// /// /// public partial class DatePickerContent : IDatePickerPrivate { DateTime? mSelectionFirst; DateTime? mDragFirst; DateTime? mDragTo; HashSet mDragSelectionRange = new HashSet(); bool mDragSelectionChanged = false; Dictionary mMarkerColors = new Dictionary(); public void SetAllMarkerColors(Dictionary markers) { mMarkerColors.Clear(); foreach (var pair in markers) mMarkerColors.Add(pair.Key.Date, pair.Value); RefreshSelection(); } public void SetMarkerColor(DateTime date, Color color) { mMarkerColors[date.Date] = color; RefreshSelection(); } public void ClearMarker(DateTime date) { mMarkerColors.Remove(date.Date); RefreshSelection(); } public void ClearMarkerColor() { mMarkerColors.Clear(); RefreshSelection(); } void SelectOne(DateTime date) { mSelection.SelectOne(date); mSelectionFirst = date; } void ToogleOne(DateTime date) { if (mSelection.IsSingleDateSelected(date) && AllowEmptySelection) { mSelection.Clear(); mSelectionFirst = null; } else SelectOne(date); } void UpdateSelection() { if(mDragSelectionChanged || ((IDatePickerCollectionPrivate) mSelection).Changed) { ((IDatePickerCollectionPrivate)mSelection).Changed = false; mDragSelectionChanged = false; RefreshSelection(); } } void RefreshSelection() { for (int i = 0; i < mCells.Length; i++) { var date = mCells[i].DayValue.Date; bool withinMonth = date.Month == DisplayDate.Month && date.Year == DisplayDate.Year; Color markerColor; if (mMarkerColors.TryGetValue(date, out markerColor) == false) markerColor = new Color(0f, 0f, 0f, 0f); if (mCells[i].MarkerColor != markerColor) mCells[i].MarkerColor = markerColor; if ((mSelection.Contains(date) || mDragSelectionRange.Contains(date)) && withinMonth) { if (mCells[i].CellSelected == false) mCells[i].CellSelected = true; } else { if(mCells[i].CellSelected == true) mCells[i].CellSelected = false; } } } void LimitRangeToMonth(HashSet selection,DateTime month) { selection.RemoveWhere((x) => x.Month != month.Month || x.Year != month.Year); } void SelectRange(DateTime from,DateTime to) { mSelection.SelectRange(from, to); } void ToogleMultiple(DateTime date) { if (mSelection.Contains(date)) { if (mSelection.Count > 1 || AllowEmptySelection) mSelection.Remove(date); } else { mSelection.Add(date); } } void ConnectSelection(DateTime date) { date = date.Date; if (mSelection.Contains(date)) // already within the selection return; if(mSelection.Count == 0 || mSelectionFirst.HasValue == false) { SelectOne(date); return; } SelectRange(mSelectionFirst.Value, date); } void ProcessRangeClick(DatePickerCell cell, int cellChildIndex) { if (mDatePickerInput.MultipleSelectionValue == MultipleSelectionInputValue.Append) ConnectSelection(cell.DayValue); else if (mDatePickerInput.MultipleSelectionValue == MultipleSelectionInputValue.Singular) ToogleOne(cell.DayValue); } void ProcessMultipleClick(DatePickerCell cell, int cellChildIndex) { if (mDatePickerInput.MultipleSelectionValue == MultipleSelectionInputValue.Append) ToogleMultiple(cell.DayValue); else if (mDatePickerInput.MultipleSelectionValue == MultipleSelectionInputValue.Singular) ToogleOne(cell.DayValue); } void ProcessSelectionClick(DatePickerCell cell,int cellChildIndex) { switch (SelectionMode) { case SelectionType.Single: ToogleOne(cell.DayValue); break; case SelectionType.Range: ProcessRangeClick(cell, cellChildIndex); break; case SelectionType.Multiple: ProcessMultipleClick(cell, cellChildIndex); break; } } protected virtual void OnCellClick(DatePickerCell cell, int cellChildIndex) { if (cell.CellEnabled == false) return; if (mDragFirst.HasValue || mDragTo.HasValue) return; ProcessSelectionClick(cell, cellChildIndex); } void RaiseSelectionChanged() { if (OnSelectionChanged != null) OnSelectionChanged.Invoke(); } void IDatePickerPrivate.RaiseClick(int childIndex) { OnCellClick(mCells[childIndex], childIndex); } void IDatePickerPrivate.RaiseStartSelection(int childIndex) { if (SelectionMode == SelectionType.Single) return; DateTime dayValue = mCells[childIndex].DayValue; if (SelectionMode == SelectionType.Range || (SelectionMode == SelectionType.Multiple && mDatePickerInput.MultipleSelectionValue == MultipleSelectionInputValue.Singular)) mSelection.SelectOne(dayValue); mDragFirst = dayValue; if (mDragTo.HasValue && mDragFirst.HasValue) { CommonMethods.SelectRange(mDragTo.Value, mDragFirst.Value, mDragSelectionRange); } else { mDragSelectionRange.Clear(); mDragSelectionRange.Add(dayValue); } mSelectionFirst = null; LimitRangeToMonth(mDragSelectionRange, mMonthFirst); mDragSelectionChanged = true; } void IDatePickerPrivate.EndSelection() { if (SelectionMode == SelectionType.Single) return; if (mDragTo.HasValue && mDragFirst.HasValue) { CommonMethods.SelectRange(mDragTo.Value, mDragFirst.Value, mDragSelectionRange); LimitRangeToMonth(mDragSelectionRange, mMonthFirst); mSelection.AddItems(mDragSelectionRange); } mDragSelectionRange.Clear(); mDragSelectionChanged = true; mDragTo = null; mDragFirst = null; } void IDatePickerPrivate.RaiseSelectionEnter(int childIndex, int fromChildIndex) { if (SelectionMode == SelectionType.Single) return; mSelectionFirst = null; mDragTo = mCells[childIndex].DayValue; if (mDragTo.HasValue && mDragFirst.HasValue) { CommonMethods.SelectRange(mDragTo.Value, mDragFirst.Value, mDragSelectionRange); LimitRangeToMonth(mDragSelectionRange, mMonthFirst); } mDragSelectionChanged = true; } void IDatePickerPrivate.RaiseSelectionExit(int childIndex, int fromChildIndex) { if (SelectionMode == SelectionType.Single) return; // if (mDragTo.HasValue && mDragTo.Value == mCells[childIndex].DayValue) // mDragTo = null; } } }