Skip to content

Commit 17b8b05

Browse files
committed
Change events to have a start date and end date
1 parent 238e4e5 commit 17b8b05

File tree

9 files changed

+96
-36
lines changed

9 files changed

+96
-36
lines changed

XCalendar.Core/Interfaces/IEvent.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public interface IEvent
66
{
77
string Title { get; set; }
88
string Description { get; set; }
9-
DateTime DateTime { get; set; }
9+
DateTime StartDate { get; set; }
10+
DateTime? EndDate { get; set; }
1011
}
1112
}

XCalendar.Core/Models/Calendar.cs

+2-10
Original file line numberDiff line numberDiff line change
@@ -803,15 +803,7 @@ public virtual void UpdateDays(DateTime navigationDate)
803803
}
804804
public virtual void UpdateDayEvents(T day)
805805
{
806-
//It is known that the only thing that the events of the day depend on is the DateTime of the day, and that all events will have the same date.
807-
//So, only update the events if the existing ones' DateTime does not match the day's DateTime.
808-
//If the day has no events, there is no way to tell if it's because the day hasn't been updated before or if there are no events with that date, so update it either way.
809-
if (day.Events.Count > 0 && day.DateTime.Date == day.Events[0].DateTime.Date)
810-
{
811-
return;
812-
}
813-
814-
IEnumerable<TEvent> events = Events.Where(x => x.DateTime.Date == day.DateTime.Date);
806+
IEnumerable<TEvent> events = Events.Where(x => day.DateTime.Date >= x.StartDate && (x.EndDate == null || day.DateTime.Date < x.EndDate));
815807

816808
//No use in replacing the collection if the source and target are both empty.
817809
if (day.Events.Count == 0 && !events.Any())
@@ -820,7 +812,7 @@ public virtual void UpdateDayEvents(T day)
820812
}
821813

