File: Platform\iOS\KeyboardAcceleratorExtensions.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using Foundation;
using ObjCRuntime;
using UIKit;
 
namespace Microsoft.Maui.Platform
{
	internal static class KeyboardAcceleratorExtensions
	{
		internal const string MenuItemSelectedSelector = "MenuItemSelected:";
 
		internal static UIMenuElement CreateMenuItem(this IMenuFlyoutItem virtualView, IMauiContext mauiContext)
		{
			var index = MenuFlyoutItemHandler.menus.Count;
			var uiImage = virtualView.Source.GetPlatformMenuImage(mauiContext);
			var selector = new Selector(MenuItemSelectedSelector);
 
			var accelerators = virtualView.KeyboardAccelerators;
			if (accelerators is null || accelerators.Count == 0 || accelerators[0] is null || accelerators[0].Key is null)
				return virtualView.CreateMenuItemCommand(index, uiImage, selector);
 
			var key = accelerators[0].Key;
			if (key is null)
				return virtualView.CreateMenuItemCommand(index, uiImage, selector);
 
			var modifiers = accelerators[0].Modifiers.ToUIKeyModifierFlags();
 
			// Single key accelerators (no modifier, i.e. "A") and multi-key accelerators are supported (>=1 modifier and 1 key only, i.e. Ctrl+F, Ctrl+Shift+F)
			return virtualView.CreateMenuItemKeyCommand(index, uiImage, selector, modifiers, key);
		}
 
		internal static UIKeyModifierFlags ToUIKeyModifierFlags(this KeyboardAcceleratorModifiers modifiers)
		{
			UIKeyModifierFlags modifierFlags = 0;
 
			if (modifiers.HasFlag(KeyboardAcceleratorModifiers.Shift))
				modifierFlags |= UIKeyModifierFlags.Shift;
			if (modifiers.HasFlag(KeyboardAcceleratorModifiers.Ctrl))
				modifierFlags |= UIKeyModifierFlags.Control;
			if (modifiers.HasFlag(KeyboardAcceleratorModifiers.Alt))
				modifierFlags |= UIKeyModifierFlags.Alternate;
			if (modifiers.HasFlag(KeyboardAcceleratorModifiers.Cmd))
				modifierFlags |= UIKeyModifierFlags.Command;
 
			return modifierFlags;
		}
 
		static UIKeyCommand CreateMenuItemKeyCommand(this IMenuFlyoutItem virtualView, int index, UIImage? uiImage, Selector selector, UIKeyModifierFlags modifierFlags, string key)
		{
			var keyCommand = UIKeyCommand.Create(
				title: virtualView.Text,
				uiImage,
				selector,
				key,
				modifierFlags,
				new NSString(index.ToString()));
 
			MenuFlyoutItemHandler.menus[index] = virtualView;
 
			return keyCommand;
		}
 
		static UICommand CreateMenuItemCommand(this IMenuFlyoutItem virtualView, int index, UIImage? uiImage, Selector selector)
		{
			var command = UICommand.Create(
				title: virtualView.Text,
				uiImage,
				selector,
				new NSString(index.ToString()));
 
			MenuFlyoutItemHandler.menus[index] = virtualView;
 
			return command;
		}
	}
}