Good improvements on the calendar.

This commit is contained in:
Burak Kaan Köse
2026-03-23 23:31:26 +01:00
parent 1adba271e2
commit 5c7f6aa734
9 changed files with 97 additions and 63 deletions
@@ -26,6 +26,9 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
[ObservableProperty]
public partial bool Is24HourHeaders { get; set; }
[ObservableProperty]
public partial bool IsWorkingHoursEnabled { get; set; }
[ObservableProperty]
public partial TimeSpan WorkingHourStart { get; set; }
@@ -103,6 +106,7 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
var cultureFirstDayName = cultureInfo.DateTimeFormat.GetDayName(preferencesService.FirstDayOfWeek);
SelectedFirstDayOfWeekIndex = DayNames.IndexOf(cultureFirstDayName);
Is24HourHeaders = preferencesService.Prefer24HourTimeFormat;
IsWorkingHoursEnabled = preferencesService.IsWorkingHoursEnabled;
WorkingHourStart = preferencesService.WorkingHourStart;
WorkingHourEnd = preferencesService.WorkingHourEnd;
CellHourHeight = preferencesService.HourHeight;
@@ -193,6 +197,7 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
SaveSettings();
}
partial void OnSelectedFirstDayOfWeekIndexChanged(int value) => SaveSettings();
partial void OnIsWorkingHoursEnabledChanged(bool value) => SaveSettings();
partial void OnWorkingHourStartChanged(TimeSpan value) => SaveSettings();
partial void OnWorkingHourEndChanged(TimeSpan value) => SaveSettings();
partial void OnWorkingDayStartIndexChanged(int value) => SaveSettings();
@@ -327,6 +332,7 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
};
PreferencesService.Prefer24HourTimeFormat = Is24HourHeaders;
PreferencesService.IsWorkingHoursEnabled = IsWorkingHoursEnabled;
PreferencesService.WorkingHourStart = WorkingHourStart;
PreferencesService.WorkingHourEnd = WorkingHourEnd;
PreferencesService.HourHeight = CellHourHeight;
@@ -231,6 +231,7 @@ public interface IPreferencesService : INotifyPropertyChanged
#region Calendar
DayOfWeek FirstDayOfWeek { get; set; }
bool IsWorkingHoursEnabled { get; set; }
TimeSpan WorkingHourStart { get; set; }
TimeSpan WorkingHourEnd { get; set; }
DayOfWeek WorkingDayStart { get; set; }
@@ -7,6 +7,7 @@ namespace Wino.Core.Domain.Models.Calendar;
public record CalendarSettings(DayOfWeek FirstDayOfWeek,
List<DayOfWeek> WorkingDays,
bool IsWorkingHoursEnabled,
DayOfWeek WorkWeekStart,
DayOfWeek WorkWeekEnd,
TimeSpan WorkingHourStart,
@@ -164,10 +164,11 @@ public class CalendarPageViewModelTests
return new CalendarSettings(
firstDayOfWeek,
[DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday],
true,
workWeekStart,
workWeekEnd,
TimeSpan.FromHours(8),
TimeSpan.FromHours(17),
TimeSpan.FromHours(9),
TimeSpan.FromHours(18),
64,
DayHeaderDisplayType.TwentyFourHour,
CultureInfo.GetCultureInfo(cultureName));
@@ -171,10 +171,11 @@ public class CalendarRangeResolverTests
return new CalendarSettings(
firstDayOfWeek,
[DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday],
true,
workWeekStart,
workWeekEnd,
TimeSpan.FromHours(8),
TimeSpan.FromHours(17),
TimeSpan.FromHours(9),
TimeSpan.FromHours(18),
64,
DayHeaderDisplayType.TwentyFourHour,
CultureInfo.GetCultureInfo(cultureName));
@@ -402,6 +402,7 @@ public sealed partial class CalendarPeriodControl : UserControl, INotifyProperty
var scaleX = (float)(e.Info.Width / timedSurfaceWidth);
var scaleY = (float)(e.Info.Height / timelineHeight);
var dayWidth = (float)(_timedLayout.DayWidth * scaleX);
var isWorkingHoursEnabled = CalendarSettings?.IsWorkingHoursEnabled == true;
var workDayStartHour = CalendarSettings?.WorkingHourStart.TotalHours ?? 9d;
var workDayEndHour = CalendarSettings?.WorkingHourEnd.TotalHours ?? 17d;
var intervalHeight = (float)(GetTimedGridIntervalHeight() * scaleY);
@@ -410,7 +411,8 @@ public sealed partial class CalendarPeriodControl : UserControl, INotifyProperty
for (var dayIndex = 0; dayIndex < _timedLayout.VisibleDates.Count; dayIndex++)
{
var x = dayIndex * dayWidth;
var isWorkingDay = CalendarSettings?.WorkingDays.Contains(_timedLayout.VisibleDates[dayIndex].DayOfWeek) == true;
var isWorkingDay = isWorkingHoursEnabled &&
CalendarSettings?.WorkingDays.Contains(_timedLayout.VisibleDates[dayIndex].DayOfWeek) == true;
for (var intervalIndex = 0; intervalIndex < intervalCount; intervalIndex++)
{
@@ -311,6 +311,12 @@ public class PreferencesService(IConfigurationService configurationService) : Ob
set => SaveProperty(propertyName: nameof(HourHeight), value);
}
public bool IsWorkingHoursEnabled
{
get => _configurationService.Get(nameof(IsWorkingHoursEnabled), true);
set => SaveProperty(propertyName: nameof(IsWorkingHoursEnabled), value);
}
public string CalendarTimedDayHeaderDateFormat
{
get => _configurationService.Get(nameof(CalendarTimedDayHeaderDateFormat), "ddd dd");
@@ -319,13 +325,13 @@ public class PreferencesService(IConfigurationService configurationService) : Ob
public TimeSpan WorkingHourStart
{
get => _configurationService.Get(nameof(WorkingHourStart), new TimeSpan(8, 0, 0));
get => _configurationService.Get(nameof(WorkingHourStart), new TimeSpan(9, 0, 0));
set => SaveProperty(propertyName: nameof(WorkingHourStart), value);
}
public TimeSpan WorkingHourEnd
{
get => _configurationService.Get(nameof(WorkingHourEnd), new TimeSpan(17, 0, 0));
get => _configurationService.Get(nameof(WorkingHourEnd), new TimeSpan(18, 0, 0));
set => SaveProperty(propertyName: nameof(WorkingHourEnd), value);
}
@@ -402,6 +408,7 @@ public class PreferencesService(IConfigurationService configurationService) : Ob
return new CalendarSettings(FirstDayOfWeek,
workingDays,
IsWorkingHoursEnabled,
WorkingDayStart,
WorkingDayEnd,
WorkingHourStart,
@@ -38,6 +38,16 @@
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
ContentAlignment="Vertical">
<controls:SettingsCard.Content>
<StackPanel Spacing="16">
<StackPanel Spacing="6">
<TextBlock FontWeight="SemiBold" Text="Highlight working hours" />
<ToggleSwitch
IsOn="{x:Bind ViewModel.IsWorkingHoursEnabled, Mode=TwoWay}"
OffContent="Off"
OnContent="On" />
</StackPanel>
<Grid RowSpacing="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
@@ -56,12 +66,14 @@
Text="From" />
<ComboBox
Grid.Column="1"
IsEnabled="{x:Bind ViewModel.IsWorkingHoursEnabled, Mode=OneWay}"
ItemsSource="{x:Bind ViewModel.DayNames, Mode=OneWay}"
SelectedIndex="{x:Bind ViewModel.WorkingDayStartIndex, Mode=TwoWay}" />
<TimePicker
x:Name="WorkHourStartPicker"
Grid.Column="2"
Margin="12,0"
IsEnabled="{x:Bind ViewModel.IsWorkingHoursEnabled, Mode=OneWay}"
Time="{x:Bind ViewModel.WorkingHourStart, Mode=TwoWay}" />
</Grid>
@@ -77,6 +89,7 @@
Text="To" />
<ComboBox
Grid.Column="1"
IsEnabled="{x:Bind ViewModel.IsWorkingHoursEnabled, Mode=OneWay}"
ItemsSource="{x:Bind ViewModel.DayNames, Mode=OneWay}"
SelectedIndex="{x:Bind ViewModel.WorkingDayEndIndex, Mode=TwoWay}" />
@@ -84,9 +97,12 @@
x:Name="WorkEndStartPicker"
Grid.Column="2"
Margin="12,0"
IsEnabled="{x:Bind ViewModel.IsWorkingHoursEnabled, Mode=OneWay}"
Time="{x:Bind ViewModel.WorkingHourEnd, Mode=TwoWay}" />
</Grid>
</Grid>
</StackPanel>
</controls:SettingsCard.Content>
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
@@ -177,6 +193,7 @@
</controls:SettingsCard.HeaderIcon>
<StackPanel Spacing="8">
<ToggleSwitch
HorizontalAlignment="Right"
IsOn="{x:Bind ViewModel.Is24HourHeaders, Mode=TwoWay}"
OffContent="12h"
OnContent="24h" />
@@ -187,19 +204,13 @@
</StackPanel>
</controls:SettingsCard>
<controls:SettingsCard
Description="{x:Bind domain:Translator.CalendarSettings_TimedDayHeaderFormat_Description}"
Header="{x:Bind domain:Translator.CalendarSettings_TimedDayHeaderFormat_Header}">
<controls:SettingsCard Description="{x:Bind domain:Translator.CalendarSettings_TimedDayHeaderFormat_Description}" Header="{x:Bind domain:Translator.CalendarSettings_TimedDayHeaderFormat_Header}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Glyph="&#xE823;" />
</controls:SettingsCard.HeaderIcon>
<StackPanel Spacing="8">
<TextBox
PlaceholderText="ddd dd"
Text="{x:Bind ViewModel.TimedDayHeaderDateFormat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox
ItemsSource="{x:Bind ViewModel.TimedDayHeaderFormatPresets, Mode=OneWay}"
SelectedIndex="{x:Bind ViewModel.SelectedTimedDayHeaderFormatPresetIndex, Mode=TwoWay}" />
<TextBox PlaceholderText="ddd dd" Text="{x:Bind ViewModel.TimedDayHeaderDateFormat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox ItemsSource="{x:Bind ViewModel.TimedDayHeaderFormatPresets, Mode=OneWay}" SelectedIndex="{x:Bind ViewModel.SelectedTimedDayHeaderFormatPresetIndex, Mode=TwoWay}" />
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind ViewModel.TimedDayHeaderFormatPreview, Mode=OneWay}"
@@ -4,6 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:abstract="using:Wino.Views.Abstract"
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:controls1="using:Wino.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:domain="using:Wino.Core.Domain"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -23,7 +24,10 @@
<PathIcon Data="F1 M 17.5 9.375 C 17.832031 9.375 18.149414 9.440104 18.452148 9.570312 C 18.754883 9.700521 19.020182 9.876303 19.248047 10.097656 C 19.47591 10.319011 19.658203 10.579428 19.794922 10.878906 C 19.931641 11.178386 20 11.494141 20 11.826172 L 20 15.048828 C 20 15.37435 19.933268 15.685222 19.799805 15.981445 C 19.66634 16.27767 19.487305 16.538086 19.262695 16.762695 C 19.038086 16.987305 18.777668 17.166342 18.481445 17.299805 C 18.185221 17.433268 17.874348 17.5 17.548828 17.5 L 2.451172 17.5 C 2.125651 17.5 1.814779 17.433268 1.518555 17.299805 C 1.222331 17.166342 0.961914 16.987305 0.737305 16.762695 C 0.512695 16.538086 0.333659 16.27767 0.200195 15.981445 C 0.066732 15.685222 0 15.37435 0 15.048828 L 0 4.951172 C 0 4.625651 0.066732 4.314779 0.200195 4.018555 C 0.333659 3.722332 0.512695 3.461914 0.737305 3.237305 C 0.961914 3.012695 1.222331 2.83366 1.518555 2.700195 C 1.814779 2.566732 2.125651 2.5 2.451172 2.5 L 12.548828 2.5 C 12.887369 2.5 13.203125 2.565105 13.496094 2.695312 C 13.789062 2.825521 14.044596 3.00293 14.262695 3.227539 C 14.480793 3.452148 14.654947 3.712566 14.785156 4.008789 C 14.915364 4.305014 14.986979 4.619141 15 4.951172 C 15.00651 5.022787 15.009766 5.094402 15.009766 5.166016 C 15.009766 5.237631 15.009766 5.309245 15.009766 5.380859 C 15.009766 5.5306 15.008138 5.677084 15.004883 5.820312 C 15.001627 5.963542 14.999999 6.106771 15 6.25 C 15.33203 6.25 15.649413 6.315104 15.952148 6.445312 C 16.254883 6.575521 16.520182 6.751303 16.748047 6.972656 C 16.97591 7.194011 17.156574 7.4528 17.290039 7.749023 C 17.423502 8.045248 17.493488 8.362631 17.5 8.701172 Z M 1.25 15 C 1.25 15.175781 1.282552 15.34017 1.347656 15.493164 C 1.41276 15.646159 1.500651 15.777995 1.611328 15.888672 C 1.722005 15.99935 1.853841 16.08724 2.006836 16.152344 C 2.159831 16.217449 2.324219 16.25 2.5 16.25 L 6.582031 16.25 C 6.360677 15.859375 6.25 15.442709 6.25 15 L 6.25 8.701172 C 6.25 8.362631 6.318359 8.045248 6.455078 7.749023 C 6.591797 7.4528 6.774088 7.194011 7.001953 6.972656 C 7.229817 6.751303 7.495117 6.575521 7.797852 6.445312 C 8.100586 6.315104 8.417969 6.25 8.75 6.25 L 13.75 6.25 L 13.75 5 C 13.75 4.830729 13.717447 4.669597 13.652344 4.516602 C 13.587239 4.363607 13.497721 4.230144 13.383789 4.116211 C 13.269855 4.002279 13.136393 3.912762 12.983398 3.847656 C 12.830403 3.782553 12.669271 3.75 12.5 3.75 L 2.5 3.75 C 2.324219 3.75 2.161458 3.782553 2.011719 3.847656 C 1.861979 3.912762 1.730143 4.002279 1.616211 4.116211 C 1.502279 4.230144 1.41276 4.361979 1.347656 4.511719 C 1.282552 4.661459 1.25 4.82422 1.25 5 Z M 12.207031 16.25 C 11.985677 15.859375 11.875 15.442709 11.875 15 L 11.875 11.826172 C 11.875 11.487631 11.943359 11.170248 12.080078 10.874023 C 12.216797 10.5778 12.399088 10.319011 12.626953 10.097656 C 12.854817 9.876303 13.120117 9.700521 13.422852 9.570312 C 13.725586 9.440104 14.042969 9.375 14.375 9.375 L 16.25 9.375 L 16.25 8.75 C 16.25 8.580729 16.217447 8.419597 16.152344 8.266602 C 16.087238 8.113607 15.997721 7.980144 15.883789 7.866211 C 15.769856 7.752279 15.636393 7.662762 15.483398 7.597656 C 15.330403 7.532553 15.169271 7.5 15 7.5 L 8.75 7.5 C 8.574219 7.5 8.411458 7.532553 8.261719 7.597656 C 8.111979 7.662762 7.980143 7.752279 7.866211 7.866211 C 7.752278 7.980144 7.66276 8.111979 7.597656 8.261719 C 7.532552 8.411459 7.5 8.574219 7.5 8.75 L 7.5 15 C 7.5 15.175781 7.532552 15.34017 7.597656 15.493164 C 7.66276 15.646159 7.750651 15.777995 7.861328 15.888672 C 7.972005 15.99935 8.103841 16.08724 8.256836 16.152344 C 8.40983 16.217449 8.574219 16.25 8.75 16.25 Z M 18.75 11.875 C 18.75 11.705729 18.717447 11.544597 18.652344 11.391602 C 18.587238 11.238607 18.497721 11.105144 18.383789 10.991211 C 18.269855 10.877279 18.136393 10.787761 17.983398 10.722656 C 17.830402 10.657553 17.66927 10.625 17.5 10.625 L 14.375 10.625 C 14.199219 10.625 14.036458 10.657553 13.886719 10.722656 C 13.736979 10.787761 13.605143 10.877279 13.491211 10.991211 C 13.377278 11.105144 13.28776 11.236979 13.222656 11.386719 C 13.157551 11.536459 13.124999 11.699219 13.125 11.875 L 13.125 15 C 13.124999 15.175781 13.157551 15.34017 13.222656 15.493164 C 13.28776 15.646159 13.37565 15.777995 13.486328 15.888672 C 13.597004 15.99935 13.72884 16.08724 13.881836 16.152344 C 14.03483 16.217449 14.199219 16.25 14.375 16.25 L 17.5 16.25 C 17.675781 16.25 17.838541 16.217449 17.988281 16.152344 C 18.13802 16.08724 18.269855 15.997722 18.383789 15.883789 C 18.497721 15.769857 18.587238 15.638021 18.652344 15.488281 C 18.717447 15.338542 18.75 15.175781 18.75 15 Z " />
</controls:SettingsExpander.HeaderIcon>
<controls:SettingsExpander.Items>
<controls:SettingsCard>
<controls:SettingsCard VerticalAlignment="Center" HorizontalContentAlignment="Center">
<controls:SettingsCard.Header>
<controls1:MailItemDisplayInformationControl x:Name="PreviewMailItemDisplayInformationControl" />
</controls:SettingsCard.Header>
<controls:SettingsCard.Content>
<RadioButtons SelectedIndex="{x:Bind ViewModel.SelectedMailSpacingIndex, Mode=TwoWay}">
<RadioButton Content="{x:Bind domain:Translator.SettingsPersonalizationMailDisplayCompactMode}" />