From 59bcb9244e41cf9c2d3f24a18139bd704e0e4cf6 Mon Sep 17 00:00:00 2001 From: logikonline Date: Fri, 16 Jan 2026 05:36:36 +0000 Subject: [PATCH] TimePicker completed --- Handlers/TimePickerHandler.cs | 22 ++++++++++++- Views/SkiaTimePicker.cs | 58 ++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/Handlers/TimePickerHandler.cs b/Handlers/TimePickerHandler.cs index 27bef58..3d55410 100644 --- a/Handlers/TimePickerHandler.cs +++ b/Handlers/TimePickerHandler.cs @@ -21,6 +21,7 @@ public partial class TimePickerHandler : ViewHandler 0) + handler.PlatformView.FontSize = font.Size; + + if (!string.IsNullOrEmpty(font.Family)) + handler.PlatformView.FontFamily = font.Family; + + // Map FontAttributes from the Font weight/slant + var attrs = FontAttributes.None; + if (font.Weight >= FontWeight.Bold) + attrs |= FontAttributes.Bold; + handler.PlatformView.FontAttributes = attrs; } public static void MapBackground(TimePickerHandler handler, ITimePicker timePicker) diff --git a/Views/SkiaTimePicker.cs b/Views/SkiaTimePicker.cs index b405c07..0344fe0 100644 --- a/Views/SkiaTimePicker.cs +++ b/Views/SkiaTimePicker.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Microsoft.Maui.Controls; using Microsoft.Maui.Graphics; using Microsoft.Maui.Platform.Linux; using SkiaSharp; @@ -62,10 +63,22 @@ public class SkiaTimePicker : SkiaView BindableProperty.Create(nameof(HeaderColor), typeof(Color), typeof(SkiaTimePicker), Color.FromRgb(33, 150, 243), BindingMode.TwoWay, propertyChanged: (b, o, n) => ((SkiaTimePicker)b).Invalidate()); + public static readonly BindableProperty FontFamilyProperty = + BindableProperty.Create(nameof(FontFamily), typeof(string), typeof(SkiaTimePicker), string.Empty, BindingMode.TwoWay, + propertyChanged: (b, o, n) => ((SkiaTimePicker)b).Invalidate()); + public static readonly BindableProperty FontSizeProperty = BindableProperty.Create(nameof(FontSize), typeof(double), typeof(SkiaTimePicker), 14.0, BindingMode.TwoWay, propertyChanged: (b, o, n) => ((SkiaTimePicker)b).InvalidateMeasure()); + public static readonly BindableProperty FontAttributesProperty = + BindableProperty.Create(nameof(FontAttributes), typeof(FontAttributes), typeof(SkiaTimePicker), FontAttributes.None, BindingMode.TwoWay, + propertyChanged: (b, o, n) => ((SkiaTimePicker)b).Invalidate()); + + public static readonly BindableProperty CharacterSpacingProperty = + BindableProperty.Create(nameof(CharacterSpacing), typeof(double), typeof(SkiaTimePicker), 0.0, BindingMode.TwoWay, + propertyChanged: (b, o, n) => ((SkiaTimePicker)b).Invalidate()); + public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CornerRadius), typeof(double), typeof(SkiaTimePicker), 4.0, BindingMode.TwoWay, propertyChanged: (b, o, n) => ((SkiaTimePicker)b).Invalidate()); @@ -122,12 +135,30 @@ public class SkiaTimePicker : SkiaView set => SetValue(HeaderColorProperty, value); } + public string FontFamily + { + get => (string)GetValue(FontFamilyProperty); + set => SetValue(FontFamilyProperty, value); + } + public double FontSize { get => (double)GetValue(FontSizeProperty); set => SetValue(FontSizeProperty, value); } + public FontAttributes FontAttributes + { + get => (FontAttributes)GetValue(FontAttributesProperty); + set => SetValue(FontAttributesProperty, value); + } + + public double CharacterSpacing + { + get => (double)GetValue(CharacterSpacingProperty); + set => SetValue(CharacterSpacingProperty, value); + } + public double CornerRadius { get => (double)GetValue(CornerRadiusProperty); @@ -282,7 +313,32 @@ public class SkiaTimePicker : SkiaView }; canvas.DrawRoundRect(new SKRoundRect(bounds, cornerRadius), borderPaint); - using var font = new SKFont(SKTypeface.Default, fontSize); + // Get typeface based on FontFamily and FontAttributes + SKTypeface typeface = SKTypeface.Default; + if (!string.IsNullOrEmpty(FontFamily)) + { + var style = FontAttributes switch + { + FontAttributes.Bold => SKFontStyle.Bold, + FontAttributes.Italic => SKFontStyle.Italic, + FontAttributes.Bold | FontAttributes.Italic => SKFontStyle.BoldItalic, + _ => SKFontStyle.Normal + }; + typeface = SKTypeface.FromFamilyName(FontFamily, style) ?? SKTypeface.Default; + } + else if (FontAttributes != FontAttributes.None) + { + var style = FontAttributes switch + { + FontAttributes.Bold => SKFontStyle.Bold, + FontAttributes.Italic => SKFontStyle.Italic, + FontAttributes.Bold | FontAttributes.Italic => SKFontStyle.BoldItalic, + _ => SKFontStyle.Normal + }; + typeface = SKTypeface.FromFamilyName(null, style) ?? SKTypeface.Default; + } + + using var font = new SKFont(typeface, fontSize); using var textPaint = new SKPaint(font) { Color = IsEnabled ? textColor : textColor.WithAlpha(128),