diff --git a/Files.Launcher/MessageHandlers/ContextMenuHandler.cs b/Files.Launcher/MessageHandlers/ContextMenuHandler.cs index 7c9d97cad3ac..60b03bdeb7b9 100644 --- a/Files.Launcher/MessageHandlers/ContextMenuHandler.cs +++ b/Files.Launcher/MessageHandlers/ContextMenuHandler.cs @@ -124,7 +124,7 @@ private Func FilterMenuItems(bool showOpenMenu) { var knownItems = new List() { - "opennew", "openas", "opencontaining", "opennewprocess", + "opennew", "opencontaining", "opennewprocess", "runas", "runasuser", "pintohome", "PinToStartScreen", "cut", "copy", "paste", "delete", "properties", "link", "Windows.ModernShare", "Windows.Share", "setdesktopwallpaper", diff --git a/Files/BaseLayout.cs b/Files/BaseLayout.cs index a38b9216b28b..8269eac09daa 100644 --- a/Files/BaseLayout.cs +++ b/Files/BaseLayout.cs @@ -612,6 +612,7 @@ private async Task LoadMenuItemsAsync() private void AddShellItemsToMenu(List shellMenuItems, Microsoft.UI.Xaml.Controls.CommandBarFlyout contextMenuFlyout, bool shiftPressed) { + var openWithSubItems = ItemModelListToContextFlyoutHelper.GetMenuFlyoutItemsFromModel(ShellContextmenuHelper.GetOpenWithItems(shellMenuItems)); var mainShellMenuItems = shellMenuItems.RemoveFrom(!App.AppSettings.MoveOverflowMenuItemsToSubMenu ? int.MaxValue : shiftPressed ? 6 : 4); var overflowShellMenuItems = shellMenuItems.Except(mainShellMenuItems).ToList(); @@ -649,6 +650,22 @@ private void AddShellItemsToMenu(List shellMenuI overflowItem.Visibility = Visibility.Visible; } } + + // add items to openwith dropdown + var openWithOverflow = contextMenuFlyout.SecondaryCommands.FirstOrDefault(x => x is AppBarButton abb && (abb.Tag as string) == "OpenWithOverflow") as AppBarButton; + if (openWithSubItems is not null && openWithOverflow is not null) + { + var openWith = contextMenuFlyout.SecondaryCommands.FirstOrDefault(x => x is AppBarButton abb && (abb.Tag as string) == "OpenWith") as AppBarButton; + var flyout = new MenuFlyout(); + foreach (var item in openWithSubItems) + { + flyout.Items.Add(item); + } + + openWithOverflow.Flyout = flyout; + openWith.Visibility = Visibility.Collapsed; + openWithOverflow.Visibility = Visibility.Visible; + } } protected virtual void Page_CharacterReceived(CoreWindow sender, CharacterReceivedEventArgs args) diff --git a/Files/Helpers/ContextFlyoutItemHelper.cs b/Files/Helpers/ContextFlyoutItemHelper.cs index 97038ade4c4f..0d2914987f04 100644 --- a/Files/Helpers/ContextFlyoutItemHelper.cs +++ b/Files/Helpers/ContextFlyoutItemHelper.cs @@ -60,7 +60,7 @@ public static async Task> GetBaseContextShe public static List Filter(List items, List selectedItems, bool shiftPressed, CurrentInstanceViewModel currentInstanceViewModel, bool removeOverflowMenu = true) { items = items.Where(x => Check(item: x, currentInstanceViewModel: currentInstanceViewModel, selectedItems: selectedItems, shiftPressed: shiftPressed)).ToList(); - items.ForEach(x => x.Items = x.Items.Where(y => Check(item: y, currentInstanceViewModel: currentInstanceViewModel, selectedItems: selectedItems, shiftPressed: shiftPressed)).ToList()); + items.ForEach(x => x.Items = x.Items?.Where(y => Check(item: y, currentInstanceViewModel: currentInstanceViewModel, selectedItems: selectedItems, shiftPressed: shiftPressed)).ToList()); var overflow = items.Where(x => x.ID == "ItemOverflow").FirstOrDefault(); if (overflow != null) @@ -478,6 +478,7 @@ public static List GetBaseLayoutMenuItems(Curren { Text = "ContextMenuMoreItemsLabel".GetLocalized(), Glyph = "\xE712", + Items = new List(), ID = "ItemOverflow", Tag = "ItemOverflow", IsHidden = true, @@ -509,10 +510,21 @@ public static List GetBaseItemMenuItems(BaseLayo Text = "BaseLayoutItemContextFlyoutOpenItemWith/Text".GetLocalized(), Glyph = "\uE17D", Command = commandsViewModel.OpenItemWithApplicationPickerCommand, + Tag = "OpenWith", CollapseLabel = true, ShowItem = selectedItems.All(i => i.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.File && !i.IsShortcutItem), }, new ContextMenuFlyoutItemViewModel() + { + Text = "BaseLayoutItemContextFlyoutOpenItemWith/Text".GetLocalized(), + Glyph = "\uE17D", + Tag = "OpenWithOverflow", + IsHidden = true, + CollapseLabel = true, + Items = new List(), + ShowItem = selectedItems.All(i => i.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.File && !i.IsShortcutItem), + }, + new ContextMenuFlyoutItemViewModel() { Text = "BaseLayoutItemContextFlyoutOpenFileLocation/Text".GetLocalized(), Glyph = "\uE8DA", @@ -804,6 +816,7 @@ public static List GetBaseItemMenuItems(BaseLayo { Text = "ContextMenuMoreItemsLabel".GetLocalized(), Glyph = "\xE712", + Items = new List(), ID = "ItemOverflow", Tag = "ItemOverflow", IsHidden = true, diff --git a/Files/Helpers/ItemModelListToContextFlyoutHelper.cs b/Files/Helpers/ItemModelListToContextFlyoutHelper.cs index e595f84077d5..0acb46055b7b 100644 --- a/Files/Helpers/ItemModelListToContextFlyoutHelper.cs +++ b/Files/Helpers/ItemModelListToContextFlyoutHelper.cs @@ -14,6 +14,11 @@ public static class ItemModelListToContextFlyoutHelper { public static List GetMenuFlyoutItemsFromModel(List items) { + if(items is null) + { + return null; + } + var flyout = new List(); items.ForEach(i => { @@ -70,7 +75,7 @@ private static MenuFlyoutItemBase GetMenuFlyoutItem(ContextMenuFlyoutItemViewMod Text = item.Text, Tag = item.Tag, }; - item.Items.ForEach(i => + item.Items?.ForEach(i => { flyoutSubItem.Items.Add(GetMenuItem(i)); }); @@ -153,7 +158,7 @@ private static MenuFlyoutItemBase GetItem(ContextMenuFlyoutItemViewModel i) return flyoutItem; } - private static ICommandBarElement GetCommandBarItem(ContextMenuFlyoutItemViewModel item) + public static ICommandBarElement GetCommandBarItem(ContextMenuFlyoutItemViewModel item) { return item.ItemType switch { @@ -185,7 +190,7 @@ private static ICommandBarElement GetCommandBarButton(ContextMenuFlyoutItemViewM } MenuFlyout ctxFlyout = null; - if (item.Items.Count > 0 || item.ID == "ItemOverflow") + if ((item.Items is not null && item.Items.Count > 0) || item.ID == "ItemOverflow") { ctxFlyout = new MenuFlyout(); GetMenuFlyoutItemsFromModel(item.Items).ForEach(i => ctxFlyout.Items.Add(i)); diff --git a/Files/Helpers/ShellContextMenuHelper.cs b/Files/Helpers/ShellContextMenuHelper.cs index 7051beb9393e..d5b51b6e5fde 100644 --- a/Files/Helpers/ShellContextMenuHelper.cs +++ b/Files/Helpers/ShellContextMenuHelper.cs @@ -117,6 +117,7 @@ public static void LoadMenuFlyoutItem(IList menu { Text = menuFlyoutItem.Label.Replace("&", ""), Tag = (menuFlyoutItem, menuHandle), + Items = new List(), }; LoadMenuFlyoutItem(menuLayoutSubItem.Items, menuFlyoutItem.SubItems, menuHandle, showIcons); menuItemsListLocal.Insert(0, menuLayoutSubItem); @@ -162,5 +163,12 @@ await connection.SendMessageAsync(new ValueSet() return (null, null); } } + + public static List GetOpenWithItems(List flyout) + { + var item = flyout.FirstOrDefault(x => x.Tag is ValueTuple vt && vt.Item1.CommandString == "openas"); + flyout.Remove(item); + return item?.Items; + } } } \ No newline at end of file diff --git a/Files/ViewModels/ContextMenuFlyoutItemViewModel.cs b/Files/ViewModels/ContextMenuFlyoutItemViewModel.cs index efb0eaf0ea83..3dc08a977e61 100644 --- a/Files/ViewModels/ContextMenuFlyoutItemViewModel.cs +++ b/Files/ViewModels/ContextMenuFlyoutItemViewModel.cs @@ -18,7 +18,7 @@ public class ContextMenuFlyoutItemViewModel public object Tag { get; set; } public ItemType ItemType { get; set; } public bool IsSubItem { get; set; } - public List Items { get; set; } = new List(); + public List Items { get; set; } public BitmapImage BitmapIcon { get; set; } ///