Fixes a regression of command palette accessibility. The regression was introduced in #8377 by setting `IsTabStop` to false. Though the commands would light up, the focus didn't technically get on the command, so the screen reader would just read the text box. ## Validation Steps Performed Opened the command palette while NVDA is active. It now reads the commands as focus moves on them.
440 lines
22 KiB
XML
440 lines
22 KiB
XML
<!-- Copyright (c) Microsoft Corporation. All rights reserved. Licensed under
|
|
the MIT License. See LICENSE in the project root for license information. -->
|
|
<UserControl
|
|
x:Class="TerminalApp.CommandPalette"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:local="using:TerminalApp"
|
|
xmlns:model="using:Microsoft.Terminal.Settings.Model"
|
|
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
xmlns:Windows10version1903="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract, 8)"
|
|
xmlns:SettingsModel="using:Microsoft.Terminal.Settings.Model"
|
|
TabNavigation="Cycle"
|
|
IsTabStop="True"
|
|
AllowFocusOnInteraction="True"
|
|
PointerPressed="_rootPointerPressed"
|
|
PreviewKeyDown="_previewKeyDownHandler"
|
|
PreviewKeyUp="_keyUpHandler"
|
|
LostFocus="_lostFocusHandler"
|
|
mc:Ignorable="d"
|
|
AutomationProperties.Name="{x:Bind ControlName, Mode=OneWay}">
|
|
|
|
<UserControl.Resources>
|
|
<ResourceDictionary>
|
|
|
|
<!-- ThemeShadow is only on 18362. This "Windows10version1903" bit
|
|
adds it conditionally -->
|
|
<Windows10version1903:ThemeShadow x:Name="CommandPaletteShadow" />
|
|
|
|
<!-- This creates an instance of our CommandKeyChordVisibilityConverter we can reference below -->
|
|
<local:EmptyStringVisibilityConverter x:Key="CommandKeyChordVisibilityConverter"/>
|
|
<local:EmptyStringVisibilityConverter x:Key="ParsedCommandLineTextVisibilityConverter"/>
|
|
<local:EmptyStringVisibilityConverter x:Key="ParentCommandVisibilityConverter"/>
|
|
<local:HasNestedCommandsVisibilityConverter x:Key="HasNestedCommandsVisibilityConverter"/>
|
|
<model:IconPathConverter x:Key="IconSourceConverter"/>
|
|
|
|
<DataTemplate x:Key="GeneralItemTemplate" x:DataType="local:FilteredCommand">
|
|
|
|
<!-- This HorizontalContentAlignment="Stretch" is important
|
|
to make sure it takes the entire width of the line -->
|
|
<ListViewItem HorizontalContentAlignment="Stretch"
|
|
AutomationProperties.Name="{x:Bind Item.Name, Mode=OneWay}"
|
|
AutomationProperties.AcceleratorKey="{x:Bind Item.KeyChordText, Mode=OneWay}">
|
|
|
|
<Grid HorizontalAlignment="Stretch" ColumnSpacing="8" >
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="16"/>
|
|
<!-- icon -->
|
|
<ColumnDefinition Width="Auto"/>
|
|
<!-- command label -->
|
|
<ColumnDefinition Width="*"/>
|
|
<!-- key chord -->
|
|
<ColumnDefinition Width="16"/>
|
|
<!-- gutter for scrollbar -->
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<IconSourceElement
|
|
Grid.Column="0"
|
|
Width="16"
|
|
Height="16"
|
|
IconSource="{x:Bind Item.Icon,
|
|
Mode=OneWay,
|
|
Converter={StaticResource IconSourceConverter}}"/>
|
|
|
|
<local:HighlightedTextControl
|
|
Grid.Column="1"
|
|
HorizontalAlignment="Left"
|
|
Text="{x:Bind HighlightedName, Mode=OneWay}"/>
|
|
|
|
<!-- The block for the key chord is only visible
|
|
when there's actual text set as the label. See
|
|
CommandKeyChordVisibilityConverter for details. -->
|
|
<Border
|
|
Grid.Column="2"
|
|
Visibility="{x:Bind Item.KeyChordText,
|
|
Mode=OneWay,
|
|
Converter={StaticResource CommandKeyChordVisibilityConverter}}"
|
|
Style="{ThemeResource KeyChordBorderStyle}"
|
|
Padding="2,0,2,0"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center">
|
|
|
|
<TextBlock
|
|
Style="{ThemeResource KeyChordTextBlockStyle}"
|
|
FontSize="12"
|
|
Text="{x:Bind Item.KeyChordText, Mode=OneWay}" />
|
|
</Border>
|
|
|
|
<!-- xE70E is ChevronUp. Rotated 90 degrees, it's _ChevronRight_ -->
|
|
<FontIcon
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Glyph=""
|
|
HorizontalAlignment="Right"
|
|
Visibility="{x:Bind Item,
|
|
Mode=OneWay,
|
|
Converter={StaticResource HasNestedCommandsVisibilityConverter}}"
|
|
Grid.Column="2">
|
|
|
|
<FontIcon.RenderTransform>
|
|
<RotateTransform CenterX="0.5" CenterY="0.5" Angle="90"/>
|
|
</FontIcon.RenderTransform>
|
|
</FontIcon>
|
|
|
|
</Grid>
|
|
</ListViewItem>
|
|
</DataTemplate>
|
|
|
|
<DataTemplate x:Key="TabItemTemplate" x:DataType="local:FilteredCommand">
|
|
|
|
<!-- This HorizontalContentAlignment="Stretch" is important
|
|
to make sure it takes the entire width of the line -->
|
|
<ListViewItem HorizontalContentAlignment="Stretch"
|
|
AutomationProperties.Name="{x:Bind Item.Name, Mode=OneWay}"
|
|
AutomationProperties.AcceleratorKey="{x:Bind Item.KeyChordText, Mode=OneWay}">
|
|
|
|
<Grid HorizontalAlignment="Stretch" ColumnSpacing="8" >
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="16"/>
|
|
<!-- icon / progress -->
|
|
<ColumnDefinition Width="Auto"/>
|
|
<!-- command label -->
|
|
<ColumnDefinition Width="*"/>
|
|
<!-- gutter for indicators -->
|
|
<ColumnDefinition Width="Auto"/>
|
|
<!-- Indicators -->
|
|
<ColumnDefinition Width="16"/>
|
|
<!-- gutter for scrollbar -->
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<mux:ProgressRing
|
|
Grid.Column="0"
|
|
IsActive="{x:Bind Item.(local:TabPaletteItem.TabStatus).IsProgressRingActive, Mode=OneWay}"
|
|
Visibility="{x:Bind Item.(local:TabPaletteItem.TabStatus).IsProgressRingActive, Mode=OneWay}"
|
|
IsIndeterminate="{x:Bind Item.(local:TabPaletteItem.TabStatus).IsProgressRingIndeterminate, Mode=OneWay}"
|
|
Value="{x:Bind Item.(local:TabPaletteItem.TabStatus).ProgressValue, Mode=OneWay}"
|
|
MinHeight="0"
|
|
MinWidth="0"
|
|
Height="15"
|
|
Width="15"/>
|
|
|
|
<IconSourceElement
|
|
Grid.Column="0"
|
|
Width="16"
|
|
Height="16"
|
|
IconSource="{x:Bind Item.Icon,
|
|
Mode=OneWay,
|
|
Converter={StaticResource IconSourceConverter}}"/>
|
|
|
|
<local:HighlightedTextControl
|
|
Grid.Column="1"
|
|
HorizontalAlignment="Left"
|
|
Text="{x:Bind HighlightedName, Mode=OneWay}"/>
|
|
|
|
<StackPanel
|
|
Grid.Column="2"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Right"
|
|
Orientation="Horizontal">
|
|
|
|
<FontIcon
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Visibility="{x:Bind Item.(local:TabPaletteItem.TabStatus).BellIndicator, Mode=OneWay}"
|
|
Glyph=""
|
|
FontSize="12"
|
|
Margin="0,0,8,0"/>
|
|
|
|
<FontIcon
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Visibility="{x:Bind Item.(local:TabPaletteItem.TabStatus).IsPaneZoomed, Mode=OneWay}"
|
|
Glyph=""
|
|
FontSize="12"
|
|
Margin="0,0,8,0"/>
|
|
|
|
<FontIcon x:Name="HeaderLockIcon"
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Visibility="{x:Bind Item.(local:TabPaletteItem.TabStatus).IsReadOnlyActive, Mode=OneWay}"
|
|
Glyph=""
|
|
FontSize="12"
|
|
Margin="0,0,8,0"/>
|
|
|
|
</StackPanel>
|
|
</Grid>
|
|
</ListViewItem>
|
|
</DataTemplate>
|
|
|
|
<local:PaletteItemTemplateSelector x:Key="PaletteItemTemplateSelector" TabItemTemplate="{StaticResource TabItemTemplate}" GeneralItemTemplate="{StaticResource GeneralItemTemplate}"/>
|
|
|
|
<ResourceDictionary.ThemeDictionaries>
|
|
<ResourceDictionary x:Key="Dark">
|
|
<Style x:Key="CommandPaletteBackground" TargetType="Grid">
|
|
<Setter Property="Background" Value="#333333" />
|
|
</Style>
|
|
<!-- TextBox colors !-->
|
|
<SolidColorBrush x:Key="TextControlBackground" Color="#333333"/>
|
|
<SolidColorBrush x:Key="TextBoxPlaceholderTextThemeBrush" Color="#B5B5B5"/>
|
|
<SolidColorBrush x:Key="TextControlForeground" Color="#B5B5B5"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrush" Color="#404040"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForeground" Color="#B5B5B5"/>
|
|
|
|
<SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="#404040"/>
|
|
<SolidColorBrush x:Key="TextControlForegroundPointerOver" Color="#FFFFFF"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrushPointerOver" Color="#404040"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForegroundPointerOver" Color="#FF4343"/>
|
|
|
|
<SolidColorBrush x:Key="TextControlBackgroundFocused" Color="#333333"/>
|
|
<SolidColorBrush x:Key="TextControlForegroundFocused" Color="#FFFFFF"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrushFocused" Color="#404040"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForegroundPressed" Color="#FFFFFF"/>
|
|
<SolidColorBrush x:Key="TextControlButtonBackgroundPressed" Color="#FF4343"/>
|
|
|
|
<!-- KeyChordText styles -->
|
|
<Style x:Key="KeyChordBorderStyle" TargetType="Border">
|
|
<Setter Property="BorderThickness" Value="1" />
|
|
<Setter Property="CornerRadius" Value="1" />
|
|
<Setter Property="Background" Value="{ThemeResource SystemAltMediumLowColor}" />
|
|
<Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
<Style x:Key="KeyChordTextBlockStyle" TargetType="TextBlock">
|
|
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
|
|
<!-- ParsedCommandLineText styles -->
|
|
<Style x:Key="ParsedCommandLineBorderStyle" TargetType="Border">
|
|
<Setter Property="BorderThickness" Value="1" />
|
|
<Setter Property="CornerRadius" Value="1" />
|
|
<Setter Property="Background" Value="{ThemeResource SystemAltMediumLowColor}" />
|
|
<Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
<Style x:Key="ParsedCommandLineTextBlockStyle" TargetType="TextBlock">
|
|
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
</ResourceDictionary>
|
|
<ResourceDictionary x:Key="Light">
|
|
<Style x:Key="CommandPaletteBackground" TargetType="Grid">
|
|
<Setter Property="Background" Value="#CCCCCC" />
|
|
</Style>
|
|
<!-- TextBox colors !-->
|
|
<SolidColorBrush x:Key="TextControlBackground" Color="#CCCCCC"/>
|
|
<SolidColorBrush x:Key="TextBoxPlaceholderTextThemeBrush" Color="#636363"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrush" Color="#636363"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForeground" Color="#636363"/>
|
|
|
|
<SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="#DADADA"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrushPointerOver" Color="#636363"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForegroundPointerOver" Color="#FF4343"/>
|
|
|
|
<SolidColorBrush x:Key="TextControlBackgroundFocused" Color="#CCCCCC"/>
|
|
<SolidColorBrush x:Key="TextControlBorderBrushFocused" Color="#636363"/>
|
|
<SolidColorBrush x:Key="TextControlButtonForegroundPressed" Color="#FFFFFF"/>
|
|
<SolidColorBrush x:Key="TextControlButtonBackgroundPressed" Color="#FF4343"/>
|
|
|
|
<!-- KeyChordText styles -->
|
|
<Style x:Key="KeyChordBorderStyle" TargetType="Border">
|
|
<Setter Property="BorderThickness" Value="1" />
|
|
<Setter Property="CornerRadius" Value="1" />
|
|
<Setter Property="Background" Value="{ThemeResource SystemAltMediumLowColor}" />
|
|
<Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
<Style x:Key="KeyChordTextBlockStyle" TargetType="TextBlock">
|
|
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
|
|
<!-- ParsedCommandLineText styles -->
|
|
<Style x:Key="ParsedCommandLineBorderStyle" TargetType="Border">
|
|
<Setter Property="BorderThickness" Value="1" />
|
|
<Setter Property="CornerRadius" Value="1" />
|
|
<Setter Property="Background" Value="{ThemeResource SystemAltMediumLowColor}" />
|
|
<Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
<Style x:Key="ParsedCommandLineTextBlockStyle" TargetType="TextBlock">
|
|
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
|
</Style>
|
|
</ResourceDictionary>
|
|
<ResourceDictionary x:Key="HighContrast">
|
|
<Style x:Key="CommandPaletteBackground" TargetType="Grid">
|
|
<Setter Property="Background" Value="{ThemeResource SystemColorWindowColor}" />
|
|
</Style>
|
|
|
|
<!-- KeyChordText styles (use XAML defaults for High Contrast theme) -->
|
|
<Style x:Key="KeyChordBorderStyle" TargetType="Border"/>
|
|
<Style x:Key="KeyChordTextBlockStyle" TargetType="TextBlock"/>
|
|
|
|
<!-- ParsedCommandLineText styles (use XAML defaults for High Contrast theme) -->
|
|
<Style x:Key="ParsedCommandLineBorderStyle" TargetType="Border"/>
|
|
<Style x:Key="ParsedCommandLineTextBlockStyle" TargetType="TextBlock"/>
|
|
</ResourceDictionary>
|
|
</ResourceDictionary.ThemeDictionaries>
|
|
</ResourceDictionary>
|
|
</UserControl.Resources>
|
|
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="2*" />
|
|
<ColumnDefinition Width="6*" />
|
|
<ColumnDefinition Width="2*" />
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="8*"/>
|
|
<RowDefinition Height="2*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Setting the row/col span of this shadow backdrop is a bit of a hack. In
|
|
order to receive pointer events, an element needs to be _not_ transparent.
|
|
However, we want to be able to eat all the clicks outside the immediate
|
|
bounds of the command palette, and we don't want a semi-transparent overlay
|
|
over all of the UI. Fortunately, if we make this _shadowBackdrop the size of
|
|
the entire page, then it can be mostly transparent, and cause the root grid
|
|
to receive clicks _anywhere_ in its bounds. -->
|
|
|
|
<Grid
|
|
x:Name="_shadowBackdrop"
|
|
Background="Transparent"
|
|
Grid.Column="0"
|
|
Grid.Row="0"
|
|
Grid.ColumnSpan="3"
|
|
Grid.RowSpan="2"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Stretch">
|
|
</Grid>
|
|
|
|
<Grid
|
|
x:Name="_backdrop"
|
|
Style="{ThemeResource CommandPaletteBackground}"
|
|
CornerRadius="{ThemeResource ControlCornerRadius}"
|
|
PointerPressed="_backdropPointerPressed"
|
|
Margin="8"
|
|
Grid.Column="1"
|
|
Grid.Row="0"
|
|
Windows10version1903:Shadow="{StaticResource CommandPaletteShadow}"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Top">
|
|
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<TextBox
|
|
Grid.Row="0"
|
|
x:Name="_searchBox"
|
|
Margin="8"
|
|
Padding="18,8,8,8"
|
|
IsSpellCheckEnabled="False"
|
|
TextChanged="_filterTextChanged"
|
|
PlaceholderText="{x:Bind SearchBoxPlaceholderText, Mode=OneWay}"
|
|
Text="">
|
|
</TextBox>
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
x:Name="_prefixCharacter"
|
|
Margin="16,16,0,-8"
|
|
FontSize="14"
|
|
HorizontalAlignment="Left"
|
|
Visibility="{x:Bind PrefixCharacter,
|
|
Mode=OneWay,
|
|
Converter={StaticResource ParentCommandVisibilityConverter}}"
|
|
Text="{x:Bind PrefixCharacter, Mode=OneWay}"
|
|
>
|
|
</TextBlock>
|
|
|
|
<StackPanel Orientation="Horizontal"
|
|
Padding="16, 0, 16, 4"
|
|
Grid.Row="1"
|
|
Visibility="{x:Bind ParentCommandName,
|
|
Mode=OneWay,
|
|
Converter={StaticResource ParentCommandVisibilityConverter}}">
|
|
|
|
<Button
|
|
Background="Transparent"
|
|
x:Name="_parentCommandBackButton"
|
|
x:Uid="ParentCommandBackButton"
|
|
Click="_moveBackButtonClicked"
|
|
ClickMode="Press"
|
|
VerticalAlignment="Center">
|
|
<FontIcon
|
|
FontSize="12"
|
|
FontFamily="Segoe MDL2 Assets"
|
|
Glyph="">
|
|
</FontIcon>
|
|
</Button>
|
|
|
|
<TextBlock
|
|
Padding="16, 0, 16, 4"
|
|
x:Name="_parentCommandText"
|
|
FontStyle="Italic"
|
|
Grid.Row="1"
|
|
Text="{x:Bind ParentCommandName, Mode=OneWay}"
|
|
VerticalAlignment="Center">
|
|
</TextBlock>
|
|
</StackPanel>
|
|
|
|
<TextBlock
|
|
Padding="16"
|
|
x:Name="_noMatchesText"
|
|
FontStyle="Italic"
|
|
Visibility="Collapsed"
|
|
Grid.Row="1"
|
|
Text="{x:Bind NoMatchesText, Mode=OneWay}">
|
|
</TextBlock>
|
|
|
|
<Border
|
|
Grid.Row="1"
|
|
Visibility="{x:Bind ParsedCommandLineText, Mode=OneWay, Converter={StaticResource ParsedCommandLineTextVisibilityConverter}}"
|
|
Style="{ThemeResource ParsedCommandLineBorderStyle}"
|
|
Padding="16"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Center">
|
|
|
|
<ScrollViewer MaxHeight="200" VerticalScrollBarVisibility="Auto">
|
|
<TextBlock
|
|
FontStyle="Italic"
|
|
TextWrapping="Wrap"
|
|
Text="{x:Bind ParsedCommandLineText, Mode=OneWay}"/>
|
|
</ScrollViewer>
|
|
</Border>
|
|
|
|
<ListView
|
|
Grid.Row="2"
|
|
x:Name="_filteredActionsView"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Stretch"
|
|
SelectionMode="Single"
|
|
CanReorderItems="False"
|
|
AllowDrop="False"
|
|
IsItemClickEnabled="True"
|
|
ItemClick="_listItemClicked"
|
|
ItemsSource="{x:Bind FilteredActions}"
|
|
ItemTemplateSelector="{StaticResource PaletteItemTemplateSelector}">
|
|
</ListView>
|
|
|
|
</Grid>
|
|
|
|
|
|
</Grid>
|
|
</UserControl>
|