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

Implement more WinUI DatePickerHandler properties #859

Merged
merged 6 commits into from
May 26, 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
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));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this handle the Format ?

}

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
4 changes: 2 additions & 2 deletions src/Core/src/Platform/Windows/TextBoxExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ public static void UpdateFont(this MauiTextBox nativeControl, Font font, IFontMa
{
nativeControl.FontSize = fontManager.GetFontSize(font);
nativeControl.FontFamily = fontManager.GetFontFamily(font);
nativeControl.FontStyle = font.FontAttributes.ToFontStyle();
nativeControl.FontWeight = font.FontAttributes.ToFontWeight();
nativeControl.FontStyle = font.ToFontStyle();
nativeControl.FontWeight = font.ToFontWeight();
}

public static void UpdateIsReadOnly(this MauiTextBox textBox, IEditor editor)
Expand Down