Skip to content

Commit

Permalink
Implement more WinUI DatePickerHandler properties (dotnet#859)
Browse files Browse the repository at this point in the history
* Implement more properties in WinUI DatePickerHandler

* Mapped native DateChanged event

* Fix broken tests

* Enable nullable in WinUI DatePickerHandler

* Fix build error
  • Loading branch information
jsuarezruiz authored and lytico committed Jun 8, 2021
1 parent 6387e03 commit 5acdd3e
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 12 deletions.
5 changes: 5 additions & 0 deletions src/Compatibility/Core/src/WinUI/DatePickerRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ protected override void OnElementPropertyChanged(object sender, PropertyChangedE

protected override bool PreventGestureBubbling { get; set; } = true;

[PortHandler]
void OnControlDateChanged(object sender, DatePickerValueChangedEventArgs e)
{
if (Element == null)
Expand Down Expand Up @@ -237,11 +238,13 @@ void UpdateFlowDirection()
Control.UpdateFlowDirection(Element);
}

[PortHandler]
void UpdateCharacterSpacing()
{
Control.CharacterSpacing = Element.CharacterSpacing.ToEm();
}

[PortHandler]
void UpdateFont()
{
if (Control == null)
Expand Down Expand Up @@ -275,12 +278,14 @@ void UpdateFont()
_fontApplied = true;
}

[PortHandler]
void UpdateMaximumDate()
{
if (Element != null && Control != null)
Control.MaxYear = new DateTimeOffset(new DateTime(Element.MaximumDate.Ticks, DateTimeKind.Unspecified));
}

[PortHandler]
void UpdateMinimumDate()
{
DateTime mindate = Element.MinimumDate;
Expand Down
1 change: 1 addition & 0 deletions src/Compatibility/Core/src/WinUI/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ internal static UwpScrollBarVisibility ToUwpScrollBarVisibility(this ScrollBarVi
}
}

[PortHandler]
public static T Clamp<T>(this T value, T min, T max) where T : IComparable<T>
{
if (value.CompareTo(min) < 0)
Expand Down
65 changes: 54 additions & 11 deletions src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
#nullable enable
using Microsoft.UI.Xaml.Controls;

namespace Microsoft.Maui.Handlers
Expand All @@ -7,27 +7,70 @@ public partial class DatePickerHandler : ViewHandler<IDatePicker, DatePicker>
{
protected override DatePicker CreateNativeView() => new DatePicker();

[MissingMapper]
public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker) { }
protected override void ConnectHandler(DatePicker nativeView)
{
nativeView.DateChanged += OnControlDateChanged;
}

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

public static void MapFormat(DatePickerHandler handler, IDatePicker datePicker)
{
handler.NativeView?.UpdateDate(datePicker);
}

public static void MapDate(DatePickerHandler handler, IDatePicker datePicker)
{
handler.NativeView?.UpdateDate(datePicker);
}

[MissingMapper]
public static void MapMinimumDate(DatePickerHandler handler, IDatePicker datePicker) { }
public static void MapMinimumDate(DatePickerHandler handler, IDatePicker datePicker)
{
handler.NativeView?.UpdateMinimumDate(datePicker);
}

[MissingMapper]
public static void MapMaximumDate(DatePickerHandler handler, IDatePicker datePicker) { }
public static void MapMaximumDate(DatePickerHandler handler, IDatePicker datePicker)
{
handler.NativeView?.UpdateMaximumDate(datePicker);
}

[MissingMapper]
public static void MapCharacterSpacing(DatePickerHandler handler, IDatePicker datePicker) { }
public static void MapCharacterSpacing(DatePickerHandler handler, IDatePicker datePicker)
{
handler.NativeView?.UpdateCharacterSpacing(datePicker);
}

[MissingMapper]
public static void MapFont(DatePickerHandler handler, IDatePicker datePicker) { }
public static void MapFont(DatePickerHandler handler, IDatePicker datePicker)
{
var fontManager = handler.GetRequiredService<IFontManager>();

handler.NativeView?.UpdateFont(datePicker, fontManager);
}

[MissingMapper]
public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicker) { }

void OnControlDateChanged(object? sender, DatePickerValueChangedEventArgs e)
{
if (VirtualView == null)
return;

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

// 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();
}

VirtualView.InvalidateMeasure();
}
}
}
}
21 changes: 21 additions & 0 deletions src/Core/src/Platform/CompareExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;

namespace Microsoft.Maui
{
public static class CompareExtensions
{
public static T Clamp<T>(this T value, T min, T max) where T : IComparable<T>
{
if (max.CompareTo(min) < 0)
return max;

if (value.CompareTo(min) < 0)
return min;

if (value.CompareTo(max) > 0)
return max;

return value;
}
}
}
38 changes: 37 additions & 1 deletion src/Core/src/Platform/Windows/DatePickerExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,49 @@ public static class DatePickerExtensions
public static void UpdateDate(this DatePicker nativeDatePicker, IDatePicker datePicker)
{
var date = datePicker.Date;
nativeDatePicker.Date = new DateTimeOffset(new DateTime(date.Ticks, DateTimeKind.Unspecified));
nativeDatePicker.UpdateDate(date);

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

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

public static void UpdateMinimumDate(this DatePicker 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);
}
}

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

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

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

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

0 comments on commit 5acdd3e

Please sign in to comment.