feat: move state out of calendar display.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
8
src/Ursa/Controls/DateTimePicker/DateRangePicker.cs
Normal file
8
src/Ursa/Controls/DateTimePicker/DateRangePicker.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using Avalonia.Controls.Primitives;
|
||||
|
||||
namespace Ursa.Controls;
|
||||
|
||||
public class DateRangePicker : TemplatedControl
|
||||
{
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user