New grouped collection for quick event dialog.

This commit is contained in:
Burak Kaan Köse
2025-12-30 10:36:27 +01:00
parent 07f3dabff6
commit 70ac2d2bea
4 changed files with 69 additions and 4 deletions
@@ -2,7 +2,9 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using CommunityToolkit.Mvvm.Collections;
using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Calendar.ViewModels.Interfaces;
@@ -25,4 +27,5 @@ public interface IAccountCalendarStateService : INotifyPropertyChanged
/// </summary>
IEnumerable<AccountCalendarViewModel> ActiveCalendars { get; }
IEnumerable<AccountCalendarViewModel> AllCalendars { get; }
ReadOnlyObservableGroupedCollection<MailAccount, AccountCalendarViewModel> GroupedCalendars { get; set; }
}
@@ -107,4 +107,6 @@ public class MailAccount
/// Gets whether the account can perform AliasInformation sync type.
/// </summary>
public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail;
public override string ToString() => Name;
}
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using CommunityToolkit.Mvvm.Collections;
using CommunityToolkit.Mvvm.ComponentModel;
using Wino.Calendar.ViewModels.Data;
using Wino.Calendar.ViewModels.Interfaces;
@@ -19,10 +20,14 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
public event EventHandler<AccountCalendarViewModel>? AccountCalendarSelectionStateChanged;
private readonly ObservableCollection<GroupedAccountCalendarViewModel> _internalGroupedAccountCalendars;
private readonly ObservableGroupedCollection<MailAccount, AccountCalendarViewModel> _internalGroupedCalendars;
[ObservableProperty]
public partial ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; set; }
[ObservableProperty]
public partial ReadOnlyObservableGroupedCollection<MailAccount, AccountCalendarViewModel> GroupedCalendars { get; set; }
public IEnumerable<AccountCalendarViewModel> ActiveCalendars
{
get
@@ -46,6 +51,9 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
{
_internalGroupedAccountCalendars = new ObservableCollection<GroupedAccountCalendarViewModel>();
GroupedAccountCalendars = new ReadOnlyObservableCollection<GroupedAccountCalendarViewModel>(_internalGroupedAccountCalendars);
_internalGroupedCalendars = new ObservableGroupedCollection<MailAccount, AccountCalendarViewModel>();
GroupedCalendars = new ReadOnlyObservableGroupedCollection<MailAccount, AccountCalendarViewModel>(_internalGroupedCalendars);
}
private void SingleGroupCalendarCollectiveStateChanged(object? sender, EventArgs e)
@@ -60,6 +68,20 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
groupedAccountCalendar.CollectiveSelectionStateChanged += SingleGroupCalendarCollectiveStateChanged;
_internalGroupedAccountCalendars.Add(groupedAccountCalendar);
// Maintain the grouped calendars collection
var group = _internalGroupedCalendars.FirstOrDefault<ObservableGroup<MailAccount, AccountCalendarViewModel>>(g => g.Key.Id == groupedAccountCalendar.Account.Id);
if (group == null)
{
_internalGroupedCalendars.Add(new ObservableGroup<MailAccount, AccountCalendarViewModel>(groupedAccountCalendar.Account, groupedAccountCalendar.AccountCalendars));
}
else
{
foreach (var calendar in groupedAccountCalendar.AccountCalendars)
{
group.Add(calendar);
}
}
}
public void RemoveGroupedAccountCalendar(GroupedAccountCalendarViewModel groupedAccountCalendar)
@@ -68,6 +90,21 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
groupedAccountCalendar.CollectiveSelectionStateChanged -= SingleGroupCalendarCollectiveStateChanged;
_internalGroupedAccountCalendars.Remove(groupedAccountCalendar);
// Maintain the grouped calendars collection
var group = _internalGroupedCalendars.FirstOrDefault<ObservableGroup<MailAccount, AccountCalendarViewModel>>(g => g.Key.Id == groupedAccountCalendar.Account.Id);
if (group != null)
{
foreach (var calendar in groupedAccountCalendar.AccountCalendars.ToList())
{
group.Remove(calendar);
}
if (group.Count == 0)
{
_internalGroupedCalendars.Remove(group);
}
}
}
public void ClearGroupedAccountCalendars()
@@ -92,6 +129,17 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
else
{
group.AccountCalendars.Add(accountCalendar);
// Maintain the grouped calendars collection
var calendarGroup = _internalGroupedCalendars.FirstOrDefault<ObservableGroup<MailAccount, AccountCalendarViewModel>>(g => g.Key.Id == accountCalendar.Account.Id);
if (calendarGroup == null)
{
_internalGroupedCalendars.Add(new ObservableGroup<MailAccount, AccountCalendarViewModel>(accountCalendar.Account, new[] { accountCalendar }));
}
else
{
calendarGroup.Add(accountCalendar);
}
}
}
@@ -104,6 +152,18 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
group.AccountCalendars.Remove(accountCalendar);
// Maintain the grouped calendars collection
var calendarGroup = _internalGroupedCalendars.FirstOrDefault<ObservableGroup<MailAccount, AccountCalendarViewModel>>(g => g.Key.Id == accountCalendar.Account.Id);
if (calendarGroup != null)
{
calendarGroup.Remove(accountCalendar);
if (calendarGroup.Count == 0)
{
_internalGroupedCalendars.Remove(calendarGroup);
}
}
if (group.AccountCalendars.Count == 0)
{
RemoveGroupedAccountCalendar(group);
@@ -13,14 +13,14 @@
xmlns:local="using:Wino.Calendar.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
xmlns:shared="using:Wino.Core.Domain.Entities.Shared"
xmlns:shared="using:Wino.Core.Domain.Entities.Shared" xmlns:collections="using:CommunityToolkit.Mvvm.Collections"
mc:Ignorable="d">
<Page.Resources>
<CollectionViewSource
x:Name="GroupedCalendarEnumerableViewSource"
IsSourceGrouped="True"
Source="{x:Bind ViewModel.AccountCalendarStateService.GroupedAccountCalendars, Mode=OneWay}" />
Source="{x:Bind ViewModel.AccountCalendarStateService.GroupedCalendars, Mode=OneWay}" />
</Page.Resources>
<Border
@@ -150,11 +150,11 @@
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate x:DataType="data:GroupedAccountCalendarViewModel">
<DataTemplate x:DataType="collections:IReadOnlyObservableGroup">
<TextBlock
FontSize="14"
FontWeight="SemiBold"
Text="{x:Bind Account.Name}" />
Text="{x:Bind Key.ToString()}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>