1111using System . Windows . Input ;
1212using Windows . Storage ;
1313
14- // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
15-
1614namespace Files . App . UserControls . Widgets
1715{
1816 public sealed partial class FileTagsWidget : HomePageWidget , IWidgetItem
1917 {
2018 private readonly IUserSettingsService userSettingsService ;
19+ private IHomePageContext HomePageContext { get ; } = Ioc . Default . GetRequiredService < IHomePageContext > ( ) ;
2120
2221 public FileTagsWidgetViewModel ViewModel
2322 {
@@ -32,6 +31,7 @@ public FileTagsWidgetViewModel ViewModel
3231 public delegate void FileTagsOpenLocationInvokedEventHandler ( object sender , PathNavigationEventArgs e ) ;
3332 public delegate void FileTagsNewPaneInvokedEventHandler ( object sender , QuickAccessCardInvokedEventArgs e ) ;
3433
34+ public static event EventHandler < IEnumerable < FileTagsItemViewModel > > ? SelectedTaggedItemsChanged ;
3535 public event FileTagsOpenLocationInvokedEventHandler FileTagsOpenLocationInvoked ;
3636 public event FileTagsNewPaneInvokedEventHandler FileTagsNewPaneInvoked ;
3737
@@ -69,10 +69,14 @@ public FileTagsWidget()
6969
7070 private void OpenProperties ( WidgetCardItem ? item )
7171 {
72+ if ( ! HomePageContext . IsAnyItemRightClicked )
73+ return ;
74+
7275 EventHandler < object > flyoutClosed = null ! ;
7376 flyoutClosed = ( s , e ) =>
7477 {
75- ItemContextMenuFlyout . Closed -= flyoutClosed ;
78+ HomePageContext . ItemContextFlyoutMenu ! . Closed -= flyoutClosed ;
79+
7680 ListedItem listedItem = new ( null ! )
7781 {
7882 ItemPath = ( item . Item as FileTagsItemViewModel ) ? . Path ?? string . Empty ,
@@ -82,7 +86,8 @@ private void OpenProperties(WidgetCardItem? item)
8286 } ;
8387 FilePropertiesHelpers . OpenPropertiesWindow ( listedItem , AppInstance ) ;
8488 } ;
85- ItemContextMenuFlyout . Closed += flyoutClosed ;
89+
90+ HomePageContext . ItemContextFlyoutMenu ! . Closed += flyoutClosed ;
8691 }
8792
8893 private void OpenInNewPane ( WidgetCardItem ? item )
@@ -101,50 +106,45 @@ private async void FileTagItem_ItemClick(object sender, ItemClickEventArgs e)
101106
102107 private void AdaptiveGridView_RightTapped ( object sender , RightTappedRoutedEventArgs e )
103108 {
109+ // Ensure values are not null
104110 if ( e . OriginalSource is not FrameworkElement element ||
105111 element . DataContext is not FileTagsItemViewModel item )
106- {
107112 return ;
108- }
109113
110- LoadContextMenu (
111- element ,
112- e ,
113- GetItemMenuItems ( item , QuickAccessService . IsItemPinned ( item . Path ) , item . IsFolder ) ,
114- rightClickedItem : item ) ;
115- }
114+ // Create a new Flyout
115+ var itemContextMenuFlyout = new CommandBarFlyout ( )
116+ {
117+ Placement = FlyoutPlacementMode . Full
118+ } ;
116119
117- private void LoadContextMenu (
118- FrameworkElement element ,
119- RightTappedRoutedEventArgs e ,
120- List < ContextMenuFlyoutItemViewModel > menuItems ,
121- FileTagsItemViewModel ? rightClickedItem = null )
122- {
123- var itemContextMenuFlyout = new CommandBarFlyout { Placement = FlyoutPlacementMode . Full } ;
120+ // Hook events
124121 itemContextMenuFlyout . Opening += ( sender , e ) => App . LastOpenedFlyout = sender as CommandBarFlyout ;
122+ itemContextMenuFlyout . Opened += ( sender , e ) => OnRightClickedItemChanged ( null , null ) ;
123+
124+ FlyoutItemPath = item . Path ;
125+
126+ // Notify of the change on right clicked item
127+ OnRightClickedItemChanged ( item , itemContextMenuFlyout ) ;
125128
129+ // Get items for the flyout
130+ var menuItems = GetItemMenuItems ( item , QuickAccessService . IsItemPinned ( item . Path ) , item . IsFolder ) ;
126131 var ( _, secondaryElements ) = ItemModelListToContextFlyoutHelper . GetAppBarItemsFromModel ( menuItems ) ;
127132
128- if ( ! UserSettingsService . GeneralSettingsService . MoveShellExtensionsToSubMenu )
129- secondaryElements . OfType < FrameworkElement > ( )
130- . ForEach ( i => i . MinWidth = Constants . UI . ContextMenuItemsMaxWidth ) ; // Set menu min width if the overflow menu setting is disabled
133+ // Set max width of the flyout
134+ secondaryElements
135+ . OfType < FrameworkElement > ( )
136+ . ForEach ( i => i . MinWidth = Constants . UI . ContextMenuItemsMaxWidth ) ;
131137
132- secondaryElements . ForEach ( i => itemContextMenuFlyout . SecondaryCommands . Add ( i ) ) ;
133- ItemContextMenuFlyout = itemContextMenuFlyout ;
134- if ( rightClickedItem is not null )
135- {
136- FlyouItemPath = rightClickedItem . Path ;
137- ItemContextMenuFlyout . Opened += ItemContextMenuFlyout_Opened ;
138- }
139- itemContextMenuFlyout . ShowAt ( element , new FlyoutShowOptions { Position = e . GetPosition ( element ) } ) ;
138+ // Add menu items to the secondary flyout
139+ secondaryElements . ForEach ( itemContextMenuFlyout . SecondaryCommands . Add ) ;
140140
141- e . Handled = true ;
142- }
141+ // Show the flyout
142+ itemContextMenuFlyout . ShowAt ( element , new ( ) { Position = e . GetPosition ( element ) } ) ;
143143
144- private async void ItemContextMenuFlyout_Opened ( object ? sender , object e )
145- {
146- ItemContextMenuFlyout . Opened -= ItemContextMenuFlyout_Opened ;
147- await ShellContextmenuHelper . LoadShellMenuItemsAsync ( FlyouItemPath , ItemContextMenuFlyout , showOpenWithMenu : true , showSendToMenu : true ) ;
144+ // Load shell menu items
145+ _ = ShellContextmenuHelper . LoadShellMenuItemsAsync ( FlyoutItemPath , itemContextMenuFlyout ) ;
146+
147+ e . Handled = true ;
148148 }
149149
150150 public override List < ContextMenuFlyoutItemViewModel > GetItemMenuItems ( WidgetCardItem item , bool isPinned , bool isFolder = false )
0 commit comments