Calendar rendering implementation.

This commit is contained in:
Burak Kaan Köse
2026-03-23 14:56:36 +01:00
parent 8586d0ef54
commit 1adba271e2
32 changed files with 11146 additions and 846 deletions
@@ -1,26 +0,0 @@
using System;
using Itenso.TimePeriod;
using Wino.Core.Domain.Collections;
namespace Wino.Core.Domain.Models.Calendar;
/// <summary>
/// Represents a day in the calendar.
/// Can hold events, appointments, wheather status etc.
/// </summary>
public class CalendarDayModel
{
public ITimePeriod Period { get; }
public CalendarEventCollection EventsCollection { get; }
public CalendarDayModel(DateTime representingDate, CalendarRenderOptions calendarRenderOptions)
{
RepresentingDate = representingDate;
Period = new TimeRange(representingDate, representingDate.AddDays(1));
CalendarRenderOptions = calendarRenderOptions;
EventsCollection = new CalendarEventCollection(Period, calendarRenderOptions.CalendarSettings);
}
public DateTime RepresentingDate { get; }
public CalendarRenderOptions CalendarRenderOptions { get; }
}
@@ -1,13 +0,0 @@
namespace Wino.Core.Domain.Models.Calendar;
public class CalendarRenderOptions
{
public CalendarRenderOptions(DateRange dateRange, CalendarSettings calendarSettings)
{
DateRange = dateRange;
CalendarSettings = calendarSettings;
}
public int TotalDayCount => DateRange.TotalDays;
public DateRange DateRange { get; }
public CalendarSettings CalendarSettings { get; }
}
@@ -13,7 +13,8 @@ public record CalendarSettings(DayOfWeek FirstDayOfWeek,
TimeSpan WorkingHourEnd,
double HourHeight,
DayHeaderDisplayType DayHeaderDisplayType,
CultureInfo CultureInfo)
CultureInfo CultureInfo,
string TimedDayHeaderDateFormat = "ddd dd")
{
public int WorkWeekDayCount
{
@@ -65,4 +66,35 @@ public record CalendarSettings(DayOfWeek FirstDayOfWeek,
var dateTime = DateTime.Today.Add(timeSpan);
return dateTime.ToString(format, CultureInfo.InvariantCulture);
}
public string GetTimedDayHeaderText(DateOnly date)
{
var format = string.IsNullOrWhiteSpace(TimedDayHeaderDateFormat) ? "ddd dd" : TimedDayHeaderDateFormat;
try
{
return date.ToDateTime(TimeOnly.MinValue).ToString(format, CultureInfo);
}
catch (FormatException)
{
return date.ToDateTime(TimeOnly.MinValue).ToString("ddd dd", CultureInfo);
}
}
public string GetTimedHourLabelText(int hour)
{
if (hour < 0 || hour > 24)
{
throw new ArgumentOutOfRangeException(nameof(hour));
}
if (DayHeaderDisplayType == DayHeaderDisplayType.TwentyFourHour)
{
return hour.ToString(CultureInfo);
}
var displayHour = hour % 24;
var dateTime = DateTime.Today.AddHours(displayHour);
return dateTime.ToString("h tt", CultureInfo);
}
}
@@ -1,13 +0,0 @@
namespace Wino.Core.Domain.Models.Calendar;
public class DayHeaderRenderModel
{
public DayHeaderRenderModel(string dayHeader, double hourHeight)
{
DayHeader = dayHeader;
HourHeight = hourHeight;
}
public string DayHeader { get; }
public double HourHeight { get; }
}
@@ -1,53 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using Itenso.TimePeriod;
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Calendar;
/// <summary>
/// Represents a range of days in the calendar.
/// Corresponds to 1 view of the FlipView in CalendarPage.
/// </summary>
public class DayRangeRenderModel
{
public ITimePeriod Period { get; }
public List<CalendarDayModel> CalendarDays { get; } = [];
// TODO: Get rid of this at some point.
public List<DayHeaderRenderModel> DayHeaders { get; } = [];
public CalendarRenderOptions CalendarRenderOptions { get; }
public int TotalDays => CalendarRenderOptions.TotalDayCount;
public DayRangeRenderModel(CalendarRenderOptions calendarRenderOptions)
{
CalendarRenderOptions = calendarRenderOptions;
for (var i = 0; i < CalendarRenderOptions.TotalDayCount; i++)
{
var representingDate = calendarRenderOptions.DateRange.StartDate.AddDays(i);
var calendarDayModel = new CalendarDayModel(representingDate, calendarRenderOptions);
CalendarDays.Add(calendarDayModel);
}
Period = new TimeRange(CalendarDays.First().RepresentingDate, CalendarDays.Last().RepresentingDate.AddDays(1));
// Create day headers based on culture info.
for (var i = 0; i < 24; i++)
{
var representingDate = calendarRenderOptions.DateRange.StartDate.Date.AddHours(i);
string dayHeader = calendarRenderOptions.CalendarSettings.DayHeaderDisplayType switch
{
DayHeaderDisplayType.TwelveHour => representingDate.ToString("h tt", calendarRenderOptions.CalendarSettings.CultureInfo),
DayHeaderDisplayType.TwentyFourHour => representingDate.ToString("HH", calendarRenderOptions.CalendarSettings.CultureInfo),
_ => "N/A"
};
DayHeaders.Add(new DayHeaderRenderModel(dayHeader, calendarRenderOptions.CalendarSettings.HourHeight));
}
}
}