822814
//SequenceEqual could be omitted to improve performance but in the vast majority of cases there won't even be more than 5 events in one day, so impact on performance should be negligible
823-
//compared to always changing the collection and updating the binding.
815+
//compared to always changing the collection.
824816
if (day.Events.SequenceEqual(events))
825817
{
826818
return;

XCalendar.Core/Models/Event.cs

+21-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ public class Event : IEvent, INotifyPropertyChanged
1010
#region Fields
1111
private string _title;
1212
private string _description;
13-
private DateTime _dateTime = DateTime.Today;
13+
private DateTime _startDate = DateTime.Today;
14+
private DateTime? _endDate = DateTime.Today;
1415
#endregion
1516

1617
#region Properties
@@ -44,17 +45,32 @@ public string Description
4445
}
4546
}
4647
}
47-
public DateTime DateTime
48+
public DateTime StartDate
4849
{
4950
get
5051
{
51-
return _dateTime;
52+
return _startDate;
5253
}
5354
set
5455
{
55-
if (_dateTime != value)
56+
if (_startDate != value)
5657
{
57-
_dateTime = value;
58+
_startDate = value;
59+
OnPropertyChanged();
60+
}
61+
}
62+
}
63+
public DateTime? EndDate
64+
{
65+
get
66+
{
67+
return _endDate;
68+
}
69+
set
70+
{
71+
if (_endDate != value)
72+
{
73+
_endDate = value;
5874
OnPropertyChanged();
5975
}
6076
}

XCalendarFormsSample/XCalendarFormsSample/ViewModels/EventCalendarExampleViewModel.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,18 @@ public EventCalendarExampleViewModel()
8181

8282
foreach (var @event in events)
8383
{
84-
@event.DateTime = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
84+
@event.StartDate = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
85+
@event.EndDate = @event.StartDate.AddDays(_random.Next(1, 4)).AddHours(_random.Next(17));
86+
87+
if (_random.NextDouble() < 0.025)
88+
{
89+
@event.EndDate = @event.EndDate.Value.AddYears(_random.Next(1, 4));
90+
}
91+
else if (_random.NextDouble() < 0.025)
92+
{
93+
@event.EndDate = null;
94+
}
95+
8596
@event.Color = EventColors[_random.Next(EventColors.Count)];
8697
}
8798

@@ -93,7 +104,7 @@ public EventCalendarExampleViewModel()
93104
#region Methods
94105
private void SelectedDates_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
95106
{
96-
SelectedEvents.ReplaceRange(EventCalendar.Events.Where(x => EventCalendar.SelectedDates.Any(y => x.DateTime.Date == y.Date)).OrderByDescending(x => x.DateTime));
107+
SelectedEvents.ReplaceRange(EventCalendar.Events.Where(x => EventCalendar.SelectedDates.Any(y => y.Date >= x.StartDate && (x.EndDate == null || y.Date < x.EndDate))).OrderByDescending(x => x.StartDate));
97108
}
98109
public void NavigateCalendar(int amount)
99110
{

XCalendarFormsSample/XCalendarFormsSample/ViewModels/PlaygroundViewModel.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ public PlaygroundViewModel()
171171

172172
foreach (var @event in events)
173173
{
174-
@event.DateTime = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
174+
@event.StartDate = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
175+
@event.EndDate = @event.StartDate.AddDays(1);
175176
@event.Color = EventColors[_random.Next(EventColors.Count)];
176177
}
177178

XCalendarFormsSample/XCalendarFormsSample/Views/EventCalendarExamplePage.xaml

+17-5
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@
9595

9696
<xc:DayView.EventTemplate>
9797
<DataTemplate x:DataType="{x:Null}">
98-
<Rectangle
99-
Fill="{Binding Color}"
100-
Style="{StaticResource DefaultEventIndicatorRectangleStyle}"/>
98+
<Rectangle Fill="{Binding Color}" Style="{StaticResource DefaultEventIndicatorRectangleStyle}"/>
10199
</DataTemplate>
102100
</xc:DayView.EventTemplate>
103101

@@ -171,12 +169,26 @@
171169
Padding="10"
172170
BackgroundColor="{StaticResource ContentBackgroundColor}"
173171
Spacing="0">
174-
<Label
172+
<StackLayout Orientation="Horizontal" Spacing="0">
173+
<Label
174+
FontAttributes="Bold"
175+
FontSize="20"
176+
Text="{Binding StartDate, StringFormat='{0:dd MMMM HH:mm}'}"
177+
TextColor="{StaticResource ContentTextColor}"
178+
VerticalTextAlignment="Center"/>
179+
<Label
180+
FontAttributes="Bold"
181+
FontSize="20"
182+
Text=" - "
183+
TextColor="{StaticResource ContentTextColor}"
184+
VerticalTextAlignment="Center"/>
185+
<Label
175186
FontAttributes="Bold"
176187
FontSize="20"
177-
Text="{Binding DateTime, StringFormat='{0: dd MMMM HH:mm}'}"
188+
Text="{Binding EndDate, StringFormat='{0:dd MMMM HH:mm}', TargetNullValue='No End Date'}"
178189
TextColor="{StaticResource ContentTextColor}"
179190
VerticalTextAlignment="Center"/>
191+
</StackLayout>
180192
<Label
181193
Margin="5,0,0,0"
182194
FontSize="16"

XCalendarMauiSample/ViewModels/EventCalendarExampleViewModel.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,18 @@ public EventCalendarExampleViewModel()
7777

7878
foreach (ColoredEvent @event in events)
7979
{
80-
@event.DateTime = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
80+
@event.StartDate = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
81+
@event.EndDate = @event.StartDate.AddDays(_random.Next(1, 4)).AddHours(_random.Next(17));
82+
83+
if (_random.NextDouble() < 0.05)
84+
{
85+
@event.EndDate = @event.EndDate.Value.AddYears(_random.Next(1, 4));
86+
}
87+
else if (_random.NextDouble() < 0.05)
88+
{
89+
@event.EndDate = null;
90+
}
91+
8192
@event.Color = EventColors[_random.Next(EventColors.Count)];
8293
}
8394

@@ -89,7 +100,7 @@ public EventCalendarExampleViewModel()
89100
#region Methods
90101
private void SelectedDates_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
91102
{
92-
SelectedEvents.ReplaceRange(EventCalendar.Events.Where(x => EventCalendar.SelectedDates.Any(y => x.DateTime.Date == y.Date)).OrderByDescending(x => x.DateTime));
103+
SelectedEvents.ReplaceRange(EventCalendar.Events.Where(x => EventCalendar.SelectedDates.Any(y => y.Date >= x.StartDate && (x.EndDate == null || y.Date < x.EndDate))).OrderByDescending(x => x.StartDate));
93104
}
94105
public void NavigateCalendar(int amount)
95106
{

XCalendarMauiSample/ViewModels/PlaygroundViewModel.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ public PlaygroundViewModel()
167167

168168
foreach (var @event in events)
169169
{
170-
@event.DateTime = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
170+
@event.StartDate = DateTime.Today.AddDays(_random.Next(-20, 21)).AddDays(_random.NextDouble());
171+
@event.EndDate = @event.StartDate.AddDays(1);
171172
@event.Color = EventColors[_random.Next(EventColors.Count)];
172173
}
173174

XCalendarMauiSample/Views/EventCalendarExamplePage.xaml

+24-9
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@
9595

9696
<xc:DayView.EventTemplate>
9797
<DataTemplate x:DataType="{x:Null}">
98-
<Rectangle
99-
Fill="{Binding Color}"
100-
Style="{StaticResource DefaultEventIndicatorRectangleStyle}"/>
98+
<Rectangle Fill="{Binding Color}" Style="{StaticResource DefaultEventIndicatorRectangleStyle}"/>
10199
</DataTemplate>
102100
</xc:DayView.EventTemplate>
103101

@@ -174,12 +172,29 @@
174172
Grid.Column="1"
175173
Padding="10"
176174
BackgroundColor="{StaticResource ContentBackgroundColor}">
177-
<Label
178-
FontAttributes="Bold"
179-
FontSize="20"
180-
Text="{Binding DateTime, StringFormat='{0: dd MMMM HH:mm}'}"
181-
TextColor="{StaticResource ContentTextColor}"
182-
VerticalTextAlignment="Center"/>
175+
176+
<HorizontalStackLayout>
177+
<Label
178+
FontAttributes="Bold"
179+
FontSize="20"
180+
Text="{Binding StartDate, StringFormat='{0:dd MMMM HH:mm}'}"
181+
TextColor="{StaticResource ContentTextColor}"
182+
VerticalTextAlignment="Center"/>
183+
<Label
184+
FontAttributes="Bold"
185+
FontSize="20"
186+
Text=" - "
187+
TextColor="{StaticResource ContentTextColor}"
188+
VerticalTextAlignment="Center"/>
189+
<Label
190+
FontAttributes="Bold"
191+
FontSize="20"
192+
Text="{Binding EndDate, StringFormat='{0:dd MMMM HH:mm}', TargetNullValue='No End Date'}"
193+
TextColor="{StaticResource ContentTextColor}"
194+
VerticalTextAlignment="Center"/>
195+
</HorizontalStackLayout>
196+
197+
183198
<Label
184199
Margin="5,0,0,0"
185200
FontSize="16"

0 commit comments

Comments
 (0)