From abaab18eb791c997a7f451f5e1a964bd0291e6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Tue, 28 Oct 2025 16:47:06 +0100 Subject: [PATCH] Auto mark as read fix and del keyboard accelerator. --- Wino.Mail.ViewModels/MailListPageViewModel.cs | 19 +++---- Wino.Mail.WinUI/Views/MailListPage.xaml.cs | 52 ++++++++++--------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index ef290739..ab39f8e2 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -326,16 +326,16 @@ public partial class MailListPageViewModel : MailBaseViewModel, if (markAsPreference == MailMarkAsOption.WhenSelected) { - //var operation = MailOperation.MarkAsRead; - //var package = new MailOperationPreperationRequest(operation, _activeMailItem.MailCopy); + var operation = MailOperation.MarkAsRead; + var package = new MailOperationPreperationRequest(operation, _activeMailItem.MailCopy); - //if (ActiveFolder?.SpecialFolderType == SpecialFolderType.Unread && - // !gmailUnreadFolderMarkedAsReadUniqueIds.Contains(_activeMailItem.UniqueId)) - //{ - // gmailUnreadFolderMarkedAsReadUniqueIds.Add(_activeMailItem.UniqueId); - //} + if (ActiveFolder?.SpecialFolderType == SpecialFolderType.Unread && + !gmailUnreadFolderMarkedAsReadUniqueIds.Contains(_activeMailItem.UniqueId)) + { + gmailUnreadFolderMarkedAsReadUniqueIds.Add(_activeMailItem.UniqueId); + } - //await ExecuteMailOperationAsync(package); + await ExecuteMailOperationAsync(package); } else if (markAsPreference == MailMarkAsOption.AfterDelay && PreferencesService.MarkAsDelay >= 0) { @@ -582,6 +582,7 @@ public partial class MailListPageViewModel : MailBaseViewModel, public void RemoveFirst() { var fi = MailCollection.GetFirst(); + if (fi == null) return; Messenger.Send(new MailRemovedMessage(fi.MailCopy)); } @@ -1134,7 +1135,7 @@ public partial class MailListPageViewModel : MailBaseViewModel, // Get mail copies based on the mail item type IEnumerable mailCopies; - + if (message.MailItem is MailItemViewModel singleItem) { mailCopies = new[] { singleItem.MailCopy }; diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs index ed19cc04..355c2177 100644 --- a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs @@ -14,6 +14,7 @@ using Microsoft.UI.Xaml.Navigation; using MoreLinq; using Windows.Foundation; using Windows.System; +using Wino.Controls; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; @@ -163,33 +164,26 @@ public sealed partial class MailListPage : MailListPageAbstract, args.IsContainerPrepared = false; } - - private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args) { - // TODO: New ItemsView implementation. - // Context is requested from a single mail point, but we might have multiple selected items. // This menu should be calculated based on all selected items by providers. - //if (sender is MailItemDisplayInformationControl control && args.TryGetPosition(sender, out Point p)) - //{ - // if (control.DataContext is MailItemViewModel clickedMailItemContext) - // { - // var targetItems = ViewModel.MailCollection.AllItems.Where(a => a.IsSelected); - // var availableActions = ViewModel.GetAvailableMailActions(targetItems); + if (sender is MailItemDisplayInformationControl control && args.TryGetPosition(sender, out Point p)) + { + var targetItems = ViewModel.MailCollection.SelectedItems; + var availableActions = ViewModel.GetAvailableMailActions(targetItems); - // if (!availableActions?.Any() ?? false) return; + if (!availableActions?.Any() ?? false) return; - // var clickedOperation = await GetMailOperationFromFlyoutAsync(availableActions, control, p.X, p.Y); + var clickedOperation = await GetMailOperationFromFlyoutAsync(availableActions, control, p.X, p.Y); - // if (clickedOperation == null) return; + if (clickedOperation == null) return; - // var prepRequest = new MailOperationPreperationRequest(clickedOperation.Operation, targetItems.Select(a => a.MailCopy)); + var prepRequest = new MailOperationPreperationRequest(clickedOperation.Operation, targetItems.Select(a => a.MailCopy)); - // await ViewModel.ExecuteMailOperationAsync(prepRequest); - // } - //} + await ViewModel.ExecuteMailOperationAsync(prepRequest); + } } private async Task GetMailOperationFromFlyoutAsync(IEnumerable availableActions, @@ -210,9 +204,9 @@ public sealed partial class MailListPage : MailListPageAbstract, return await source.Task; } - void IRecipient.Receive(ClearMailSelectionsRequested message) + async void IRecipient.Receive(ClearMailSelectionsRequested message) { - // MailListView.ClearSelections(null, preserveThreadExpanding: true); + await ViewModel.MailCollection.UnselectAllAsync(); } void IRecipient.Receive(ActiveMailItemChangedEvent message) @@ -465,6 +459,7 @@ public sealed partial class MailListPage : MailListPageAbstract, public void Receive(DisposeRenderingFrameRequested message) { ViewModel.NavigationService.Navigate(WinoPage.IdlePage, null, NavigationReferenceFrame.RenderingFrame, NavigationTransitionType.DrillIn); + UpdateAdaptiveness(); } protected override void RegisterRecipients() @@ -525,8 +520,7 @@ public sealed partial class MailListPage : MailListPageAbstract, } } - private void DeleteAllInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args) - => ViewModel.ExecuteMailOperationCommand.Execute(MailOperation.SoftDelete); + private void WinoMailCollectionSelectionChanged(object? sender, EventArgs args) { @@ -536,14 +530,14 @@ public sealed partial class MailListPage : MailListPageAbstract, private async void WinoListViewProcessKeyboardAccelerators(UIElement sender, ProcessKeyboardAcceleratorEventArgs args) { + args.Handled = true; + if (args.Key == VirtualKey.Delete) { - + ViewModel.ExecuteMailOperationCommand.Execute(MailOperation.SoftDelete); } - else + else if (args.Key == VirtualKey.A && args.Modifiers.HasFlag(VirtualKeyModifiers.Control)) { - args.Handled = true; - await ViewModel.MailCollection.ToggleSelectAllAsync(); } } @@ -627,6 +621,14 @@ public sealed partial class MailListPage : MailListPageAbstract, { // No Ctrl pressed, toggle expansion state (default behavior) threadMailItemViewModel.IsThreadExpanded = !threadMailItemViewModel.IsThreadExpanded; + + // Select the first item in the thread if none is selected + if (!threadMailItemViewModel.IsSelected) + { + threadMailItemViewModel.IsSelected = true; + var firstEmail = threadMailItemViewModel.ThreadEmails.FirstOrDefault(); + firstEmail?.IsSelected = true; + } } } }