From e18efdb1e22697cefdc9476bc8a9ef5889361b94 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sat, 11 May 2024 22:28:30 +0800 Subject: [PATCH] feat: invoke events and mark selection. --- .../CalendarDayButtonEventArgs.cs | 8 +++ .../DateTimePicker/CalendarMonthView.cs | 51 +++++++++++++------ 2 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 src/Ursa/Controls/DateTimePicker/CalendarDayButtonEventArgs.cs diff --git a/src/Ursa/Controls/DateTimePicker/CalendarDayButtonEventArgs.cs b/src/Ursa/Controls/DateTimePicker/CalendarDayButtonEventArgs.cs new file mode 100644 index 0000000..a65a97b --- /dev/null +++ b/src/Ursa/Controls/DateTimePicker/CalendarDayButtonEventArgs.cs @@ -0,0 +1,8 @@ +using Avalonia.Interactivity; + +namespace Ursa.Controls; + +public class CalendarDayButtonEventArgs(DateTime date) : RoutedEventArgs +{ + public DateTime Date { get; private set; } = date; +} \ No newline at end of file diff --git a/src/Ursa/Controls/DateTimePicker/CalendarMonthView.cs b/src/Ursa/Controls/DateTimePicker/CalendarMonthView.cs index 2c90f14..aa9d07c 100644 --- a/src/Ursa/Controls/DateTimePicker/CalendarMonthView.cs +++ b/src/Ursa/Controls/DateTimePicker/CalendarMonthView.cs @@ -89,7 +89,6 @@ public class CalendarMonthView: TemplatedControl cell.SetValue(Grid.RowProperty, i); cell.SetValue(Grid.ColumnProperty, j); cell.PointerPressed += OnDayButtonPressed; - cell.PointerReleased += OnDayButtonReleased; cell.PointerEntered += OnDayButtonPointerEnter; children.Add(cell); } @@ -120,25 +119,17 @@ public class CalendarMonthView: TemplatedControl private void OnDayButtonPressed(object sender, PointerPressedEventArgs e) { - if (sender is CalendarDayButton button) + if (sender is CalendarDayButton { DataContext: DateTime d }) { - // button.IsSelected = true; - } - } - - private void OnDayButtonReleased(object sender, PointerReleasedEventArgs e) - { - if (sender is CalendarDayButton button) - { - // button.IsSelected = false; + OnCalendarDayButtonPressed?.Invoke(this, new CalendarDayButtonEventArgs(d)); } } private void OnDayButtonPointerEnter(object sender, PointerEventArgs e) { - if(sender is CalendarDayButton button) + if(sender is CalendarDayButton {DataContext: DateTime d}) { - // button.IsPreviewStartDate = true; + OnCalendarDayButtonPointerEnter?.Invoke(this, new CalendarDayButtonEventArgs(d)); } } @@ -151,17 +142,47 @@ public class CalendarMonthView: TemplatedControl return i == 0 ? DateTimeHelper.NumberOfDaysPerWeek : i; } + /// + /// Make days out of current month fade out. These buttons are not disabled. They are just visually faded out. + /// private void FadeOutDayButtons() { if (_grid is null) return; var children = _grid.Children; for (var i = 8; i < children.Count; i++) { - if (children[i] is CalendarDayButton button && button.DataContext is DateTime d && d.Month != _contextDate.Month) + if (children[i] is CalendarDayButton { DataContext: DateTime d } button && d.Month != _contextDate.Month) { button.IsNotCurrentMonth = true; } } } - + + + public event EventHandler? OnCalendarDayButtonPressed; + public event EventHandler? OnCalendarDayButtonPointerEnter; + + 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 == start) + { + button.IsStartDate = true; + } + else if (d == end) + { + button.IsEndDate = true; + } + else if (d > start && d < end) + { + button.IsInRange = true; + } + } + } + } + } \ No newline at end of file