mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-15 19:27:56 +01:00
New info badge for cursor wrap and Advanced paste Tweak (#43490)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request 1. New info badge for cursor wrap 2. Advanced paste UI string localization 3. Add ShowPreviewPane Setting to determine whether show the advanced paste preview <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed <img width="451" height="247" alt="image" src="https://github.com/user-attachments/assets/920b4b8a-f1f9-4848-b140-3295ff347fdc" /> <img width="470" height="383" alt="image" src="https://github.com/user-attachments/assets/3978ebec-e695-4036-99a8-abf1561d9a28" /> <img width="1136" height="392" alt="image" src="https://github.com/user-attachments/assets/0d474fcf-49a4-4cc7-b849-0231a95d9ea7" />
This commit is contained in:
@@ -49,6 +49,8 @@ internal sealed class IntegrationTestUserSettings : IUserSettings
|
|||||||
|
|
||||||
public bool CloseAfterLosingFocus => false;
|
public bool CloseAfterLosingFocus => false;
|
||||||
|
|
||||||
|
public bool EnableClipboardPreview => true;
|
||||||
|
|
||||||
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions => _customActions;
|
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions => _customActions;
|
||||||
|
|
||||||
public IReadOnlyList<PasteFormats> AdditionalActions => _additionalActions;
|
public IReadOnlyList<PasteFormats> AdditionalActions => _additionalActions;
|
||||||
|
|||||||
@@ -611,10 +611,10 @@
|
|||||||
CornerRadius="{StaticResource ControlCornerRadius}"
|
CornerRadius="{StaticResource ControlCornerRadius}"
|
||||||
Visibility="{x:Bind IsLocalModel, Mode=OneWay}">
|
Visibility="{x:Bind IsLocalModel, Mode=OneWay}">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
x:Uid="LocalModelBadge"
|
||||||
AutomationProperties.AccessibilityView="Raw"
|
AutomationProperties.AccessibilityView="Raw"
|
||||||
FontSize="10"
|
FontSize="10"
|
||||||
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
|
Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
|
||||||
Text="Local" />
|
|
||||||
</Border>
|
</Border>
|
||||||
<!--<Border
|
<!--<Border
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
|
|||||||
@@ -156,7 +156,7 @@
|
|||||||
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
CornerRadius="20"
|
CornerRadius="20"
|
||||||
Visibility="{x:Bind ViewModel.ClipboardHasData, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
|
Visibility="{x:Bind ViewModel.ShowClipboardPreview, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
@@ -168,7 +168,8 @@
|
|||||||
Margin="0,0,4,0"
|
Margin="0,0,4,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
IsEnabled="{x:Bind ViewModel.ClipboardHistoryEnabled, Mode=TwoWay}"
|
IsEnabled="{x:Bind ViewModel.ClipboardHistoryEnabled, Mode=TwoWay}"
|
||||||
Style="{StaticResource SubtleButtonStyle}">
|
Style="{StaticResource SubtleButtonStyle}"
|
||||||
|
Visibility="{x:Bind ViewModel.ShowClipboardHistoryButton, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
|
||||||
<ToolTipService.ToolTip>
|
<ToolTipService.ToolTip>
|
||||||
<TextBlock x:Uid="ClipboardHistoryButtonToolTip" />
|
<TextBlock x:Uid="ClipboardHistoryButtonToolTip" />
|
||||||
</ToolTipService.ToolTip>
|
</ToolTipService.ToolTip>
|
||||||
@@ -270,9 +271,9 @@
|
|||||||
<StackPanel Spacing="8">
|
<StackPanel Spacing="8">
|
||||||
<TextBlock TextWrapping="Wrap">
|
<TextBlock TextWrapping="Wrap">
|
||||||
<Run x:Uid="AIMistakeNote" /><LineBreak /><Run
|
<Run x:Uid="AIMistakeNote" /><LineBreak /><Run
|
||||||
|
x:Uid="CustomEndpointWarning"
|
||||||
FontSize="12"
|
FontSize="12"
|
||||||
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
|
Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
|
||||||
Text="You are using a custom endpoint. Verify all answers." />
|
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||||
<HyperlinkButton
|
<HyperlinkButton
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ namespace AdvancedPaste.Settings
|
|||||||
|
|
||||||
public bool CloseAfterLosingFocus { get; }
|
public bool CloseAfterLosingFocus { get; }
|
||||||
|
|
||||||
|
public bool EnableClipboardPreview { get; }
|
||||||
|
|
||||||
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions { get; }
|
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions { get; }
|
||||||
|
|
||||||
public IReadOnlyList<PasteFormats> AdditionalActions { get; }
|
public IReadOnlyList<PasteFormats> AdditionalActions { get; }
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ namespace AdvancedPaste.Settings
|
|||||||
|
|
||||||
public bool CloseAfterLosingFocus { get; private set; }
|
public bool CloseAfterLosingFocus { get; private set; }
|
||||||
|
|
||||||
|
public bool EnableClipboardPreview { get; private set; }
|
||||||
|
|
||||||
public IReadOnlyList<PasteFormats> AdditionalActions => _additionalActions;
|
public IReadOnlyList<PasteFormats> AdditionalActions => _additionalActions;
|
||||||
|
|
||||||
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions => _customActions;
|
public IReadOnlyList<AdvancedPasteCustomAction> CustomActions => _customActions;
|
||||||
@@ -53,6 +55,7 @@ namespace AdvancedPaste.Settings
|
|||||||
IsAIEnabled = false;
|
IsAIEnabled = false;
|
||||||
ShowCustomPreview = true;
|
ShowCustomPreview = true;
|
||||||
CloseAfterLosingFocus = false;
|
CloseAfterLosingFocus = false;
|
||||||
|
EnableClipboardPreview = true;
|
||||||
PasteAIConfiguration = new PasteAIConfiguration();
|
PasteAIConfiguration = new PasteAIConfiguration();
|
||||||
_additionalActions = [];
|
_additionalActions = [];
|
||||||
_customActions = [];
|
_customActions = [];
|
||||||
@@ -107,6 +110,7 @@ namespace AdvancedPaste.Settings
|
|||||||
IsAIEnabled = properties.IsAIEnabled;
|
IsAIEnabled = properties.IsAIEnabled;
|
||||||
ShowCustomPreview = properties.ShowCustomPreview;
|
ShowCustomPreview = properties.ShowCustomPreview;
|
||||||
CloseAfterLosingFocus = properties.CloseAfterLosingFocus;
|
CloseAfterLosingFocus = properties.CloseAfterLosingFocus;
|
||||||
|
EnableClipboardPreview = properties.EnableClipboardPreview;
|
||||||
PasteAIConfiguration = properties.PasteAIConfiguration ?? new PasteAIConfiguration();
|
PasteAIConfiguration = properties.PasteAIConfiguration ?? new PasteAIConfiguration();
|
||||||
|
|
||||||
var sourceAdditionalActions = properties.AdditionalActions;
|
var sourceAdditionalActions = properties.AdditionalActions;
|
||||||
|
|||||||
@@ -359,6 +359,13 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="Relative_Date_TimeFormat" xml:space="preserve">
|
<data name="Relative_Date_TimeFormat" xml:space="preserve">
|
||||||
<value>{0}, {1}</value>
|
<value>{0}, {1}</value>
|
||||||
<comment>(e.g., “10/20/2025, 17:05” in the user’s locale)</comment>
|
<comment>(e.g., "10/20/2025, 17:05" in the user's locale)</comment>
|
||||||
|
</data>
|
||||||
|
<data name="CustomEndpointWarning" xml:space="preserve">
|
||||||
|
<value>You are using a custom endpoint. Verify all answers.</value>
|
||||||
|
</data>
|
||||||
|
<data name="LocalModelBadge" xml:space="preserve">
|
||||||
|
<value>Local</value>
|
||||||
|
<comment>Badge label displayed next to local AI model providers (e.g., Ollama, Foundry Local) to indicate the model runs locally</comment>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -63,6 +63,7 @@ namespace AdvancedPaste.ViewModels
|
|||||||
private ClipboardFormat _availableClipboardFormats;
|
private ClipboardFormat _availableClipboardFormats;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
|
[NotifyPropertyChangedFor(nameof(ShowClipboardHistoryButton))]
|
||||||
private bool _clipboardHistoryEnabled;
|
private bool _clipboardHistoryEnabled;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
@@ -225,6 +226,10 @@ namespace AdvancedPaste.ViewModels
|
|||||||
|
|
||||||
public bool ClipboardHasDataForCustomAI => PasteFormat.SupportsClipboardFormats(CustomAIFormat, AvailableClipboardFormats);
|
public bool ClipboardHasDataForCustomAI => PasteFormat.SupportsClipboardFormats(CustomAIFormat, AvailableClipboardFormats);
|
||||||
|
|
||||||
|
public bool ShowClipboardPreview => _userSettings.EnableClipboardPreview;
|
||||||
|
|
||||||
|
public bool ShowClipboardHistoryButton => ClipboardHistoryEnabled;
|
||||||
|
|
||||||
public bool HasIndeterminateTransformProgress => double.IsNaN(TransformProgress);
|
public bool HasIndeterminateTransformProgress => double.IsNaN(TransformProgress);
|
||||||
|
|
||||||
private PasteFormats CustomAIFormat =>
|
private PasteFormats CustomAIFormat =>
|
||||||
@@ -310,6 +315,7 @@ namespace AdvancedPaste.ViewModels
|
|||||||
OnPropertyChanged(nameof(IsAdvancedAIEnabled));
|
OnPropertyChanged(nameof(IsAdvancedAIEnabled));
|
||||||
OnPropertyChanged(nameof(AIProviders));
|
OnPropertyChanged(nameof(AIProviders));
|
||||||
OnPropertyChanged(nameof(AllowedAIProviders));
|
OnPropertyChanged(nameof(AllowedAIProviders));
|
||||||
|
OnPropertyChanged(nameof(ShowClipboardPreview));
|
||||||
|
|
||||||
NotifyActiveProviderChanged();
|
NotifyActiveProviderChanged();
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
IsAIEnabled = false;
|
IsAIEnabled = false;
|
||||||
ShowCustomPreview = true;
|
ShowCustomPreview = true;
|
||||||
CloseAfterLosingFocus = false;
|
CloseAfterLosingFocus = false;
|
||||||
|
EnableClipboardPreview = true;
|
||||||
PasteAIConfiguration = new();
|
PasteAIConfiguration = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +122,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
[JsonConverter(typeof(BoolPropertyJsonConverter))]
|
[JsonConverter(typeof(BoolPropertyJsonConverter))]
|
||||||
public bool CloseAfterLosingFocus { get; set; }
|
public bool CloseAfterLosingFocus { get; set; }
|
||||||
|
|
||||||
|
[JsonConverter(typeof(BoolPropertyJsonConverter))]
|
||||||
|
public bool EnableClipboardPreview { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("advanced-paste-ui-hotkey")]
|
[JsonPropertyName("advanced-paste-ui-hotkey")]
|
||||||
public HotkeySettings AdvancedPasteUIShortcut { get; set; }
|
public HotkeySettings AdvancedPasteUIShortcut { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -177,6 +177,9 @@
|
|||||||
<tkcontrols:SettingsCard Name="AdvancedPasteCloseAfterLosingFocus" ContentAlignment="Left">
|
<tkcontrols:SettingsCard Name="AdvancedPasteCloseAfterLosingFocus" ContentAlignment="Left">
|
||||||
<CheckBox x:Uid="AdvancedPaste_CloseAfterLosingFocus" IsChecked="{x:Bind ViewModel.CloseAfterLosingFocus, Mode=TwoWay}" />
|
<CheckBox x:Uid="AdvancedPaste_CloseAfterLosingFocus" IsChecked="{x:Bind ViewModel.CloseAfterLosingFocus, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
|
<tkcontrols:SettingsCard Name="AdvancedPasteEnableClipboardPreview" ContentAlignment="Left">
|
||||||
|
<CheckBox x:Uid="AdvancedPaste_EnableClipboardPreview" IsChecked="{x:Bind ViewModel.EnableClipboardPreview, Mode=TwoWay}" />
|
||||||
|
</tkcontrols:SettingsCard>
|
||||||
<tkcontrols:SettingsCard Name="AdvancedPasteShowCustomPreviewSettingsCard" ContentAlignment="Left">
|
<tkcontrols:SettingsCard Name="AdvancedPasteShowCustomPreviewSettingsCard" ContentAlignment="Left">
|
||||||
<controls:CheckBoxWithDescriptionControl x:Uid="AdvancedPaste_ShowCustomPreviewSettingsCard" IsChecked="{x:Bind ViewModel.ShowCustomPreview, Mode=TwoWay}" />
|
<controls:CheckBoxWithDescriptionControl x:Uid="AdvancedPaste_ShowCustomPreviewSettingsCard" IsChecked="{x:Bind ViewModel.ShowCustomPreview, Mode=TwoWay}" />
|
||||||
</tkcontrols:SettingsCard>
|
</tkcontrols:SettingsCard>
|
||||||
|
|||||||
@@ -285,6 +285,9 @@
|
|||||||
AutomationProperties.AutomationId="InputOutputNavItem"
|
AutomationProperties.AutomationId="InputOutputNavItem"
|
||||||
Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/InputOutput.png}"
|
Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/InputOutput.png}"
|
||||||
SelectsOnInvoked="False">
|
SelectsOnInvoked="False">
|
||||||
|
<NavigationViewItem.InfoBadge>
|
||||||
|
<InfoBadge Style="{StaticResource NewInfoBadge}" />
|
||||||
|
</NavigationViewItem.InfoBadge>
|
||||||
<NavigationViewItem.MenuItems>
|
<NavigationViewItem.MenuItems>
|
||||||
<NavigationViewItem
|
<NavigationViewItem
|
||||||
x:Name="KeyboardManagerNavigationItem"
|
x:Name="KeyboardManagerNavigationItem"
|
||||||
@@ -299,7 +302,11 @@
|
|||||||
x:Uid="Shell_MouseUtilities"
|
x:Uid="Shell_MouseUtilities"
|
||||||
helpers:NavHelper.NavigateTo="views:MouseUtilsPage"
|
helpers:NavHelper.NavigateTo="views:MouseUtilsPage"
|
||||||
AutomationProperties.AutomationId="MouseUtilitiesNavItem"
|
AutomationProperties.AutomationId="MouseUtilitiesNavItem"
|
||||||
Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/MouseUtils.png}" />
|
Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/MouseUtils.png}">
|
||||||
|
<NavigationViewItem.InfoBadge>
|
||||||
|
<InfoBadge Style="{StaticResource NewInfoBadge}" />
|
||||||
|
</NavigationViewItem.InfoBadge>
|
||||||
|
</NavigationViewItem>
|
||||||
<NavigationViewItem
|
<NavigationViewItem
|
||||||
x:Name="MouseWithoutBordersNavigationItem"
|
x:Name="MouseWithoutBordersNavigationItem"
|
||||||
x:Uid="Shell_MouseWithoutBorders"
|
x:Uid="Shell_MouseWithoutBorders"
|
||||||
|
|||||||
@@ -4601,6 +4601,10 @@ Activate by holding the key for the character you want to add an accent to, then
|
|||||||
<value>Automatically close the window after it loses focus</value>
|
<value>Automatically close the window after it loses focus</value>
|
||||||
<comment>Advanced Paste is a product name, do not loc</comment>
|
<comment>Advanced Paste is a product name, do not loc</comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="AdvancedPaste_EnableClipboardPreview.Content" xml:space="preserve">
|
||||||
|
<value>Show clipboard preview</value>
|
||||||
|
<comment>Enables display of clipboard contents preview in the Advanced Paste window</comment>
|
||||||
|
</data>
|
||||||
<data name="GPO_CommandNotFound_ForceDisabled.Title" xml:space="preserve">
|
<data name="GPO_CommandNotFound_ForceDisabled.Title" xml:space="preserve">
|
||||||
<value>The Command Not Found module is disabled by your organization.</value>
|
<value>The Command Not Found module is disabled by your organization.</value>
|
||||||
<comment>"Command Not Found" is a product name</comment>
|
<comment>"Command Not Found" is a product name</comment>
|
||||||
|
|||||||
@@ -546,6 +546,19 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool EnableClipboardPreview
|
||||||
|
{
|
||||||
|
get => _advancedPasteSettings.Properties.EnableClipboardPreview;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _advancedPasteSettings.Properties.EnableClipboardPreview)
|
||||||
|
{
|
||||||
|
_advancedPasteSettings.Properties.EnableClipboardPreview = value;
|
||||||
|
NotifySettingsChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsConflictingCopyShortcut =>
|
public bool IsConflictingCopyShortcut =>
|
||||||
_customActions.Select(customAction => customAction.Shortcut)
|
_customActions.Select(customAction => customAction.Shortcut)
|
||||||
.Concat([PasteAsPlainTextShortcut, AdvancedPasteUIShortcut, PasteAsMarkdownShortcut, PasteAsJsonShortcut])
|
.Concat([PasteAsPlainTextShortcut, AdvancedPasteUIShortcut, PasteAsMarkdownShortcut, PasteAsJsonShortcut])
|
||||||
@@ -1204,6 +1217,12 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
OnPropertyChanged(nameof(CloseAfterLosingFocus));
|
OnPropertyChanged(nameof(CloseAfterLosingFocus));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (target.EnableClipboardPreview != source.EnableClipboardPreview)
|
||||||
|
{
|
||||||
|
target.EnableClipboardPreview = source.EnableClipboardPreview;
|
||||||
|
OnPropertyChanged(nameof(EnableClipboardPreview));
|
||||||
|
}
|
||||||
|
|
||||||
var incomingConfig = source.PasteAIConfiguration ?? new PasteAIConfiguration();
|
var incomingConfig = source.PasteAIConfiguration ?? new PasteAIConfiguration();
|
||||||
if (ShouldReplacePasteAIConfiguration(target.PasteAIConfiguration, incomingConfig))
|
if (ShouldReplacePasteAIConfiguration(target.PasteAIConfiguration, incomingConfig))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
IsEnabled = gpo == GpoRuleConfigured.Enabled || (gpo != GpoRuleConfigured.Disabled && ModuleHelper.GetIsModuleEnabled(generalSettingsConfig, moduleType)),
|
IsEnabled = gpo == GpoRuleConfigured.Enabled || (gpo != GpoRuleConfigured.Disabled && ModuleHelper.GetIsModuleEnabled(generalSettingsConfig, moduleType)),
|
||||||
IsLocked = gpo == GpoRuleConfigured.Enabled || gpo == GpoRuleConfigured.Disabled,
|
IsLocked = gpo == GpoRuleConfigured.Enabled || gpo == GpoRuleConfigured.Disabled,
|
||||||
Icon = ModuleHelper.GetModuleTypeFluentIconName(moduleType),
|
Icon = ModuleHelper.GetModuleTypeFluentIconName(moduleType),
|
||||||
|
IsNew = moduleType == ModuleType.CursorWrap,
|
||||||
DashboardModuleItems = GetModuleItems(moduleType),
|
DashboardModuleItems = GetModuleItems(moduleType),
|
||||||
};
|
};
|
||||||
newItem.EnabledChangedCallback = EnabledChangedOnUI;
|
newItem.EnabledChangedCallback = EnabledChangedOnUI;
|
||||||
|
|||||||
Reference in New Issue
Block a user