Skip to content

Commit

Permalink
imp - Improved support for non-Sunday weeks
Browse files Browse the repository at this point in the history
---

We've improved support for calendars that declare any other day as the starting week. Demonstrate this by using the Dutch culture (You may have to set the language to Dutch (Netherlands) first).

---

Type: imp
Breaking: False
Doc Required: False
Part: 1/1
  • Loading branch information
AptiviCEO committed Feb 26, 2024
1 parent e20fcb5 commit 93008a7
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public static void PrintCalendar(int Year, int Month, CalendarTypes calendar = C
var calendarInstance = CalendarTools.GetCalendar(calendar);
var CalendarDays = calendarInstance.Culture.DateTimeFormat.DayNames;
var CalendarMonths = calendarInstance.Culture.DateTimeFormat.MonthNames;
var CalendarWeek = calendarInstance.Culture.DateTimeFormat.FirstDayOfWeek;
var CalendarData = new string[6, CalendarDays.Length];
var maxDate = calendarInstance.Calendar.GetDaysInMonth(Year, Month);
var selectedDate = new DateTime(Year, Month, TimeDateTools.KernelDateTime.Day > maxDate ? 1 : TimeDateTools.KernelDateTime.Day);
Expand All @@ -69,19 +70,32 @@ public static void PrintCalendar(int Year, int Month, CalendarTypes calendar = C
string CalendarTitle = CalendarMonths[month - 1] + " " + year;
var CalendarCellOptions = new List<CellOptions>();

// Re-arrange the days according to the first day of week
Dictionary<DayOfWeek, int> mappedDays = [];
int dayOfWeek = (int)CalendarWeek;
for (int i = 0; i < CalendarDays.Length; i++)
{
var day = (DayOfWeek)dayOfWeek;
mappedDays.Add(day, i);
dayOfWeek++;
if (dayOfWeek > 6)
dayOfWeek = 0;
}

// Populate the calendar data
TextWriters.WriteWhere(CalendarTitle, (int)Math.Round((ConsoleWrapper.WindowWidth - CalendarTitle.Length) / 2d), ConsoleWrapper.CursorTop, true, KernelColorType.TableTitle);
TextWriterRaw.Write();
for (int CurrentDay = 1; CurrentDay <= DateTo.Day; CurrentDay++)
{
var CurrentDate = new DateTime(year, month, CurrentDay);
if (CurrentDate.DayOfWeek == 0)
if (CurrentDate.DayOfWeek == CalendarWeek)
CurrentWeek += 1;
int CurrentWeekIndex = CurrentWeek - 1;
int currentDay = mappedDays[CurrentDate.DayOfWeek] + 1;
string CurrentDayMark;
bool ReminderMarked = false;
bool EventMarked = false;
bool IsWeekend = CurrentDate.DayOfWeek == DayOfWeek.Friday || CurrentDate.DayOfWeek == DayOfWeek.Saturday;
bool IsWeekend = currentDay > 5;
bool IsToday = CurrentDate == TimeDateTools.KernelDateTime.Date;

// Dim out the weekends
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
using Terminaux.Reader;
using Terminaux.Base.Extensions;
using Nitrocid.Kernel.Time.Renderers;
using System.Collections.Generic;

namespace Nitrocid.Extras.Calendar.Calendar
{
Expand Down Expand Up @@ -220,13 +221,26 @@ private static void RenderCalendar((int Year, int Month, int Day, CalendarTypes
var calendarInstance = CalendarTools.GetCalendar(state.calendar);
var CalendarDays = calendarInstance.Culture.DateTimeFormat.DayNames;
var CalendarMonths = calendarInstance.Culture.DateTimeFormat.MonthNames;
var CalendarWeek = calendarInstance.Culture.DateTimeFormat.FirstDayOfWeek;
var maxDate = calendarInstance.Calendar.GetDaysInMonth(state.Year, state.Month);
var selectedDate = new DateTime(state.Year, state.Month, TimeDateTools.KernelDateTime.Day > maxDate ? 1 : TimeDateTools.KernelDateTime.Day);
var (year, month, _, _) = TimeDateConverters.GetDateFromCalendar(selectedDate, state.calendar);
var DateTo = new DateTime(year, month, calendarInstance.Calendar.GetDaysInMonth(year, month));
int CurrentWeek = 1;
string CalendarTitle = CalendarMonths[month - 1] + " " + year;
// Re-arrange the days according to the first day of week
Dictionary<DayOfWeek, int> mappedDays = [];
int dayOfWeek = (int)CalendarWeek;
for (int i = 0; i < CalendarDays.Length; i++)
{
var day = (DayOfWeek)dayOfWeek;
mappedDays.Add(day, i);
dayOfWeek++;
if (dayOfWeek > 6)
dayOfWeek = 0;
}
// Write the calendar title in a box
var boxForeground = KernelColorTools.GetColor(KernelColorType.NeutralText);
var background = KernelColorTools.GetColor(KernelColorType.Background);
Expand All @@ -245,20 +259,20 @@ private static void RenderCalendar((int Year, int Month, int Day, CalendarTypes
{
// Populate some variables
var CurrentDate = new DateTime(year, month, CurrentDay);
if (CurrentDate.DayOfWeek == 0)
if (CurrentDate.DayOfWeek == CalendarWeek)
{
CurrentWeek += 1;
dayPosY += 2;
}
int CurrentWeekIndex = CurrentWeek - 1;
int currentDay = (int)CurrentDate.DayOfWeek + 1;
int currentDay = mappedDays[CurrentDate.DayOfWeek] + 1;
dayPosX = boxLeft + 1 + (6 * (currentDay - 1));
string CurrentDayMark;
// Some flags
bool ReminderMarked = false;
bool EventMarked = false;
bool IsWeekend = CurrentDate.DayOfWeek == DayOfWeek.Friday || CurrentDate.DayOfWeek == DayOfWeek.Saturday;
bool IsWeekend = currentDay > 5;
bool IsToday = CurrentDate == new DateTime(state.Year, state.Month, state.Day);
var foreground =
IsToday ? KernelColorTools.GetColor(KernelColorType.TodayDay) :
Expand Down Expand Up @@ -307,9 +321,9 @@ private static void RenderCalendar((int Year, int Month, int Day, CalendarTypes
// Make a single-letter day indicator
int dayIndicatorPosX = boxLeft + 1;
int dayIndicatorPosY = 4;
for (int i = 0; i < CalendarDays.Length; i++)
for (int i = 0; i < mappedDays.Count; i++)
{
string dayName = CalendarDays[i];
string dayName = $"{CalendarDays[(int)mappedDays.Keys.ElementAt(i)]}";
char dayChar = char.ToUpper(dayName[0]);
builder.Append(
CsiSequences.GenerateCsiCursorPosition(dayIndicatorPosX + (6 * i) + 2, dayIndicatorPosY + 1) +
Expand Down Expand Up @@ -345,7 +359,8 @@ private static void RenderCalendar((int Year, int Month, int Day, CalendarTypes
bool ReminderMarked = false;
bool EventMarked = false;
bool dayMarked = false;
bool IsWeekend = CurrentDate.DayOfWeek == DayOfWeek.Friday || CurrentDate.DayOfWeek == DayOfWeek.Saturday;
int currentDay = mappedDays[CurrentDate.DayOfWeek] + 1;
bool IsWeekend = currentDay > 5;
bool IsToday = CurrentDate == new DateTime(state.Year, state.Month, state.Day);
var foreground =
IsToday ? KernelColorTools.GetColor(KernelColorType.TodayDay) :
Expand Down

0 comments on commit 93008a7

Please sign in to comment.