feat: disable ampm selector when not in 12 clock mode.
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user