Skip to content

Commit

Permalink
Switch WinUI to CalendarDatePicker; implements #1092
Browse files Browse the repository at this point in the history
  • Loading branch information
hartez committed Jun 22, 2021
1 parent e45fb4b commit 52c39b6
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 122 deletions.
43 changes: 24 additions & 19 deletions src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@

namespace Microsoft.Maui.Handlers
{
public partial class DatePickerHandler : ViewHandler<IDatePicker, DatePicker>
public partial class DatePickerHandler : ViewHandler<IDatePicker, CalendarDatePicker>
{
WBrush? _defaultForeground;

protected override DatePicker CreateNativeView() => new DatePicker();
protected override CalendarDatePicker CreateNativeView() => new CalendarDatePicker();

protected override void ConnectHandler(DatePicker nativeView)
protected override void ConnectHandler(CalendarDatePicker nativeView)
{
nativeView.DateChanged += OnControlDateChanged;
nativeView.DateChanged += DateChanged;
}

protected override void DisconnectHandler(DatePicker nativeView)
protected override void DisconnectHandler(CalendarDatePicker nativeView)
{
nativeView.DateChanged -= OnControlDateChanged;
nativeView.DateChanged -= DateChanged;
}

protected override void SetupDefaults(DatePicker nativeView)
protected override void SetupDefaults(CalendarDatePicker nativeView)
{
_defaultForeground = nativeView.Foreground;

Expand Down Expand Up @@ -64,25 +64,30 @@ public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicke
handler.NativeView?.UpdateTextColor(datePicker, handler._defaultForeground);
}

void OnControlDateChanged(object? sender, DatePickerValueChangedEventArgs e)
private void DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args)
{
if (VirtualView == null)
return;

if (VirtualView.Date.CompareTo(e.NewDate.Date) != 0)
if (!args.NewDate.HasValue)
{
var date = e.NewDate.Date.Clamp(VirtualView.MinimumDate, VirtualView.MaximumDate);
VirtualView.Date = date;
return;
}

// Set the control date-time to clamped value, if it exceeded the limits at the time of installation.
if (date != e.NewDate.Date)
{
NativeView?.UpdateDate(date);
NativeView?.UpdateLayout();
}
// TODO ezhart 2021-06-21 For the moment, IDatePicker requires a date to be selected; once that's fixed, we can uncomment these next lines

VirtualView.InvalidateMeasure();
}
//if (!args.NewDate.HasValue)
//{
// VirtualView.Date = null;
// return;
//}

//if (VirtualView.Date == null)
//{
// VirtualView.Date = args.NewDate.Value.Date;
//}

VirtualView.Date = args.NewDate.Value.Date;
}
}
}
113 changes: 10 additions & 103 deletions src/Core/src/Platform/Windows/DatePickerExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,132 +8,39 @@ namespace Microsoft.Maui
{
public static class DatePickerExtensions
{
public static void UpdateDate(this DatePicker nativeDatePicker, IDatePicker datePicker)
public static void UpdateDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker)
{
var date = datePicker.Date;
nativeDatePicker.UpdateDate(date);

nativeDatePicker.UpdateDay(datePicker);
nativeDatePicker.UpdateMonth(datePicker);
nativeDatePicker.UpdateYear(datePicker);
}

public static void UpdateDate(this DatePicker nativeDatePicker, DateTime dateTime)
public static void UpdateDate(this CalendarDatePicker nativeDatePicker, DateTime dateTime)
{
nativeDatePicker.Date = new DateTimeOffset(new DateTime(dateTime.Ticks, DateTimeKind.Unspecified));
nativeDatePicker.Date = dateTime;
}

public static void UpdateMinimumDate(this DatePicker nativeDatePicker, IDatePicker datePicker)
public static void UpdateMinimumDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker)
{
DateTime mindate = datePicker.MinimumDate;

try
{
nativeDatePicker.MinYear = new DateTimeOffset(new DateTime(datePicker.MinimumDate.Ticks, DateTimeKind.Unspecified));
}
catch (ArgumentOutOfRangeException)
{
// This will be thrown when mindate equals DateTime.MinValue and the UTC offset is positive
// because the resulting DateTimeOffset.UtcDateTime will be out of range. In that case let's
// specify the Kind as UTC so there is no offset.
mindate = DateTime.SpecifyKind(mindate, DateTimeKind.Utc);
nativeDatePicker.MinYear = new DateTimeOffset(mindate);
}
nativeDatePicker.MinDate = datePicker.MinimumDate;
}

