Property change based updates on the mails for fast bulk operations.
This commit is contained in:
@@ -211,68 +211,200 @@ public partial class MailItemViewModel(MailCopy mailCopy) : ObservableRecipient,
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the MailCopy with new data and notifies all bound properties.
|
||||
/// This method copies values from the source to the existing MailCopy to maintain reference integrity,
|
||||
/// then explicitly raises PropertyChanged for all dependent properties.
|
||||
/// </summary>
|
||||
/// <param name="source">The source MailCopy with updated values.</param>
|
||||
public void UpdateFrom(MailCopy source)
|
||||
public static MailCopyChangeFlags GetChangeFlagsForProperty(string propertyName)
|
||||
{
|
||||
if (source == null) return;
|
||||
return propertyName switch
|
||||
{
|
||||
nameof(CreationDate) or nameof(SortingDate) => MailCopyChangeFlags.CreationDate,
|
||||
nameof(IsFlagged) => MailCopyChangeFlags.IsFlagged,
|
||||
nameof(FromName) or nameof(SortingName) => MailCopyChangeFlags.FromName,
|
||||
nameof(IsFocused) => MailCopyChangeFlags.IsFocused,
|
||||
nameof(IsRead) => MailCopyChangeFlags.IsRead,
|
||||
nameof(IsDraft) => MailCopyChangeFlags.IsDraft,
|
||||
nameof(DraftId) => MailCopyChangeFlags.DraftId,
|
||||
nameof(Id) => MailCopyChangeFlags.Id,
|
||||
nameof(Subject) => MailCopyChangeFlags.Subject,
|
||||
nameof(PreviewText) => MailCopyChangeFlags.PreviewText,
|
||||
nameof(FromAddress) => MailCopyChangeFlags.FromAddress,
|
||||
nameof(HasAttachments) => MailCopyChangeFlags.HasAttachments,
|
||||
nameof(IsCalendarEvent) => MailCopyChangeFlags.ItemType,
|
||||
nameof(Importance) => MailCopyChangeFlags.Importance,
|
||||
nameof(ThreadId) => MailCopyChangeFlags.ThreadId,
|
||||
nameof(MessageId) => MailCopyChangeFlags.MessageId,
|
||||
nameof(References) => MailCopyChangeFlags.References,
|
||||
nameof(InReplyTo) => MailCopyChangeFlags.InReplyTo,
|
||||
nameof(FileId) => MailCopyChangeFlags.FileId,
|
||||
nameof(FolderId) => MailCopyChangeFlags.FolderId,
|
||||
nameof(UniqueId) => MailCopyChangeFlags.UniqueId,
|
||||
nameof(Base64ContactPicture) or nameof(SenderContact) => MailCopyChangeFlags.SenderContact,
|
||||
_ => MailCopyChangeFlags.None
|
||||
};
|
||||
}
|
||||
|
||||
// Update the underlying MailCopy properties directly to maintain reference integrity
|
||||
// This is important because other parts of the app may hold references to this MailCopy
|
||||
// Note: UniqueId is the primary key and should match - we don't update it
|
||||
MailCopy.Id = source.Id;
|
||||
MailCopy.FolderId = source.FolderId;
|
||||
MailCopy.ThreadId = source.ThreadId;
|
||||
MailCopy.MessageId = source.MessageId;
|
||||
MailCopy.References = source.References;
|
||||
MailCopy.InReplyTo = source.InReplyTo;
|
||||
MailCopy.IsDraft = source.IsDraft;
|
||||
MailCopy.DraftId = source.DraftId;
|
||||
MailCopy.CreationDate = source.CreationDate;
|
||||
MailCopy.Subject = source.Subject;
|
||||
MailCopy.PreviewText = source.PreviewText;
|
||||
MailCopy.FromName = source.FromName;
|
||||
MailCopy.FromAddress = source.FromAddress;
|
||||
MailCopy.HasAttachments = source.HasAttachments;
|
||||
MailCopy.Importance = source.Importance;
|
||||
MailCopy.IsRead = source.IsRead;
|
||||
MailCopy.IsFlagged = source.IsFlagged;
|
||||
MailCopy.IsFocused = source.IsFocused;
|
||||
MailCopy.FileId = source.FileId;
|
||||
MailCopy.ItemType = source.ItemType;
|
||||
MailCopy.SenderContact = source.SenderContact;
|
||||
MailCopy.AssignedAccount = source.AssignedAccount;
|
||||
MailCopy.AssignedFolder = source.AssignedFolder;
|
||||
/// <summary>
|
||||
/// Updates the existing <see cref="MailCopy"/> while raising only the relevant UI notifications.
|
||||
/// </summary>
|
||||
/// <param name="source">Source data used to update this item.</param>
|
||||
/// <param name="changeHint">
|
||||
/// Optional set of known changes. This is required when <paramref name="source"/> is the same instance
|
||||
/// and has already been mutated by Apply/Revert flows.
|
||||
/// </param>
|
||||
/// <returns>The effective set of changed fields used for notifications.</returns>
|
||||
public MailCopyChangeFlags UpdateFrom(MailCopy source, MailCopyChangeFlags changeHint = MailCopyChangeFlags.None)
|
||||
{
|
||||
if (source == null) return MailCopyChangeFlags.None;
|
||||
|
||||
// Raise PropertyChanged for all properties that XAML may bind to
|
||||
OnPropertyChanged(nameof(CreationDate));
|
||||
OnPropertyChanged(nameof(IsFlagged));
|
||||
OnPropertyChanged(nameof(FromName));
|
||||
OnPropertyChanged(nameof(IsFocused));
|
||||
OnPropertyChanged(nameof(IsRead));
|
||||
OnPropertyChanged(nameof(IsDraft));
|
||||
OnPropertyChanged(nameof(DraftId));
|
||||
OnPropertyChanged(nameof(Id));
|
||||
OnPropertyChanged(nameof(Subject));
|
||||
OnPropertyChanged(nameof(PreviewText));
|
||||
OnPropertyChanged(nameof(FromAddress));
|
||||
OnPropertyChanged(nameof(HasAttachments));
|
||||
OnPropertyChanged(nameof(IsCalendarEvent));
|
||||
OnPropertyChanged(nameof(Importance));
|
||||
OnPropertyChanged(nameof(ThreadId));
|
||||
OnPropertyChanged(nameof(MessageId));
|
||||
OnPropertyChanged(nameof(References));
|
||||
OnPropertyChanged(nameof(InReplyTo));
|
||||
OnPropertyChanged(nameof(FileId));
|
||||
OnPropertyChanged(nameof(FolderId));
|
||||
OnPropertyChanged(nameof(UniqueId));
|
||||
OnPropertyChanged(nameof(Base64ContactPicture));
|
||||
OnPropertyChanged(nameof(SenderContact));
|
||||
OnPropertyChanged(nameof(SortingDate));
|
||||
OnPropertyChanged(nameof(SortingName));
|
||||
var changedFlags = MailCopyChangeFlags.None;
|
||||
var isSameReference = ReferenceEquals(MailCopy, source);
|
||||
|
||||
if (!isSameReference)
|
||||
{
|
||||
changedFlags |= SetIfChanged(MailCopy.Id, source.Id, value => MailCopy.Id = value, MailCopyChangeFlags.Id);
|
||||
changedFlags |= SetIfChanged(MailCopy.FolderId, source.FolderId, value => MailCopy.FolderId = value, MailCopyChangeFlags.FolderId);
|
||||
changedFlags |= SetIfChanged(MailCopy.ThreadId, source.ThreadId, value => MailCopy.ThreadId = value, MailCopyChangeFlags.ThreadId);
|
||||
changedFlags |= SetIfChanged(MailCopy.MessageId, source.MessageId, value => MailCopy.MessageId = value, MailCopyChangeFlags.MessageId);
|
||||
changedFlags |= SetIfChanged(MailCopy.References, source.References, value => MailCopy.References = value, MailCopyChangeFlags.References);
|
||||
changedFlags |= SetIfChanged(MailCopy.InReplyTo, source.InReplyTo, value => MailCopy.InReplyTo = value, MailCopyChangeFlags.InReplyTo);
|
||||
changedFlags |= SetIfChanged(MailCopy.IsDraft, source.IsDraft, value => MailCopy.IsDraft = value, MailCopyChangeFlags.IsDraft);
|
||||
changedFlags |= SetIfChanged(MailCopy.DraftId, source.DraftId, value => MailCopy.DraftId = value, MailCopyChangeFlags.DraftId);
|
||||
changedFlags |= SetIfChanged(MailCopy.CreationDate, source.CreationDate, value => MailCopy.CreationDate = value, MailCopyChangeFlags.CreationDate);
|
||||
changedFlags |= SetIfChanged(MailCopy.Subject, source.Subject, value => MailCopy.Subject = value, MailCopyChangeFlags.Subject);
|
||||
changedFlags |= SetIfChanged(MailCopy.PreviewText, source.PreviewText, value => MailCopy.PreviewText = value, MailCopyChangeFlags.PreviewText);
|
||||
changedFlags |= SetIfChanged(MailCopy.FromName, source.FromName, value => MailCopy.FromName = value, MailCopyChangeFlags.FromName);
|
||||
changedFlags |= SetIfChanged(MailCopy.FromAddress, source.FromAddress, value => MailCopy.FromAddress = value, MailCopyChangeFlags.FromAddress);
|
||||
changedFlags |= SetIfChanged(MailCopy.HasAttachments, source.HasAttachments, value => MailCopy.HasAttachments = value, MailCopyChangeFlags.HasAttachments);
|
||||
changedFlags |= SetIfChanged(MailCopy.Importance, source.Importance, value => MailCopy.Importance = value, MailCopyChangeFlags.Importance);
|
||||
changedFlags |= SetIfChanged(MailCopy.IsRead, source.IsRead, value => MailCopy.IsRead = value, MailCopyChangeFlags.IsRead);
|
||||
changedFlags |= SetIfChanged(MailCopy.IsFlagged, source.IsFlagged, value => MailCopy.IsFlagged = value, MailCopyChangeFlags.IsFlagged);
|
||||
changedFlags |= SetIfChanged(MailCopy.IsFocused, source.IsFocused, value => MailCopy.IsFocused = value, MailCopyChangeFlags.IsFocused);
|
||||
changedFlags |= SetIfChanged(MailCopy.FileId, source.FileId, value => MailCopy.FileId = value, MailCopyChangeFlags.FileId);
|
||||
changedFlags |= SetIfChanged(MailCopy.ItemType, source.ItemType, value => MailCopy.ItemType = value, MailCopyChangeFlags.ItemType);
|
||||
changedFlags |= SetIfChanged(MailCopy.SenderContact, source.SenderContact, value => MailCopy.SenderContact = value, MailCopyChangeFlags.SenderContact);
|
||||
changedFlags |= SetIfChanged(MailCopy.AssignedAccount, source.AssignedAccount, value => MailCopy.AssignedAccount = value, MailCopyChangeFlags.AssignedAccount);
|
||||
changedFlags |= SetIfChanged(MailCopy.AssignedFolder, source.AssignedFolder, value => MailCopy.AssignedFolder = value, MailCopyChangeFlags.AssignedFolder);
|
||||
changedFlags |= SetIfChanged(MailCopy.UniqueId, source.UniqueId, value => MailCopy.UniqueId = value, MailCopyChangeFlags.UniqueId);
|
||||
}
|
||||
|
||||
changedFlags |= changeHint;
|
||||
|
||||
if (isSameReference && changedFlags == MailCopyChangeFlags.None)
|
||||
{
|
||||
// Without a hint there is no reliable way to diff in-place updates on the same instance.
|
||||
// Fall back to full refresh to preserve correctness.
|
||||
changedFlags = MailCopyChangeFlags.All;
|
||||
}
|
||||
|
||||
RaisePropertyChanges(changedFlags);
|
||||
|
||||
return changedFlags;
|
||||
}
|
||||
|
||||
private static MailCopyChangeFlags SetIfChanged<T>(T currentValue, T newValue, Action<T> setter, MailCopyChangeFlags flag)
|
||||
{
|
||||
if (EqualityComparer<T>.Default.Equals(currentValue, newValue))
|
||||
return MailCopyChangeFlags.None;
|
||||
|
||||
setter(newValue);
|
||||
return flag;
|
||||
}
|
||||
|
||||
private void RaisePropertyChanges(MailCopyChangeFlags changedFlags)
|
||||
{
|
||||
if (changedFlags == MailCopyChangeFlags.None)
|
||||
return;
|
||||
|
||||
var changedProperties = new List<string>(12);
|
||||
|
||||
void Queue(string propertyName)
|
||||
{
|
||||
if (!changedProperties.Contains(propertyName))
|
||||
{
|
||||
changedProperties.Add(propertyName);
|
||||
}
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.CreationDate) != 0)
|
||||
{
|
||||
Queue(nameof(CreationDate));
|
||||
Queue(nameof(SortingDate));
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsFlagged) != 0)
|
||||
Queue(nameof(IsFlagged));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FromName) != 0)
|
||||
{
|
||||
Queue(nameof(FromName));
|
||||
Queue(nameof(SortingName));
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FromAddress) != 0)
|
||||
{
|
||||
Queue(nameof(FromAddress));
|
||||
Queue(nameof(FromName));
|
||||
Queue(nameof(SortingName));
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsFocused) != 0)
|
||||
Queue(nameof(IsFocused));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsRead) != 0)
|
||||
Queue(nameof(IsRead));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsDraft) != 0)
|
||||
Queue(nameof(IsDraft));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.DraftId) != 0)
|
||||
Queue(nameof(DraftId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.Id) != 0)
|
||||
Queue(nameof(Id));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.Subject) != 0)
|
||||
Queue(nameof(Subject));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.PreviewText) != 0)
|
||||
Queue(nameof(PreviewText));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.HasAttachments) != 0)
|
||||
Queue(nameof(HasAttachments));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.ItemType) != 0)
|
||||
Queue(nameof(IsCalendarEvent));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.Importance) != 0)
|
||||
Queue(nameof(Importance));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.ThreadId) != 0)
|
||||
Queue(nameof(ThreadId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.MessageId) != 0)
|
||||
Queue(nameof(MessageId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.References) != 0)
|
||||
Queue(nameof(References));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.InReplyTo) != 0)
|
||||
Queue(nameof(InReplyTo));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FileId) != 0)
|
||||
Queue(nameof(FileId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FolderId) != 0)
|
||||
Queue(nameof(FolderId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.UniqueId) != 0)
|
||||
Queue(nameof(UniqueId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.SenderContact) != 0)
|
||||
{
|
||||
Queue(nameof(Base64ContactPicture));
|
||||
Queue(nameof(SenderContact));
|
||||
}
|
||||
|
||||
foreach (var changedProperty in changedProperties)
|
||||
{
|
||||
OnPropertyChanged(changedProperty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte
|
||||
private readonly string _threadId;
|
||||
private readonly HashSet<Guid> _uniqueIdSet = [];
|
||||
private MailItemViewModel _cachedLatestMailViewModel;
|
||||
private int _suspendChildPropertyNotificationsCount;
|
||||
|
||||
[ObservableProperty]
|
||||
[NotifyPropertyChangedRecipients]
|
||||
@@ -202,6 +203,23 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte
|
||||
_threadId = threadId;
|
||||
}
|
||||
|
||||
internal void SuspendChildPropertyNotifications() => _suspendChildPropertyNotificationsCount++;
|
||||
|
||||
internal void ResumeChildPropertyNotifications()
|
||||
{
|
||||
if (_suspendChildPropertyNotificationsCount > 0)
|
||||
{
|
||||
_suspendChildPropertyNotificationsCount--;
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshLatestMailCache()
|
||||
{
|
||||
_cachedLatestMailViewModel = ThreadEmails
|
||||
.OrderByDescending(static item => item.MailCopy.CreationDate)
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds an email to this thread
|
||||
/// </summary>
|
||||
@@ -225,9 +243,9 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte
|
||||
ThreadEmails.Insert(insertIndex, email);
|
||||
email.PropertyChanged += ThreadEmailPropertyChanged;
|
||||
_uniqueIdSet.Add(email.MailCopy.UniqueId);
|
||||
_cachedLatestMailViewModel = ThreadEmails[0];
|
||||
RefreshLatestMailCache();
|
||||
OnPropertyChanged(nameof(EmailCount));
|
||||
NotifyMailItemUpdated(email);
|
||||
NotifyMailItemUpdated(email, MailCopyChangeFlags.All);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -239,9 +257,9 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte
|
||||
{
|
||||
email.PropertyChanged -= ThreadEmailPropertyChanged;
|
||||
_uniqueIdSet.Remove(email.MailCopy.UniqueId);
|
||||
_cachedLatestMailViewModel = ThreadEmails.Count > 0 ? ThreadEmails[0] : null;
|
||||
RefreshLatestMailCache();
|
||||
OnPropertyChanged(nameof(EmailCount));
|
||||
NotifyMailItemUpdated(email);
|
||||
NotifyMailItemUpdated(email, MailCopyChangeFlags.All);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,51 +274,190 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte
|
||||
|
||||
private void ThreadEmailPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == nameof(MailItemViewModel.IsSelected) || e.PropertyName == nameof(MailItemViewModel.IsDisplayedInThread))
|
||||
if (_suspendChildPropertyNotificationsCount > 0)
|
||||
return;
|
||||
|
||||
if (e.PropertyName == nameof(MailItemViewModel.IsRead))
|
||||
if (sender is not MailItemViewModel updatedMailItem)
|
||||
return;
|
||||
|
||||
if (e.PropertyName == nameof(MailItemViewModel.IsSelected) ||
|
||||
e.PropertyName == nameof(MailItemViewModel.IsDisplayedInThread) ||
|
||||
e.PropertyName == nameof(MailItemViewModel.IsBusy))
|
||||
{
|
||||
OnPropertyChanged(nameof(IsRead));
|
||||
return;
|
||||
}
|
||||
|
||||
NotifyMailItemUpdated(sender as MailItemViewModel);
|
||||
if (e.PropertyName == nameof(MailItemViewModel.ThumbnailUpdatedEvent))
|
||||
{
|
||||
if (ReferenceEquals(updatedMailItem, latestMailViewModel))
|
||||
{
|
||||
OnPropertyChanged(nameof(ThumbnailUpdatedEvent));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var changedFlags = string.IsNullOrEmpty(e.PropertyName)
|
||||
? MailCopyChangeFlags.All
|
||||
: MailItemViewModel.GetChangeFlagsForProperty(e.PropertyName);
|
||||
|
||||
if (changedFlags == MailCopyChangeFlags.None)
|
||||
{
|
||||
NotifyMailItemUpdated(updatedMailItem, MailCopyChangeFlags.All);
|
||||
return;
|
||||
}
|
||||
|
||||
NotifyMailItemUpdated(updatedMailItem, changedFlags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <param name="updatedMailItem">The mail item that was updated (can be null to refresh all).</param>
|
||||
public void NotifyMailItemUpdated(MailItemViewModel updatedMailItem)
|
||||
/// <param name="changedFlags">Set of changed child fields.</param>
|
||||
public void NotifyMailItemUpdated(MailItemViewModel updatedMailItem, MailCopyChangeFlags changedFlags = MailCopyChangeFlags.All)
|
||||
{
|
||||
// Raise PropertyChanged for all computed properties that depend on ThreadEmails contents
|
||||
OnPropertyChanged(nameof(Subject));
|
||||
OnPropertyChanged(nameof(FromName));
|
||||
OnPropertyChanged(nameof(CreationDate));
|
||||
OnPropertyChanged(nameof(FromAddress));
|
||||
OnPropertyChanged(nameof(PreviewText));
|
||||
OnPropertyChanged(nameof(HasAttachments));
|
||||
OnPropertyChanged(nameof(IsCalendarEvent));
|
||||
OnPropertyChanged(nameof(IsFlagged));
|
||||
OnPropertyChanged(nameof(IsFocused));
|
||||
OnPropertyChanged(nameof(IsRead));
|
||||
OnPropertyChanged(nameof(IsDraft));
|
||||
OnPropertyChanged(nameof(DraftId));
|
||||
OnPropertyChanged(nameof(Id));
|
||||
OnPropertyChanged(nameof(Importance));
|
||||
OnPropertyChanged(nameof(ThreadId));
|
||||
OnPropertyChanged(nameof(MessageId));
|
||||
OnPropertyChanged(nameof(References));
|
||||
OnPropertyChanged(nameof(InReplyTo));
|
||||
OnPropertyChanged(nameof(FileId));
|
||||
OnPropertyChanged(nameof(FolderId));
|
||||
OnPropertyChanged(nameof(UniqueId));
|
||||
OnPropertyChanged(nameof(Base64ContactPicture));
|
||||
OnPropertyChanged(nameof(SenderContact));
|
||||
OnPropertyChanged(nameof(ThumbnailUpdatedEvent));
|
||||
OnPropertyChanged(nameof(SortingDate));
|
||||
OnPropertyChanged(nameof(SortingName));
|
||||
if (changedFlags == MailCopyChangeFlags.None)
|
||||
return;
|
||||
|
||||
var previousLatest = latestMailViewModel;
|
||||
|
||||
if (changedFlags == MailCopyChangeFlags.All ||
|
||||
(changedFlags & MailCopyChangeFlags.CreationDate) != 0 ||
|
||||
previousLatest == null ||
|
||||
!ThreadEmails.Contains(previousLatest))
|
||||
{
|
||||
RefreshLatestMailCache();
|
||||
}
|
||||
|
||||
var currentLatest = latestMailViewModel;
|
||||
var latestChanged = !ReferenceEquals(previousLatest, currentLatest);
|
||||
|
||||
var updatesDisplayedLatest = changedFlags == MailCopyChangeFlags.All ||
|
||||
updatedMailItem == null ||
|
||||
latestChanged ||
|
||||
ReferenceEquals(updatedMailItem, previousLatest) ||
|
||||
ReferenceEquals(updatedMailItem, currentLatest);
|
||||
|
||||
var changedProperties = new List<string>(10);
|
||||
|
||||
void Queue(string propertyName)
|
||||
{
|
||||
if (!changedProperties.Contains(propertyName))
|
||||
{
|
||||
changedProperties.Add(propertyName);
|
||||
}
|
||||
}
|
||||
|
||||
if (updatesDisplayedLatest)
|
||||
{
|
||||
if (changedFlags == MailCopyChangeFlags.All || latestChanged)
|
||||
{
|
||||
Queue(nameof(Subject));
|
||||
Queue(nameof(FromName));
|
||||
Queue(nameof(CreationDate));
|
||||
Queue(nameof(FromAddress));
|
||||
Queue(nameof(PreviewText));
|
||||
Queue(nameof(IsFocused));
|
||||
Queue(nameof(DraftId));
|
||||
Queue(nameof(Id));
|
||||
Queue(nameof(Importance));
|
||||
Queue(nameof(ThreadId));
|
||||
Queue(nameof(MessageId));
|
||||
Queue(nameof(References));
|
||||
Queue(nameof(InReplyTo));
|
||||
Queue(nameof(FileId));
|
||||
Queue(nameof(FolderId));
|
||||
Queue(nameof(UniqueId));
|
||||
Queue(nameof(Base64ContactPicture));
|
||||
Queue(nameof(SenderContact));
|
||||
Queue(nameof(ThumbnailUpdatedEvent));
|
||||
Queue(nameof(SortingDate));
|
||||
Queue(nameof(SortingName));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((changedFlags & MailCopyChangeFlags.Subject) != 0)
|
||||
Queue(nameof(Subject));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FromName) != 0)
|
||||
{
|
||||
Queue(nameof(FromName));
|
||||
Queue(nameof(SortingName));
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.CreationDate) != 0)
|
||||
{
|
||||
Queue(nameof(CreationDate));
|
||||
Queue(nameof(SortingDate));
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FromAddress) != 0)
|
||||
Queue(nameof(FromAddress));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.PreviewText) != 0)
|
||||
Queue(nameof(PreviewText));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsFocused) != 0)
|
||||
Queue(nameof(IsFocused));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.DraftId) != 0)
|
||||
Queue(nameof(DraftId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.Id) != 0)
|
||||
Queue(nameof(Id));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.Importance) != 0)
|
||||
Queue(nameof(Importance));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.ThreadId) != 0)
|
||||
Queue(nameof(ThreadId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.MessageId) != 0)
|
||||
Queue(nameof(MessageId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.References) != 0)
|
||||
Queue(nameof(References));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.InReplyTo) != 0)
|
||||
Queue(nameof(InReplyTo));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FileId) != 0)
|
||||
Queue(nameof(FileId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.FolderId) != 0)
|
||||
Queue(nameof(FolderId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.UniqueId) != 0)
|
||||
Queue(nameof(UniqueId));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.SenderContact) != 0)
|
||||
{
|
||||
Queue(nameof(Base64ContactPicture));
|
||||
Queue(nameof(SenderContact));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.HasAttachments) != 0 || changedFlags == MailCopyChangeFlags.All)
|
||||
Queue(nameof(HasAttachments));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.ItemType) != 0 || changedFlags == MailCopyChangeFlags.All)
|
||||
Queue(nameof(IsCalendarEvent));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsFlagged) != 0 || changedFlags == MailCopyChangeFlags.All)
|
||||
Queue(nameof(IsFlagged));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsRead) != 0 || changedFlags == MailCopyChangeFlags.All)
|
||||
Queue(nameof(IsRead));
|
||||
|
||||
if ((changedFlags & MailCopyChangeFlags.IsDraft) != 0 || changedFlags == MailCopyChangeFlags.All)
|
||||
Queue(nameof(IsDraft));
|
||||
|
||||
foreach (var changedProperty in changedProperties)
|
||||
{
|
||||
OnPropertyChanged(changedProperty);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user