From 10dd42b63f6dc6b415e2f534eb0e4ac81ad3c876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Tue, 10 Feb 2026 01:03:03 +0100 Subject: [PATCH] Thread UI fixes. --- .../Collections/WinoMailCollection.cs | 20 +++++++++-- .../Data/ThreadMailItemViewModel.cs | 36 ++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs index 2823a992..31d829ad 100644 --- a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs +++ b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs @@ -108,6 +108,17 @@ public class WinoMailCollection : ObservableRecipient, IRecipient { + foreach (var group in _mailItemSource) + { + foreach (var item in group) + { + if (item is ThreadMailItemViewModel threadItem) + { + threadItem.UnregisterThreadEmailPropertyChangedHandlers(); + } + } + } + _mailItemSource.Clear(); MailCopyIdHashSet.Clear(); _threadIdToItemsMap.Clear(); @@ -278,7 +289,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient group, IMailListItem mailItem) + private async Task RemoveItemInternalAsync(ObservableGroup group, IMailListItem mailItem, bool detachThreadHandlers = true) { UpdateUniqueIdHashes(mailItem, false); UpdateThreadIdCache(mailItem, false); @@ -293,6 +304,11 @@ public class WinoMailCollection : ObservableRecipient, IRecipient @@ -369,7 +385,7 @@ public class WinoMailCollection : ObservableRecipient, IRecipient currentGroup, ThreadMailItemViewModel threadViewModel, object newGroupKey) { - await RemoveItemInternalAsync(currentGroup, threadViewModel); + await RemoveItemInternalAsync(currentGroup, threadViewModel, detachThreadHandlers: false); await InsertItemInternalAsync(newGroupKey, threadViewModel); } diff --git a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs index 8bbc1930..0fcbdb1b 100644 --- a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs +++ b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using Wino.Core.Domain; @@ -216,10 +217,11 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte } ThreadEmails.Insert(insertIndex, email); + email.PropertyChanged += ThreadEmailPropertyChanged; _uniqueIdSet.Add(email.MailCopy.UniqueId); _cachedLatestMailViewModel = ThreadEmails[0]; - // Reassign to trigger property change notifications - ThreadEmails = ThreadEmails; + OnPropertyChanged(nameof(EmailCount)); + NotifyMailItemUpdated(email); } /// @@ -229,13 +231,36 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte { if (ThreadEmails.Remove(email)) { + email.PropertyChanged -= ThreadEmailPropertyChanged; _uniqueIdSet.Remove(email.MailCopy.UniqueId); _cachedLatestMailViewModel = ThreadEmails.Count > 0 ? ThreadEmails[0] : null; - // Reassign to trigger property change notifications - ThreadEmails = ThreadEmails; + OnPropertyChanged(nameof(EmailCount)); + NotifyMailItemUpdated(email); } } + public void UnregisterThreadEmailPropertyChangedHandlers() + { + foreach (var email in ThreadEmails) + { + email.PropertyChanged -= ThreadEmailPropertyChanged; + } + } + + + private void ThreadEmailPropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(MailItemViewModel.IsSelected) || e.PropertyName == nameof(MailItemViewModel.IsDisplayedInThread)) + return; + + if (e.PropertyName == nameof(MailItemViewModel.IsRead)) + { + OnPropertyChanged(nameof(IsRead)); + return; + } + + NotifyMailItemUpdated(sender as MailItemViewModel); + } /// /// Notifies that a mail item within this thread has been updated. /// This raises PropertyChanged for all thread-level computed properties that depend on child items. @@ -292,3 +317,4 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte } } } +