/ src / modules / cmdpal / Microsoft.CmdPal.UI / Controls / ContextMenu.xaml
ContextMenu.xaml
  1  <?xml version="1.0" encoding="utf-8" ?>
  2  <UserControl
  3      x:Class="Microsoft.CmdPal.UI.Controls.ContextMenu"
  4      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  5      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  6      xmlns:animations="using:CommunityToolkit.WinUI.Animations"
  7      xmlns:cmdpalUI="using:Microsoft.CmdPal.UI"
  8      xmlns:converters="using:CommunityToolkit.WinUI.Converters"
  9      xmlns:coreViewModels="using:Microsoft.CmdPal.Core.ViewModels"
 10      xmlns:cpcontrols="using:Microsoft.CmdPal.UI.Controls"
 11      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 12      xmlns:help="using:Microsoft.CmdPal.UI.Helpers"
 13      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 14      xmlns:toolkit="using:CommunityToolkit.WinUI.Controls"
 15      xmlns:ui="using:CommunityToolkit.WinUI"
 16      xmlns:viewModels="using:Microsoft.CmdPal.UI.ViewModels"
 17      PreviewKeyDown="UserControl_PreviewKeyDown"
 18      mc:Ignorable="d">
 19  
 20      <UserControl.Resources>
 21          <ResourceDictionary>
 22              <cmdpalUI:KeyChordToStringConverter x:Key="KeyChordToStringConverter" />
 23              <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
 24              <Thickness x:Key="DefaultContextMenuItemPadding">12,8,12,8</Thickness>
 25              <cmdpalUI:ContextItemTemplateSelector
 26                  x:Key="ContextItemTemplateSelector"
 27                  Critical="{StaticResource CriticalContextMenuViewModelTemplate}"
 28                  Default="{StaticResource DefaultContextMenuViewModelTemplate}"
 29                  Separator="{StaticResource SeparatorContextMenuViewModelTemplate}" />
 30  
 31              <!--  Template for context items in the context item menu  -->
 32              <DataTemplate x:Key="DefaultContextMenuViewModelTemplate" x:DataType="coreViewModels:CommandContextItemViewModel">
 33                  <Grid Padding="{StaticResource DefaultContextMenuItemPadding}" AutomationProperties.Name="{x:Bind Title, Mode=OneWay}">
 34                      <Grid.ColumnDefinitions>
 35                          <ColumnDefinition Width="32" />
 36                          <ColumnDefinition Width="*" />
 37                          <ColumnDefinition Width="Auto" />
 38                      </Grid.ColumnDefinitions>
 39                      <cpcontrols:IconBox
 40                          Width="16"
 41                          Height="16"
 42                          Margin="4,0,0,0"
 43                          HorizontalAlignment="Left"
 44                          SourceKey="{x:Bind Icon, Mode=OneWay}"
 45                          SourceRequested="{x:Bind help:IconCacheProvider.SourceRequested20}" />
 46                      <TextBlock
 47                          x:Name="TitleTextBlock"
 48                          Grid.Column="1"
 49                          MaxWidth="200"
 50                          HorizontalAlignment="Left"
 51                          VerticalAlignment="Center"
 52                          MaxLines="1"
 53                          Text="{x:Bind Title, Mode=OneWay}"
 54                          TextTrimming="WordEllipsis"
 55                          TextWrapping="NoWrap">
 56                          <ToolTipService.ToolTip>
 57                              <ToolTip Content="{x:Bind Title, Mode=OneWay}" Visibility="{Binding IsTextTrimmed, ElementName=TitleTextBlock, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
 58                          </ToolTipService.ToolTip>
 59                      </TextBlock>
 60                      <TextBlock
 61                          Grid.Column="2"
 62                          Margin="16,0,0,0"
 63                          HorizontalAlignment="Right"
 64                          VerticalAlignment="Center"
 65                          Foreground="{ThemeResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"
 66                          Style="{StaticResource CaptionTextBlockStyle}"
 67                          Text="{x:Bind RequestedShortcut, Mode=OneWay, Converter={StaticResource KeyChordToStringConverter}}" />
 68                  </Grid>
 69              </DataTemplate>
 70  
 71              <!--  Template for context items flagged as critical  -->
 72              <DataTemplate x:Key="CriticalContextMenuViewModelTemplate" x:DataType="coreViewModels:CommandContextItemViewModel">
 73                  <Grid Padding="{StaticResource DefaultContextMenuItemPadding}" AutomationProperties.Name="{x:Bind Title, Mode=OneWay}">
 74                      <Grid.ColumnDefinitions>
 75                          <ColumnDefinition Width="32" />
 76                          <ColumnDefinition Width="*" />
 77                          <ColumnDefinition Width="Auto" />
 78                      </Grid.ColumnDefinitions>
 79                      <cpcontrols:IconBox
 80                          Width="16"
 81                          Height="16"
 82                          Margin="4,0,0,0"
 83                          HorizontalAlignment="Left"
 84                          Foreground="{ThemeResource SystemFillColorCriticalBrush}"
 85                          SourceKey="{x:Bind Icon, Mode=OneWay}"
 86                          SourceRequested="{x:Bind help:IconCacheProvider.SourceRequested20}" />
 87                      <TextBlock
 88                          x:Name="TitleTextBlock"
 89                          Grid.Column="1"
 90                          MaxWidth="200"
 91                          HorizontalAlignment="Left"
 92                          VerticalAlignment="Center"
 93                          MaxLines="1"
 94                          Style="{StaticResource ContextItemTitleTextBlockCriticalStyle}"
 95                          Text="{x:Bind Title, Mode=OneWay}"
 96                          TextTrimming="WordEllipsis"
 97                          TextWrapping="NoWrap">
 98                          <ToolTipService.ToolTip>
 99                              <ToolTip Content="{x:Bind Title, Mode=OneWay}" Visibility="{Binding IsTextTrimmed, ElementName=TitleTextBlock, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" />
