mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-03 09:46:54 +02:00
<!-- 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 This PR introduces new types of IContent: - Plain text content – simple and straightforward, with options to switch between UI and monospace fonts and toggle word wrap. - It's super safe to display any random text content without having to worry about escaping the pesky markdown. - Image viewer content – a more polished way to display images: - When placed in the ContentPage, the component automatically resizes to fit the viewport, ensuring the entire image is visible at once. - Images can be opened in a built-in mini-viewer that lets you view, pan, and zoom without leaving the Command Palette. (Doing this directly on the page proved to be a UX and development headache.) Fully keyboard-controllable, so there’s no need to take your hands off the keys. ## Pictures? Pictures! Plain text content: <img width="960" height="604" alt="image" src="https://github.com/user-attachments/assets/a4ec36f3-2f7f-4a2a-a646-53056c512023" /> Image viewer content: <img width="939" height="605" alt="image" src="https://github.com/user-attachments/assets/c87f5726-8cd0-4015-b2d9-f1457fa1ec96" /> https://github.com/user-attachments/assets/915cd9d2-e4e3-4baf-8df6-6a328a3592ba <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #41038 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **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
442 lines
15 KiB
Plaintext
442 lines
15 KiB
Plaintext
namespace Microsoft.CommandPalette.Extensions
|
|
{
|
|
[contractversion(1)]
|
|
apicontract ExtensionsContract {}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IExtension {
|
|
IInspectable GetProvider(ProviderType providerType);
|
|
void Dispose();
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
enum ProviderType {
|
|
Commands = 0,
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IIconData {
|
|
String Icon { get; };
|
|
Windows.Storage.Streams.IRandomAccessStreamReference Data { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IIconInfo {
|
|
IIconData Light { get; };
|
|
IIconData Dark { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
struct KeyChord
|
|
{
|
|
Windows.System.VirtualKeyModifiers Modifiers;
|
|
Int32 Vkey;
|
|
Int32 ScanCode;
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface INotifyPropChanged {
|
|
event Windows.Foundation.TypedEventHandler<Object, IPropChangedEventArgs> PropChanged;
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IPropChangedEventArgs {
|
|
String PropertyName { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface INotifyItemsChanged {
|
|
event Windows.Foundation.TypedEventHandler<Object, IItemsChangedEventArgs> ItemsChanged;
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IItemsChangedEventArgs {
|
|
Int32 TotalItems { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommand requires INotifyPropChanged{
|
|
String Name{ get; };
|
|
String Id{ get; };
|
|
IIconInfo Icon{ get; };
|
|
}
|
|
|
|
enum CommandResultKind {
|
|
Dismiss, // Reset the palette to the main page and dismiss
|
|
GoHome, // Go back to the main page, but keep it open
|
|
GoBack, // Go back one level
|
|
Hide, // Keep this page open, but hide the palette.
|
|
KeepOpen, // Do nothing.
|
|
GoToPage, // Go to another page. GoToPageArgs will tell you where.
|
|
ShowToast, // Display a transient message to the user
|
|
Confirm, // Display a confirmation dialog
|
|
};
|
|
|
|
enum NavigationMode {
|
|
Push, // Push the target page onto the navigation stack
|
|
GoBack, // Go back one page before navigating to the target page
|
|
GoHome, // Go back to the home page before navigating to the target page
|
|
};
|
|
|
|
[uuid("f9d6423b-bd5e-44bb-a204-2f5c77a72396")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandResultArgs{};
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandResult {
|
|
CommandResultKind Kind { get; };
|
|
ICommandResultArgs Args { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IGoToPageArgs requires ICommandResultArgs{
|
|
String PageId { get; };
|
|
NavigationMode NavigationMode { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IToastArgs requires ICommandResultArgs{
|
|
String Message { get; };
|
|
ICommandResult Result { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IConfirmationArgs requires ICommandResultArgs{
|
|
String Title { get; };
|
|
String Description { get; };
|
|
ICommand PrimaryCommand { get; };
|
|
Boolean IsPrimaryCommandCritical { get; };
|
|
}
|
|
|
|
// This is a "leaf" of the UI. This is something that can be "done" by the user.
|
|
// * A ListPage
|
|
// * the MoreCommands flyout of for a ListItem or a MarkdownPage
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IInvokableCommand requires ICommand {
|
|
ICommandResult Invoke(Object sender);
|
|
}
|
|
|
|
|
|
[uuid("ef5db50c-d26b-4aee-9343-9f98739ab411")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFilterItem {}
|
|
|
|
[uuid("0a923c7f-5b7b-431d-9898-3c8c841d02ed")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ISeparatorFilterItem requires IFilterItem {}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFilter requires INotifyPropChanged, IFilterItem {
|
|
String Id { get; };
|
|
String Name { get; };
|
|
IIconInfo Icon { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFilters {
|
|
String CurrentFilterId { get; set; };
|
|
IFilterItem[] GetFilters();
|
|
}
|
|
|
|
struct Color
|
|
{
|
|
UInt8 R;
|
|
UInt8 G;
|
|
UInt8 B;
|
|
UInt8 A;
|
|
};
|
|
|
|
struct OptionalColor
|
|
{
|
|
Boolean HasValue;
|
|
Microsoft.CommandPalette.Extensions.Color Color;
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ITag {
|
|
IIconInfo Icon { get; };
|
|
String Text { get; };
|
|
OptionalColor Foreground { get; };
|
|
OptionalColor Background { get; };
|
|
String ToolTip { get; };
|
|
};
|
|
|
|
[uuid("6a6dd345-37a3-4a1e-914d-4f658a4d583d")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsData {}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
enum ContentSize
|
|
{
|
|
Small = 0,
|
|
Medium = 1,
|
|
Large = 2,
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsElement {
|
|
String Key { get; };
|
|
IDetailsData Data { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetails {
|
|
IIconInfo HeroImage { get; };
|
|
String Title { get; };
|
|
String Body { get; };
|
|
IDetailsElement[] Metadata { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsTags requires IDetailsData {
|
|
ITag[] Tags { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsLink requires IDetailsData {
|
|
Windows.Foundation.Uri Link { get; };
|
|
String Text { get; };
|
|
}
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsCommands requires IDetailsData {
|
|
ICommand[] Commands { get; };
|
|
}
|
|
[uuid("58070392-02bb-4e89-9beb-47ceb8c3d741")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDetailsSeparator requires IDetailsData {}
|
|
|
|
enum MessageState
|
|
{
|
|
Info = 0,
|
|
Success,
|
|
Warning,
|
|
Error,
|
|
};
|
|
|
|
enum StatusContext
|
|
{
|
|
Page,
|
|
Extension
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IProgressState requires INotifyPropChanged
|
|
{
|
|
Boolean IsIndeterminate { get; };
|
|
UInt32 ProgressPercent { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IStatusMessage requires INotifyPropChanged
|
|
{
|
|
MessageState State { get; };
|
|
IProgressState Progress { get; };
|
|
String Message { get; };
|
|
// TODO! Icon maybe? Work with design on this
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ILogMessage
|
|
{
|
|
MessageState State { get; };
|
|
String Message { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IExtensionHost
|
|
{
|
|
Windows.Foundation.IAsyncAction ShowStatus(IStatusMessage message, StatusContext context);
|
|
Windows.Foundation.IAsyncAction HideStatus(IStatusMessage message);
|
|
|
|
Windows.Foundation.IAsyncAction LogMessage(ILogMessage message);
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IPage requires ICommand {
|
|
String Title { get; };
|
|
Boolean IsLoading { get; };
|
|
|
|
OptionalColor AccentColor { get; };
|
|
}
|
|
|
|
[uuid("c78b9851-e76b-43ee-8f76-da5ba14e69a4")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IContextItem {}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandItem requires INotifyPropChanged {
|
|
ICommand Command{ get; };
|
|
IContextItem[] MoreCommands{ get; };
|
|
IIconInfo Icon{ get; };
|
|
String Title{ get; };
|
|
String Subtitle{ get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandContextItem requires ICommandItem, IContextItem {
|
|
Boolean IsCritical { get; }; // READ: "make this red"
|
|
KeyChord RequestedShortcut { get; };
|
|
}
|
|
|
|
[uuid("924a87fc-32fe-4471-9156-84b3b30275a6")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ISeparatorContextItem requires IContextItem {}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IListItem requires ICommandItem {
|
|
ITag[] Tags{ get; };
|
|
IDetails Details{ get; };
|
|
String Section { get; };
|
|
String TextToSuggest { get; };
|
|
}
|
|
|
|
[uuid("50C6F080-1CBE-4CE4-B92F-DA2F116ED524")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IGridProperties requires INotifyPropChanged { }
|
|
|
|
[uuid("05914D59-6ECB-4992-9CF2-5982B5120A26")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ISmallGridLayout requires IGridProperties { }
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IMediumGridLayout requires IGridProperties
|
|
{
|
|
Boolean ShowTitle { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IGalleryGridLayout requires IGridProperties
|
|
{
|
|
Boolean ShowTitle { get; };
|
|
Boolean ShowSubtitle { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IListPage requires IPage, INotifyItemsChanged {
|
|
// DevPal will be responsible for filtering the list of items, unless the
|
|
// class implements IDynamicListPage
|
|
String SearchText { get; };
|
|
String PlaceholderText { get; };
|
|
Boolean ShowDetails{ get; };
|
|
IFilters Filters { get; };
|
|
IGridProperties GridProperties { get; };
|
|
Boolean HasMoreItems { get; };
|
|
ICommandItem EmptyContent { get; };
|
|
|
|
IListItem[] GetItems();
|
|
void LoadMore();
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IDynamicListPage requires IListPage {
|
|
String SearchText { set; };
|
|
}
|
|
|
|
[uuid("b64def0f-8911-4afa-8f8f-042bd778d088")]
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IContent requires INotifyPropChanged {
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFormContent requires IContent {
|
|
String TemplateJson { get; };
|
|
String DataJson { get; };
|
|
String StateJson { get; };
|
|
ICommandResult SubmitForm(String inputs, String data);
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IMarkdownContent requires IContent {
|
|
String Body { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ITreeContent requires IContent, INotifyItemsChanged {
|
|
IContent RootContent { get; };
|
|
IContent[] GetChildren();
|
|
}
|
|
|
|
enum FontFamily
|
|
{
|
|
UserInterface,
|
|
Monospace,
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IPlainTextContent requires IContent {
|
|
String Text { get; };
|
|
FontFamily FontFamily { get; };
|
|
Boolean WrapWords { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IImageContent requires IContent {
|
|
IIconInfo Image { get; };
|
|
Int32 MaxWidth { get; };
|
|
Int32 MaxHeight { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IContentPage requires IPage, INotifyItemsChanged {
|
|
IContent[] GetContent();
|
|
IDetails Details { get; };
|
|
IContextItem[] Commands { get; };
|
|
}
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandSettings {
|
|
IContentPage SettingsPage { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFallbackHandler {
|
|
void UpdateQuery(String query);
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFallbackCommandItem requires ICommandItem {
|
|
IFallbackHandler FallbackHandler{ get; };
|
|
String DisplayTitle { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IFallbackCommandItem2 requires IFallbackCommandItem {
|
|
String Id { get; };
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandProvider requires Windows.Foundation.IClosable, INotifyItemsChanged
|
|
{
|
|
String Id { get; };
|
|
String DisplayName { get; };
|
|
IIconInfo Icon { get; };
|
|
ICommandSettings Settings { get; };
|
|
Boolean Frozen { get; };
|
|
|
|
ICommandItem[] TopLevelCommands();
|
|
IFallbackCommandItem[] FallbackCommands();
|
|
|
|
ICommand GetCommand(String id);
|
|
|
|
void InitializeWithHost(IExtensionHost host);
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface IExtendedAttributesProvider
|
|
{
|
|
Windows.Foundation.Collections.IMap<String, Object> GetProperties();
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandProvider2 requires ICommandProvider
|
|
{
|
|
Object[] GetApiExtensionStubs();
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandProvider3 requires ICommandProvider2
|
|
{
|
|
ICommandItem[] GetDockBands();
|
|
};
|
|
|
|
[contract(Microsoft.CommandPalette.Extensions.ExtensionsContract, 1)]
|
|
interface ICommandProvider4 requires ICommandProvider3
|
|
{
|
|
ICommandItem GetCommandItem(String id);
|
|
};
|
|
|
|
}
|