feat: move state out of calendar display.

This commit is contained in:
rabbitism
2024-06-18 00:45:03 +08:00
parent f75460a386
commit 0515d8f712
3 changed files with 15 additions and 94 deletions

View File

@@ -31,11 +31,13 @@ public class CalendarDisplayControl: TemplatedControl
private CalendarMonthView? _monthView;
private CalendarYearView? _yearView;
private DatePickerState _state = DatePickerState.None;
private Button? _yearButton;
private Button? _monthButton;
private Button? _headerButton;
public event EventHandler<CalendarDayButtonEventArgs>? OnDateSelected;
public event EventHandler<CalendarDayButtonEventArgs>? OnDatePreviewed;
public static readonly StyledProperty<DateTime> SelectedDateProperty = AvaloniaProperty.Register<CalendarDisplayControl, DateTime>(nameof(SelectedDate), DateTime.Now);
public DateTime SelectedDate
@@ -164,53 +166,15 @@ public class CalendarDisplayControl: TemplatedControl
_yearView?.ContextDate.Year + "-" + (_yearView?.ContextDate.Year + 10));
_yearView?.UpdateMode(CalendarYearViewMode.Year);
SetCurrentValue(IsMonthModeProperty, false);
}
private void OnDatePreviewed(object sender, CalendarDayButtonEventArgs e)
private void OnMonthViewDatePreviewed(object sender, CalendarDayButtonEventArgs e)
{
if(_monthView is null)
{
return;
}
var date = e.Date;
if (_state is DatePickerState.None) return;
if (_state == DatePickerState.PreviewStart)
{
_monthView.MarkPreview(date, EndDate);
}
else if (_state == DatePickerState.PreviewEnd)
{
_monthView.MarkPreview(StartDate, date);
}
OnDatePreviewed?.Invoke(sender, e);
}
private void OnDateSelected(object sender, CalendarDayButtonEventArgs e)
private void OnMonthViewDateSelected(object sender, CalendarDayButtonEventArgs e)
{
if(_monthView is null)
{
return;
}
var date = e.Date;
if (_state == DatePickerState.None)
{
_monthView.ClearSelection();
_monthView.ClearPreview();
_monthView.MarkSelection(date, null);
_state = DatePickerState.PreviewEnd;
StartDate = date;
}
else if (_state == DatePickerState.PreviewStart)
{
_monthView.MarkSelection(date, EndDate);
_state = DatePickerState.SelectStart;
StartDate = date;
}
else if (_state == DatePickerState.PreviewEnd)
{
_monthView.MarkSelection(StartDate, date);
_state = DatePickerState.None;
EndDate = date;
}
OnDateSelected?.Invoke(sender, e);
}
}

View File

@@ -179,43 +179,6 @@ public class CalendarMonthView : TemplatedControl
if (d == startDate && d == endDate) button.IsSelected = true;
}
}
[Obsolete]
public void MarkSelection(DateTime? start, DateTime? end)
{
if (_grid?.Children is null) return;
foreach (var child in _grid.Children)
if (child is CalendarDayButton { DataContext: DateTime d } button)
{
if (d.Month != _contextDate.Month) continue;
if (d == start)
{
button.IsStartDate = true;
button.IsPreviewStartDate = false;
button.IsEndDate = false;
button.IsInRange = false;
}
else if (d == end)
{
button.IsEndDate = true;
button.IsPreviewEndDate = false;
button.IsStartDate = false;
button.IsInRange = false;
}
else if (d > start && d < end)
{
button.IsInRange = true;
button.IsStartDate = false;
button.IsEndDate = false;
}
else
{
button.IsStartDate = false;
button.IsEndDate = false;
button.IsInRange = false;
}
}
}
public void MarkPreview(DateTime? start, DateTime? end)
{
@@ -273,18 +236,4 @@ public class CalendarMonthView : TemplatedControl
button.IsInRange = false;
}
}
public void MarkSelection(DateTime date)
{
if (_grid?.Children is null) return;
foreach (var child in _grid.Children)
{
if (child is not CalendarDayButton { DataContext: DateTime d } button) continue;
button.IsStartDate = false;
button.IsEndDate = false;
button.IsInRange = false;
if (d.Month != _contextDate.Month) continue;
button.IsSelected = d == date;
}
}
}

View File

@@ -0,0 +1,8 @@
using Avalonia.Controls.Primitives;
namespace Ursa.Controls;
public class DateRangePicker : TemplatedControl
{
}