100                          </ToolTipService.ToolTip>
101                      </TextBlock>
102                      <TextBlock
103                          Grid.Column="2"
104                          Margin="16,0,0,0"
105                          HorizontalAlignment="Right"
106                          VerticalAlignment="Center"
107                          Style="{StaticResource ContextItemCaptionTextBlockCriticalStyle}"
108                          Text="{x:Bind RequestedShortcut, Mode=OneWay, Converter={StaticResource KeyChordToStringConverter}}" />
109                  </Grid>
110              </DataTemplate>
111  
112              <!--  Template for context item separators  -->
113              <DataTemplate x:Key="SeparatorContextMenuViewModelTemplate" x:DataType="coreViewModels:SeparatorViewModel">
114                  <Rectangle
115                      Height="1"
116                      Margin="0,2,0,2"
117                      Fill="{ThemeResource MenuFlyoutSeparatorBackground}" />
118              </DataTemplate>
119          </ResourceDictionary>
120      </UserControl.Resources>
121  
122      <Grid x:Name="ContextMenuGrid">
123          <Grid.RowDefinitions>
124              <RowDefinition />
125              <RowDefinition />
126          </Grid.RowDefinitions>
127          <ListView
128              x:Name="CommandsDropdown"
129              MinWidth="248"
130              Margin="0,4,0,2"
131              IsItemClickEnabled="True"
132              ItemClick="CommandsDropdown_ItemClick"
133              ItemTemplateSelector="{StaticResource ContextItemTemplateSelector}"
134              ItemsSource="{x:Bind ViewModel.FilteredItems, Mode=OneWay}"
135              PreviewKeyDown="CommandsDropdown_PreviewKeyDown"
136              SelectionMode="Single">
137              <ListView.Resources>
138                  <x:Boolean x:Key="ListViewItemSelectionIndicatorVisualEnabled">False</x:Boolean>
139              </ListView.Resources>
140              <ListView.ItemContainerStyle>
141                  <Style BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem">
142                      <Setter Property="MinHeight" Value="0" />
143                      <Setter Property="Padding" Value="0" />
144                  </Style>
145              </ListView.ItemContainerStyle>
146              <ListView.ItemContainerTransitions>
147                  <TransitionCollection />
148              </ListView.ItemContainerTransitions>
149          </ListView>
150          <Border BorderBrush="{ThemeResource MenuFlyoutSeparatorBackground}" BorderThickness="0,0,0,1" />
151          <TextBox
152              x:Name="ContextFilterBox"
153              x:Uid="ContextFilterBox"
154              Margin="0"
155              Padding="10,7,6,8"
156              Background="{ThemeResource AcrylicBackgroundFillColorBaseBrush}"
157              BorderThickness="0,0,0,2"
158              CornerRadius="8, 8, 0, 0"
159              IsTextScaleFactorEnabled="True"
160              KeyDown="ContextFilterBox_KeyDown"
161              PreviewKeyDown="ContextFilterBox_PreviewKeyDown"
162              Style="{StaticResource SearchTextBoxStyle}"
163              TextChanged="ContextFilterBox_TextChanged" />
164          <VisualStateManager.VisualStateGroups>
165              <VisualStateGroup x:Name="ContextMenuOrder">
166                  <VisualState x:Name="FilterOnTop">
167                      <VisualState.StateTriggers>
168                          <ui:IsEqualStateTrigger Value="{x:Bind ViewModel.FilterOnTop, Mode=OneWay}" To="True" />
169                      </VisualState.StateTriggers>
170                      <VisualState.Setters>
171                          <Setter Target="CommandsDropdown.(Grid.Row)" Value="1" />
172                          <Setter Target="ContextFilterBox.(Grid.Row)" Value="0" />
173                          <Setter Target="CommandsDropdown.Margin" Value="0, 3, 0, 4" />
174                          <Setter Target="ContextFilterBox.CornerRadius" Value="8, 8, 0, 0" />
175                          <Setter Target="ContextFilterBox.Margin" Value="0,0,0,-1" />
176                      </VisualState.Setters>
177                  </VisualState>
178                  <VisualState x:Name="FilterOnBottom">
179                      <VisualState.StateTriggers>
180                          <ui:IsEqualStateTrigger Value="{x:Bind ViewModel.FilterOnTop, Mode=OneWay}" To="False" />
181                      </VisualState.StateTriggers>
182                      <VisualState.Setters>
183                          <Setter Target="CommandsDropdown.(Grid.Row)" Value="0" />
184                          <Setter Target="ContextFilterBox.(Grid.Row)" Value="1" />
185                          <Setter Target="CommandsDropdown.Margin" Value="0, 4, 0, 4" />
186                          <Setter Target="ContextFilterBox.CornerRadius" Value="0, 0, 8, 8" />
187                          <Setter Target="ContextFilterBox.Margin" Value="0,0,0,-2" />
188                      </VisualState.Setters>
189                  </VisualState>
190              </VisualStateGroup>
191          </VisualStateManager.VisualStateGroups>
192      </Grid>
193  </UserControl>