feat: move state out of calendar display.
This commit is contained in:
@@ -31,11 +31,13 @@ public class CalendarDisplayControl: TemplatedControl
|
|||||||
|
|
||||||
private CalendarMonthView? _monthView;
|
private CalendarMonthView? _monthView;
|
||||||
private CalendarYearView? _yearView;
|
private CalendarYearView? _yearView;
|
||||||
private DatePickerState _state = DatePickerState.None;
|
|
||||||
private Button? _yearButton;
|
private Button? _yearButton;
|
||||||
private Button? _monthButton;
|
private Button? _monthButton;
|
||||||
private Button? _headerButton;
|
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 static readonly StyledProperty<DateTime> SelectedDateProperty = AvaloniaProperty.Register<CalendarDisplayControl, DateTime>(nameof(SelectedDate), DateTime.Now);
|
||||||
public DateTime SelectedDate
|
public DateTime SelectedDate
|
||||||
@@ -164,53 +166,15 @@ public class CalendarDisplayControl: TemplatedControl
|
|||||||
_yearView?.ContextDate.Year + "-" + (_yearView?.ContextDate.Year + 10));
|
_yearView?.ContextDate.Year + "-" + (_yearView?.ContextDate.Year + 10));
|
||||||
_yearView?.UpdateMode(CalendarYearViewMode.Year);
|
_yearView?.UpdateMode(CalendarYearViewMode.Year);
|
||||||
SetCurrentValue(IsMonthModeProperty, false);
|
SetCurrentValue(IsMonthModeProperty, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDatePreviewed(object sender, CalendarDayButtonEventArgs e)
|
private void OnMonthViewDatePreviewed(object sender, CalendarDayButtonEventArgs e)
|
||||||
{
|
{
|
||||||
if(_monthView is null)
|
OnDatePreviewed?.Invoke(sender, e);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDateSelected(object sender, CalendarDayButtonEventArgs e)
|
private void OnMonthViewDateSelected(object sender, CalendarDayButtonEventArgs e)
|
||||||
{
|
{
|
||||||
if(_monthView is null)
|
OnDateSelected?.Invoke(sender, e);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,43 +180,6 @@ public class CalendarMonthView : TemplatedControl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[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)
|
public void MarkPreview(DateTime? start, DateTime? end)
|
||||||
{
|
{
|
||||||
if (_grid?.Children is null) return;
|
if (_grid?.Children is null) return;
|
||||||
@@ -273,18 +236,4 @@ public class CalendarMonthView : TemplatedControl
|
|||||||
button.IsInRange = false;
|
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