mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-02-01 17:00:11 +01:00
Compare commits
2 Commits
issue/2543
...
issue/3300
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38cd09708a | ||
|
|
47003c8b65 |
@@ -125,7 +125,17 @@ namespace AdvancedPaste
|
||||
|
||||
public void SetFocus()
|
||||
{
|
||||
MainPage.CustomFormatTextBox.InputTxtBox.Focus(FocusState.Programmatic);
|
||||
// Set initial focus based on AI enabled state:
|
||||
// - If AI is enabled, focus the prompt textbox
|
||||
// - If AI is disabled, focus the paste options list for keyboard navigation
|
||||
if (_optionsViewModel.IsCustomAIServiceEnabled)
|
||||
{
|
||||
MainPage.CustomFormatTextBox.InputTxtBox.Focus(FocusState.Programmatic);
|
||||
}
|
||||
else
|
||||
{
|
||||
MainPage.SetInitialFocusToPasteOptions();
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearInputText()
|
||||
|
||||
@@ -163,11 +163,13 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
<controls:ClipboardHistoryItemPreviewControl Height="48" ClipboardItem="{x:Bind ViewModel.CurrentClipboardItem, Mode=OneWay}" />
|
||||
<Button
|
||||
x:Name="ClipboardHistoryButton"
|
||||
x:Uid="ClipboardHistoryButton"
|
||||
Grid.Column="1"
|
||||
Margin="0,0,4,0"
|
||||
VerticalAlignment="Center"
|
||||
IsEnabled="{x:Bind ViewModel.ClipboardHistoryEnabled, Mode=TwoWay}"
|
||||
KeyDown="ClipboardHistoryButton_KeyDown"
|
||||
Style="{StaticResource SubtleButtonStyle}"
|
||||
Visibility="{x:Bind ViewModel.ShowClipboardHistoryButton, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
|
||||
<ToolTipService.ToolTip>
|
||||
@@ -181,15 +183,19 @@
|
||||
Glyph="" />
|
||||
<Button.Flyout>
|
||||
<Flyout
|
||||
x:Name="ClipboardHistoryFlyout"
|
||||
Closed="ClipboardHistoryFlyout_Closed"
|
||||
FlyoutPresenterStyle="{StaticResource PaddingLessFlyoutPresenterStyle}"
|
||||
Placement="Right"
|
||||
ShouldConstrainToRootBounds="False">
|
||||
<ItemsView
|
||||
x:Name="ClipboardHistoryItemsView"
|
||||
Width="320"
|
||||
Margin="8,8,8,0"
|
||||
IsItemInvokedEnabled="True"
|
||||
ItemInvoked="ClipboardHistory_ItemInvoked"
|
||||
ItemsSource="{x:Bind clipboardHistory, Mode=OneWay}"
|
||||
KeyDown="ClipboardHistoryItemsView_KeyDown"
|
||||
SelectionMode="None">
|
||||
<ItemsView.Layout>
|
||||
<StackLayout Orientation="Vertical" Spacing="8" />
|
||||
@@ -317,10 +323,13 @@
|
||||
ItemContainerTransitions="{x:Null}"
|
||||
ItemTemplateSelector="{StaticResource PasteFormatTemplateSelector}"
|
||||
ItemsSource="{x:Bind ViewModel.StandardPasteFormats, Mode=OneWay}"
|
||||
KeyDown="PasteOptionsListView_KeyDown"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.VerticalScrollMode="Disabled"
|
||||
SelectionMode="None"
|
||||
TabIndex="1" />
|
||||
SelectionMode="Single"
|
||||
SingleSelectionFollowsFocus="True"
|
||||
TabIndex="1"
|
||||
XYFocusKeyboardNavigation="Enabled" />
|
||||
<Rectangle
|
||||
Grid.Row="1"
|
||||
Height="1"
|
||||
@@ -337,10 +346,13 @@
|
||||
ItemContainerTransitions="{x:Null}"
|
||||
ItemTemplateSelector="{StaticResource PasteFormatTemplateSelector}"
|
||||
ItemsSource="{x:Bind ViewModel.CustomActionPasteFormats, Mode=OneWay}"
|
||||
KeyDown="PasteOptionsListView_KeyDown"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.VerticalScrollMode="Disabled"
|
||||
SelectionMode="None"
|
||||
TabIndex="2" />
|
||||
SelectionMode="Single"
|
||||
SingleSelectionFollowsFocus="True"
|
||||
TabIndex="2"
|
||||
XYFocusKeyboardNavigation="Enabled" />
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
|
||||
@@ -208,5 +208,103 @@ namespace AdvancedPaste.Pages
|
||||
Clipboard.SetHistoryItemAsContent(item.Item);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets initial focus to the paste options list when AI is disabled.
|
||||
/// </summary>
|
||||
public void SetInitialFocusToPasteOptions()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (PasteOptionsListView.Items.Count > 0)
|
||||
{
|
||||
PasteOptionsListView.SelectedIndex = 0;
|
||||
PasteOptionsListView.Focus(FocusState.Programmatic);
|
||||
Logger.LogTrace("Focus set to PasteOptionsListView");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("Failed to set focus to paste options", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the appropriate arrow key for "forward" direction based on RTL settings.
|
||||
/// </summary>
|
||||
private VirtualKey GetForwardKey()
|
||||
{
|
||||
return FlowDirection == FlowDirection.RightToLeft ? VirtualKey.Left : VirtualKey.Right;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the appropriate arrow key for "backward" direction based on RTL settings.
|
||||
/// </summary>
|
||||
private VirtualKey GetBackwardKey()
|
||||
{
|
||||
return FlowDirection == FlowDirection.RightToLeft ? VirtualKey.Right : VirtualKey.Left;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles keyboard navigation on the paste options ListViews.
|
||||
/// Enter key invokes the selected item.
|
||||
/// </summary>
|
||||
private async void PasteOptionsListView_KeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
|
||||
{
|
||||
if (sender is ListView listView && e.Key == VirtualKey.Enter)
|
||||
{
|
||||
if (listView.SelectedItem is PasteFormat format)
|
||||
{
|
||||
e.Handled = true;
|
||||
await ViewModel.ExecutePasteFormatAsync(format, PasteActionSource.InAppKeyboardShortcut);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles keyboard navigation on the clipboard history button.
|
||||
/// Right arrow (or Left in RTL) opens the flyout.
|
||||
/// </summary>
|
||||
private void ClipboardHistoryButton_KeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
|
||||
{
|
||||
if (e.Key == GetForwardKey())
|
||||
{
|
||||
e.Handled = true;
|
||||
if (ClipboardHistoryButton.Flyout is Flyout flyout)
|
||||
{
|
||||
flyout.ShowAt(ClipboardHistoryButton);
|
||||
Logger.LogTrace("Clipboard history flyout opened via keyboard");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles keyboard navigation within the clipboard history flyout.
|
||||
/// Escape or Left arrow (Right in RTL) closes the flyout and returns focus to the button.
|
||||
/// </summary>
|
||||
private void ClipboardHistoryItemsView_KeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
|
||||
{
|
||||
if (e.Key == VirtualKey.Escape || e.Key == GetBackwardKey())
|
||||
{
|
||||
e.Handled = true;
|
||||
ClipboardHistoryFlyout.Hide();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the clipboard history flyout closing event.
|
||||
/// Returns focus to the clipboard history button.
|
||||
/// </summary>
|
||||
private void ClipboardHistoryFlyout_Closed(object sender, object e)
|
||||
{
|
||||
try
|
||||
{
|
||||
ClipboardHistoryButton.Focus(FocusState.Programmatic);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("Failed to return focus to clipboard history button", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user