From 63b9ccfe5e2eac124c4a898b38d7479d1fa1a02b Mon Sep 17 00:00:00 2001 From: rabbitism Date: Fri, 26 Apr 2024 20:34:20 +0800 Subject: [PATCH] feat: fix several selection issue related to 12 clock mode. --- demo/Ursa.Demo/Pages/TimePickerDemo.axaml | 7 +- .../Controls/TimePicker.axaml | 15 ++-- .../Controls/DateTimePicker/TimePicker.cs | 76 +++++++++---------- .../DateTimePicker/TimePickerPresenter.cs | 4 +- 4 files changed, 52 insertions(+), 50 deletions(-) diff --git a/demo/Ursa.Demo/Pages/TimePickerDemo.axaml b/demo/Ursa.Demo/Pages/TimePickerDemo.axaml index 7c024c6..7083ac4 100644 --- a/demo/Ursa.Demo/Pages/TimePickerDemo.axaml +++ b/demo/Ursa.Demo/Pages/TimePickerDemo.axaml @@ -6,9 +6,8 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Ursa.Demo.Pages.TimePickerDemo"> - - - - + + + diff --git a/src/Ursa.Themes.Semi/Controls/TimePicker.axaml b/src/Ursa.Themes.Semi/Controls/TimePicker.axaml index f294ab8..d3f2259 100644 --- a/src/Ursa.Themes.Semi/Controls/TimePicker.axaml +++ b/src/Ursa.Themes.Semi/Controls/TimePicker.axaml @@ -152,11 +152,16 @@ Placement="BottomEdgeAlignedLeft" PlacementTarget="Background"> - + + + + + + diff --git a/src/Ursa/Controls/DateTimePicker/TimePicker.cs b/src/Ursa/Controls/DateTimePicker/TimePicker.cs index 83632a4..9232c87 100644 --- a/src/Ursa/Controls/DateTimePicker/TimePicker.cs +++ b/src/Ursa/Controls/DateTimePicker/TimePicker.cs @@ -11,23 +11,18 @@ using Irihi.Avalonia.Shared.Helpers; namespace Ursa.Controls; -[TemplatePart( PART_TextBox, typeof(TextBox))] -[TemplatePart( PART_Popup, typeof(Popup))] -[TemplatePart( PART_Presenter, typeof(TimePickerPresenter))] +[TemplatePart(PART_TextBox, typeof(TextBox))] +[TemplatePart(PART_Popup, typeof(Popup))] +[TemplatePart(PART_Presenter, typeof(TimePickerPresenter))] public class TimePicker : TemplatedControl, IClearControl, IInnerContentControl, IPopupInnerContent { public const string PART_TextBox = "PART_TextBox"; public const string PART_Popup = "PART_Popup"; public const string PART_Presenter = "PART_Presenter"; - - private TextBox? _textBox; - private Popup? _popup; - private TimePickerPresenter? _presenter; - private bool _updateFromPresenter; - - public static readonly StyledProperty DisplayFormatProperty = AvaloniaProperty.Register( - nameof(DisplayFormat), "HH:mm:ss"); + public static readonly StyledProperty DisplayFormatProperty = + AvaloniaProperty.Register( + nameof(DisplayFormat), "HH:mm:ss"); public static readonly StyledProperty PanelFormatProperty = AvaloniaProperty.Register( nameof(PanelFormat), "HH mm ss"); @@ -62,6 +57,19 @@ public class TimePicker : TemplatedControl, IClearControl, IInnerContentControl, public static readonly StyledProperty IsDropdownOpenProperty = AvaloniaProperty.Register( nameof(IsDropdownOpen), defaultBindingMode: BindingMode.TwoWay); + private Popup? _popup; + private TimePickerPresenter? _presenter; + + private TextBox? _textBox; + + private bool _updateFromText; + + static TimePicker() + { + SelectedTimeProperty.Changed.AddClassHandler((picker, args) => + picker.OnSelectionChanged(args)); + } + public bool IsDropdownOpen { get => GetValue(IsDropdownOpenProperty); @@ -74,16 +82,6 @@ public class TimePicker : TemplatedControl, IClearControl, IInnerContentControl, set => SetValue(WatermarkProperty, value); } - private TimeSpan? _selectedTimeHolder; - - static TimePicker() - { - PanelFormatProperty.Changed.AddClassHandler((picker, args) => - picker.OnPanelFormatChanged(args)); - SelectedTimeProperty.Changed.AddClassHandler((picker, args) => - picker.OnSelectionChanged(args)); - } - public string? DisplayFormat { get => GetValue(DisplayFormatProperty); @@ -137,23 +135,18 @@ public class TimePicker : TemplatedControl, IClearControl, IInnerContentControl, set => SetValue(PopupInnerBottomContentProperty, value); } - private void OnPanelFormatChanged(AvaloniaPropertyChangedEventArgs args) - { - var format = args.NewValue.Value; - var parts = format.Split(' ', '-', ':'); - } - protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); - + _textBox = e.NameScope.Find(PART_TextBox); _popup = e.NameScope.Find(PART_Popup); _presenter = e.NameScope.Find(PART_Presenter); - TextBox.GotFocusEvent.AddHandler(OnTextBoxGetFocus, _textBox); + GotFocusEvent.AddHandler(OnTextBoxGetFocus, _textBox); TextBox.TextChangedEvent.AddDisposableHandler(OnTextChanged, _textBox); - TextBox.PointerPressedEvent.AddHandler(OnTextBoxPointerPressed, RoutingStrategies.Tunnel, false, _textBox); + PointerPressedEvent.AddHandler(OnTextBoxPointerPressed, RoutingStrategies.Tunnel, false, _textBox); + SetCurrentValue(SelectedTimeProperty, DateTime.Now.TimeOfDay); } private void OnTextBoxPointerPressed(object sender, PointerPressedEventArgs e) @@ -169,35 +162,38 @@ public class TimePicker : TemplatedControl, IClearControl, IInnerContentControl, private void OnTextChanged(object sender, TextChangedEventArgs e) { + _updateFromText = true; if (DisplayFormat is null || DisplayFormat.Length == 0) { if (TimeSpan.TryParse(_textBox?.Text, out var defaultTime)) - { TimePickerPresenter.TimeProperty.SetValue(defaultTime, _presenter); - } } else { - if(DateTime.TryParseExact(_textBox?.Text, DisplayFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out var time)) - { - TimePickerPresenter.TimeProperty.SetValue(time.TimeOfDay, _presenter); - } + if (DateTime.TryParseExact(_textBox?.Text, DisplayFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, + out var time)) TimePickerPresenter.TimeProperty.SetValue(time.TimeOfDay, _presenter); } + _updateFromText = false; } private void OnSelectionChanged(AvaloniaPropertyChangedEventArgs args) { if (_textBox is null) return; var time = args.NewValue.Value; - var text = new DateTime(1,1,1, time?.Hours ?? 0, time?.Minutes ?? 0, time?.Seconds ?? 0).ToString(DisplayFormat); + DateTime date = new DateTime(1, 1, 1, time?.Hours ?? 0, time?.Minutes ?? 0, time?.Seconds ?? 0); + var text = date.ToString(DisplayFormat); _textBox.Text = text; } public void Confirm() { - if (NeedConfirmation) - // TODO: close popup. - SetCurrentValue(SelectedTimeProperty, _selectedTimeHolder); + _presenter?.Confirm(); + SetCurrentValue(IsDropdownOpenProperty, false); + } + + public void Dismiss() + { + SetCurrentValue(IsDropdownOpenProperty, false); } protected override void UpdateDataValidation(AvaloniaProperty property, BindingValueType state, Exception? error) diff --git a/src/Ursa/Controls/DateTimePicker/TimePickerPresenter.cs b/src/Ursa/Controls/DateTimePicker/TimePickerPresenter.cs index c93930a..5a97bac 100644 --- a/src/Ursa/Controls/DateTimePicker/TimePickerPresenter.cs +++ b/src/Ursa/Controls/DateTimePicker/TimePickerPresenter.cs @@ -266,7 +266,9 @@ public class TimePickerPresenter: TemplatedControl var time = Time ?? DateTime.Now.TimeOfDay; if (_hourSelector is not null) { - _hourSelector.SelectedValue = _use12Clock ? time.Hours % 12 : time.Hours; + var index = _use12Clock ? time.Hours % 12 : time.Hours; + if (index == 0) index = 12; + _hourSelector.SelectedValue = index; } if (_minuteSelector is not null) {