feat: disable ampm selector when not in 12 clock mode.

This commit is contained in:
rabbitism
2024-04-26 18:12:16 +08:00
parent 41b530b7bf
commit 32ad93de60
2 changed files with 75 additions and 4 deletions

View File

@@ -6,6 +6,7 @@
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Ursa.Demo.Pages.TimePickerDemo"> x:Class="Ursa.Demo.Pages.TimePickerDemo">
<StackPanel HorizontalAlignment="Left"> <StackPanel HorizontalAlignment="Left">
<u:TimePickerPresenter HorizontalAlignment="Left" VerticalAlignment="Top"/> <u:TimePickerPresenter Name="presenter" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBlock Text="{Binding #presenter.Time}"/>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

View File

@@ -48,6 +48,8 @@ public class TimePickerPresenter: TemplatedControl
private Control? _secondSeparator; private Control? _secondSeparator;
private Control? _thirdSeparator; private Control? _thirdSeparator;
private bool _use12Clock; private bool _use12Clock;
private bool _updateFromTimeChange;
internal TimeSpan _timeHolder;
public static readonly StyledProperty<bool> NeedsConfirmationProperty = AvaloniaProperty.Register<TimePickerPresenter, bool>( public static readonly StyledProperty<bool> NeedsConfirmationProperty = AvaloniaProperty.Register<TimePickerPresenter, bool>(
@@ -78,7 +80,7 @@ public class TimePickerPresenter: TemplatedControl
} }
public static readonly StyledProperty<string> PanelFormatProperty = AvaloniaProperty.Register<TimePickerPresenter, string>( public static readonly StyledProperty<string> PanelFormatProperty = AvaloniaProperty.Register<TimePickerPresenter, string>(
nameof(PanelFormat), defaultValue: "hh mm ss t"); nameof(PanelFormat), defaultValue: "HH mm ss t");
public string PanelFormat public string PanelFormat
{ {
@@ -89,6 +91,14 @@ public class TimePickerPresenter: TemplatedControl
static TimePickerPresenter() static TimePickerPresenter()
{ {
PanelFormatProperty.Changed.AddClassHandler<TimePickerPresenter, string>((presenter, args) => presenter.OnPanelFormatChanged(args)); PanelFormatProperty.Changed.AddClassHandler<TimePickerPresenter, string>((presenter, args) => presenter.OnPanelFormatChanged(args));
TimeProperty.Changed.AddClassHandler<TimePickerPresenter, TimeSpan?>((presenter, args) => presenter.OnTimeChanged(args));
}
private void OnTimeChanged(AvaloniaPropertyChangedEventArgs<TimeSpan?> args)
{
_updateFromTimeChange = true;
UpdatePanelsFromSelectedTime();
_updateFromTimeChange = false;
} }
private void OnPanelFormatChanged(AvaloniaPropertyChangedEventArgs<string> args) private void OnPanelFormatChanged(AvaloniaPropertyChangedEventArgs<string> args)
@@ -160,10 +170,42 @@ public class TimePickerPresenter: TemplatedControl
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
base.OnApplyTemplate(e); base.OnApplyTemplate(e);
if (_hourSelector is not null)
{
_hourSelector.SelectionChanged -= OnPanelSelectionChanged;
}
if (_minuteSelector is not null)
{
_minuteSelector.SelectionChanged -= OnPanelSelectionChanged;
}
if (_secondSelector is not null)
{
_secondSelector.SelectionChanged -= OnPanelSelectionChanged;
}
if (_ampmSelector is not null)
{
_ampmSelector.SelectionChanged -= OnPanelSelectionChanged;
}
_hourSelector = e.NameScope.Find<DateTimePickerPanel>(PART_HourSelector); _hourSelector = e.NameScope.Find<DateTimePickerPanel>(PART_HourSelector);
_minuteSelector = e.NameScope.Find<DateTimePickerPanel>(PART_MinuteSelector); _minuteSelector = e.NameScope.Find<DateTimePickerPanel>(PART_MinuteSelector);
_secondSelector = e.NameScope.Find<DateTimePickerPanel>(PART_SecondSelector); _secondSelector = e.NameScope.Find<DateTimePickerPanel>(PART_SecondSelector);
_ampmSelector = e.NameScope.Find<DateTimePickerPanel>(PART_AmPmSelector); _ampmSelector = e.NameScope.Find<DateTimePickerPanel>(PART_AmPmSelector);
if(_hourSelector is not null)
{
_hourSelector.SelectionChanged += OnPanelSelectionChanged;
}
if(_minuteSelector is not null)
{
_minuteSelector.SelectionChanged += OnPanelSelectionChanged;
}
if(_secondSelector is not null)
{
_secondSelector.SelectionChanged += OnPanelSelectionChanged;
}
if(_ampmSelector is not null)
{
_ampmSelector.SelectionChanged += OnPanelSelectionChanged;
}
_pickerContainer = e.NameScope.Find<Grid>(PART_PickerContainer); _pickerContainer = e.NameScope.Find<Grid>(PART_PickerContainer);
_hourScrollPanel = e.NameScope.Find<Control>(PART_HourScrollPanel); _hourScrollPanel = e.NameScope.Find<Control>(PART_HourScrollPanel);
_minuteScrollPanel = e.NameScope.Find<Control>(PART_MinuteScrollPanel); _minuteScrollPanel = e.NameScope.Find<Control>(PART_MinuteScrollPanel);
@@ -177,6 +219,34 @@ public class TimePickerPresenter: TemplatedControl
UpdatePanelsFromSelectedTime(); UpdatePanelsFromSelectedTime();
} }
private void OnPanelSelectionChanged(object sender, System.EventArgs e)
{
if (_updateFromTimeChange) return;
TimeSpan time = NeedsConfirmation ? _timeHolder : Time ?? DateTime.Now.TimeOfDay;
int hour = _hourSelector?.SelectedValue ?? time.Hours;
int minute = _minuteSelector?.SelectedValue ?? time.Minutes;
int second = _secondSelector?.SelectedValue ?? time.Seconds;
int ampm = _ampmSelector?.SelectedValue ?? (time.Hours >= 12 ? 1 : 0);
if (_use12Clock)
{
hour = ampm switch
{
0 when hour == 12 => 0,
1 when hour < 12 => hour + 12,
_ => hour
};
}
var newTime = new TimeSpan(hour, minute, second);
if (NeedsConfirmation)
{
_timeHolder = newTime;
}
else
{
SetCurrentValue(TimeProperty, newTime);
}
}
private void UpdatePanelsFromSelectedTime() private void UpdatePanelsFromSelectedTime()
{ {
if (Time is null) return; if (Time is null) return;
@@ -200,6 +270,7 @@ public class TimePickerPresenter: TemplatedControl
>= 12 => 1, >= 12 => 1,
_ => 0 _ => 0
}; };
_ampmSelector.IsEnabled = _use12Clock;
} }
} }
@@ -208,7 +279,7 @@ public class TimePickerPresenter: TemplatedControl
if (_pickerContainer is null) return; if (_pickerContainer is null) return;
if (_hourSelector is not null) if (_hourSelector is not null)
{ {
_hourSelector.ItemFormat = "%h"; _hourSelector.ItemFormat = "hh";
_hourSelector.MaximumValue = _use12Clock ? 12 : 23; _hourSelector.MaximumValue = _use12Clock ? 12 : 23;
_hourSelector.MinimumValue = _use12Clock ? 1 : 0; _hourSelector.MinimumValue = _use12Clock ? 1 : 0;
@@ -232,7 +303,6 @@ public class TimePickerPresenter: TemplatedControl
_ampmSelector.ItemFormat = "t"; _ampmSelector.ItemFormat = "t";
_ampmSelector.MaximumValue = 1; _ampmSelector.MaximumValue = 1;
_ampmSelector.MinimumValue = 0; _ampmSelector.MinimumValue = 0;
} }
} }
} }