public static void UpdateMaximumDate(this DatePicker nativeDatePicker, IDatePicker datePicker)
public static void UpdateMaximumDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker)
{
nativeDatePicker.MaxYear = new DateTimeOffset(new DateTime(datePicker.MaximumDate.Ticks, DateTimeKind.Unspecified));
nativeDatePicker.MaxDate = datePicker.MaximumDate;
}

public static void UpdateCharacterSpacing(this DatePicker nativeDatePicker, IDatePicker datePicker)
public static void UpdateCharacterSpacing(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker)
{
nativeDatePicker.CharacterSpacing = datePicker.CharacterSpacing.ToEm();
}

public static void UpdateFont(this DatePicker nativeDatePicker, IDatePicker datePicker, IFontManager fontManager) =>
public static void UpdateFont(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker, IFontManager fontManager) =>
nativeDatePicker.UpdateFont(datePicker.Font, fontManager);

public static void UpdateTextColor(this DatePicker nativeDatePicker, IDatePicker datePicker, WBrush? defaultForeground)
public static void UpdateTextColor(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker, WBrush? defaultForeground)
{
Color textColor = datePicker.TextColor;
nativeDatePicker.Foreground = textColor == null ? (defaultForeground ?? textColor?.ToNative()) : textColor.ToNative();
}

internal static void UpdateDay(this DatePicker nativeDatePicker, IDatePicker datePicker)
{
nativeDatePicker.DayVisible = true;

if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d"))
{
nativeDatePicker.DayFormat = "day";
}
else if (datePicker.Format.Equals("D"))
{
nativeDatePicker.DayFormat = "dayofweek.full";
}
else
{
var day = datePicker.Format.Count(x => x == 'd');
if (day == 0)
nativeDatePicker.DayVisible = false;
else if (day == 3)
nativeDatePicker.DayFormat = "day dayofweek.abbreviated";
else if (day == 4)
nativeDatePicker.DayFormat = "dayofweek.full";
else
nativeDatePicker.DayFormat = "day";
}
}

internal static void UpdateMonth(this DatePicker nativeDatePicker, IDatePicker datePicker)
{
nativeDatePicker.MonthVisible = true;

if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d"))
{
nativeDatePicker.MonthFormat = "month";
}
else if (datePicker.Format.Equals("D"))
{
nativeDatePicker.MonthFormat = "month.full";
}
else
{
var month = datePicker.Format.Count(x => x == 'M');
if (month == 0)
nativeDatePicker.MonthVisible = false;
else if (month <= 2)
nativeDatePicker.MonthFormat = "month.numeric";
else if (month == 3)
nativeDatePicker.MonthFormat = "month.abbreviated";
else
nativeDatePicker.MonthFormat = "month.full";
}
}

internal static void UpdateYear(this DatePicker nativeDatePicker, IDatePicker datePicker)
{
nativeDatePicker.YearVisible = true;

if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d"))
{
nativeDatePicker.YearFormat = "year";
}
else if (datePicker.Format.Equals("D"))
{
nativeDatePicker.YearFormat = "year.full";
}
else
{
var year = datePicker.Format.Count(x => x == 'y');
if (year == 0)
nativeDatePicker.YearVisible = false;
else if (year <= 2)
nativeDatePicker.YearFormat = "year.abbreviated";
else
nativeDatePicker.YearFormat = "year.full";
}
}
}
}

0 comments on commit 52c39b6

Please sign in to comment.