From c2e6c68f50315653eef8a2e6aed563f7798857ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Wed, 29 Oct 2025 17:02:58 +0100 Subject: [PATCH] Fixing modiufiers. --- .../Data/KeyboardShortcutViewModel.cs | 24 ++++---- .../Data/ThreadMailItemViewModel.cs | 3 +- .../Extensions/ModifierKeysExtensions.cs | 58 +++++++++++++++++++ Wino.Mail.WinUI/Views/MailListPage.xaml.cs | 19 +++++- 4 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 Wino.Mail.WinUI/Extensions/ModifierKeysExtensions.cs diff --git a/Wino.Core.ViewModels/Data/KeyboardShortcutViewModel.cs b/Wino.Core.ViewModels/Data/KeyboardShortcutViewModel.cs index 8c7b6e09..bd482b11 100644 --- a/Wino.Core.ViewModels/Data/KeyboardShortcutViewModel.cs +++ b/Wino.Core.ViewModels/Data/KeyboardShortcutViewModel.cs @@ -44,18 +44,18 @@ public partial class KeyboardShortcutViewModel : ObservableObject { return MailOperation switch { - MailOperation.Archive => "Archive", - MailOperation.UnArchive => "Unarchive", - MailOperation.SoftDelete => "Delete", - MailOperation.Move => "Move", - MailOperation.MoveToJunk => "Move to Junk", - MailOperation.SetFlag => "Set Flag", - MailOperation.ClearFlag => "Clear Flag", - MailOperation.MarkAsRead => "Mark as Read", - MailOperation.MarkAsUnread => "Mark as Unread", - MailOperation.Reply => "Reply", - MailOperation.ReplyAll => "Reply All", - MailOperation.Forward => "Forward", + MailOperation.Archive => Translator.MailOperation_Archive, + MailOperation.UnArchive => Translator.MailOperation_Unarchive, + MailOperation.SoftDelete => Translator.MailOperation_Delete, + MailOperation.Move => Translator.MailOperation_Move, + MailOperation.MoveToJunk => Translator.MailOperation_MoveJunk, + MailOperation.SetFlag => Translator.MailOperation_SetFlag, + MailOperation.ClearFlag => Translator.MailOperation_ClearFlag, + MailOperation.MarkAsRead => Translator.MailOperation_MarkAsRead, + MailOperation.MarkAsUnread => Translator.MailOperation_MarkAsUnread, + MailOperation.Reply => Translator.MailOperation_Reply, + MailOperation.ReplyAll => Translator.MailOperation_ReplyAll, + MailOperation.Forward => Translator.MailOperation_Forward, _ => MailOperation.ToString() }; } diff --git a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs index 736f4771..d9d8e91a 100644 --- a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs +++ b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; +using Wino.Core.Domain; using Wino.Core.Domain.Enums; namespace Wino.Mail.ViewModels.Data; @@ -39,7 +40,7 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte /// /// Gets the latest email's sender name for display /// - public string FromName => latestMailViewModel?.MailCopy?.SenderContact.Name; + public string FromName => latestMailViewModel?.MailCopy?.SenderContact?.Name ?? Translator.UnknownSender; /// /// Gets the latest email's creation date for sorting diff --git a/Wino.Mail.WinUI/Extensions/ModifierKeysExtensions.cs b/Wino.Mail.WinUI/Extensions/ModifierKeysExtensions.cs new file mode 100644 index 00000000..ad69e9a7 --- /dev/null +++ b/Wino.Mail.WinUI/Extensions/ModifierKeysExtensions.cs @@ -0,0 +1,58 @@ +using Windows.System; +using Wino.Core.Domain.Enums; + +namespace Wino.Mail.WinUI.Extensions; + +/// +/// Extension methods for converting between Windows VirtualKeyModifiers and Domain ModifierKeys. +/// +public static class ModifierKeysExtensions +{ + /// + /// Converts Windows VirtualKeyModifiers to Domain ModifierKeys. + /// + /// The Windows VirtualKeyModifiers to convert. + /// The equivalent Domain ModifierKeys. + public static ModifierKeys ToDomainModifierKeys(this VirtualKeyModifiers virtualKeyModifiers) + { + var modifierKeys = ModifierKeys.None; + + if (virtualKeyModifiers.HasFlag(VirtualKeyModifiers.Control)) + modifierKeys |= ModifierKeys.Control; + + if (virtualKeyModifiers.HasFlag(VirtualKeyModifiers.Menu)) // Alt key + modifierKeys |= ModifierKeys.Alt; + + if (virtualKeyModifiers.HasFlag(VirtualKeyModifiers.Shift)) + modifierKeys |= ModifierKeys.Shift; + + if (virtualKeyModifiers.HasFlag(VirtualKeyModifiers.Windows)) + modifierKeys |= ModifierKeys.Windows; + + return modifierKeys; + } + + /// + /// Converts Domain ModifierKeys to Windows VirtualKeyModifiers. + /// + /// The Domain ModifierKeys to convert. + /// The equivalent Windows VirtualKeyModifiers. + public static VirtualKeyModifiers ToVirtualKeyModifiers(this ModifierKeys modifierKeys) + { + var virtualKeyModifiers = VirtualKeyModifiers.None; + + if (modifierKeys.HasFlag(ModifierKeys.Control)) + virtualKeyModifiers |= VirtualKeyModifiers.Control; + + if (modifierKeys.HasFlag(ModifierKeys.Alt)) + virtualKeyModifiers |= VirtualKeyModifiers.Menu; // Alt key + + if (modifierKeys.HasFlag(ModifierKeys.Shift)) + virtualKeyModifiers |= VirtualKeyModifiers.Shift; + + if (modifierKeys.HasFlag(ModifierKeys.Windows)) + virtualKeyModifiers |= VirtualKeyModifiers.Windows; + + return virtualKeyModifiers; + } +} \ No newline at end of file diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs index 355c2177..a7e33659 100644 --- a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs @@ -24,6 +24,7 @@ using Wino.Core.Domain.Models.Navigation; using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Messages; using Wino.Mail.WinUI.Controls.ListView; +using Wino.Mail.WinUI.Extensions; using Wino.MenuFlyouts.Context; using Wino.Messaging.Client.Mails; using Wino.Views.Abstract; @@ -40,7 +41,7 @@ public sealed partial class MailListPage : MailListPageAbstract, private IStatePersistanceService StatePersistenceService { get; } = Core.WinUI.WinoApplication.Current.Services.GetService() ?? throw new Exception($"Can't resolve {nameof(KeyPressService)}"); private IKeyPressService KeyPressService { get; } = Core.WinUI.WinoApplication.Current.Services.GetService() ?? throw new Exception($"Can't resolve {nameof(KeyPressService)}"); - + private IKeyboardShortcutService KeyboardShortcutService { get; } = Core.WinUI.WinoApplication.Current.Services.GetService() ?? throw new Exception($"Can't resolve {nameof(IKeyboardShortcutService)}"); public MailListPage() { InitializeComponent(); @@ -540,6 +541,22 @@ public sealed partial class MailListPage : MailListPageAbstract, { await ViewModel.MailCollection.ToggleSelectAllAsync(); } + else + { + // Check keyboard shortcuts from service. + ModifierKeys modifiers = args.Modifiers.ToDomainModifierKeys(); + + var operation = await KeyboardShortcutService.GetMailOperationForKeyAsync(args.Key.ToString(), modifiers); + + if (operation != null) + { + ViewModel.ExecuteMailOperationCommand.Execute(operation); + } + else + { + args.Handled = false; + } + } } private async void WinoListViewItemClicked(object sender, ItemClickEventArgs e)