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)