Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch WinUI to CalendarDatePicker #1404

Merged
merged 1 commit into from
Jun 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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";
}
}
}
}