mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-15 19:27:56 +01: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 pull request adds sections and separators to ListPages and GridPages <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #38267 <!-- - [ ] 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 Since `CollectionViewSource` was causing performance issues and @zadjii-msft asked for a new approach, I came up with this idea, heavily inspired by how separators work on the `ContextMenu`, `FiltersDropDown` and `Details`. The way this is currently working is: Any ListItem where `Section` is not null and `Command` is null, is considered a Separator. On my tests, this seems to be working fine. Tried to make this work without changes to the API, but I think this needs to be discussed. ### Some of the possible enhancements to existing extensions ### Search apps <img width="792" height="523" alt="Screenshot 2025-11-27 173618" src="https://github.com/user-attachments/assets/f9f9a64d-3ec1-4f7e-922b-997a3a4d074d" /> ### Window Walker <img width="785" height="518" alt="Screenshot 2025-11-27 173728" src="https://github.com/user-attachments/assets/230f647d-210a-4b60-9068-c8fff890d2c9" /> ### Winget <img width="809" height="497" alt="Screenshot 2025-11-27 174006" src="https://github.com/user-attachments/assets/547529c1-7600-4438-8c3e-e872e0327650" /> ### Search files <img width="819" height="536" alt="image" src="https://github.com/user-attachments/assets/e86accc0-3f85-412d-8fb0-914a5479baff" /> ### Grid Pages <img width="804" height="964" alt="Screenshot 2025-11-27 174055" src="https://github.com/user-attachments/assets/a3bba7db-95df-47ec-9cfb-f38775ab960e" /> <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed
131 lines
4.4 KiB
C#
131 lines
4.4 KiB
C#
// Copyright (c) Microsoft Corporation
|
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
using Microsoft.CommandPalette.Extensions;
|
|
using Microsoft.CommandPalette.Extensions.Toolkit;
|
|
using SamplePagesExtension.Pages;
|
|
using SamplePagesExtension.Pages.IssueSpecificPages;
|
|
|
|
namespace SamplePagesExtension;
|
|
|
|
public partial class SamplesListPage : ListPage
|
|
{
|
|
private readonly IListItem[] _commands = [
|
|
|
|
// List pages
|
|
new ListItem(new SampleListPage())
|
|
{
|
|
Title = "List Page Sample Command",
|
|
Subtitle = "Display a list of items",
|
|
},
|
|
new ListItem(new SampleListPageWithDetails())
|
|
{
|
|
Title = "List Page With Details",
|
|
Subtitle = "A list of items, each with additional details to display",
|
|
},
|
|
new ListItem(new SectionsIndexPage())
|
|
{
|
|
Title = "List Pages With Sections",
|
|
Subtitle = "A list of items, with sections header",
|
|
},
|
|
new ListItem(new SampleUpdatingItemsPage())
|
|
{
|
|
Title = "List page with items that change",
|
|
Subtitle = "The items on the list update themselves in real time",
|
|
},
|
|
new ListItem(new SampleDynamicListPage())
|
|
{
|
|
Title = "Dynamic List Page Command",
|
|
Subtitle = "Changes the list of items in response to the typed query",
|
|
},
|
|
new ListItem(new SampleGridsListPage())
|
|
{
|
|
Title = "Grid views and galleries",
|
|
Subtitle = "Displays items as a gallery",
|
|
},
|
|
new ListItem(new OnLoadPage())
|
|
{
|
|
Title = "Demo of OnLoad/OnUnload",
|
|
Subtitle = "Changes the list of items every time the page is opened / closed",
|
|
},
|
|
new ListItem(new SampleIconPage())
|
|
{
|
|
Title = "Sample Icon Page",
|
|
Subtitle = "A demo of using icons in various ways",
|
|
},
|
|
new ListItem(new SlowListPage())
|
|
{
|
|
Title = "Slow loading list page",
|
|
Subtitle = "A demo of a list page that takes a while to load",
|
|
},
|
|
|
|
// Content pages
|
|
new ListItem(new SampleContentPage())
|
|
{
|
|
Title = "Sample content page",
|
|
Subtitle = "Display mixed forms, markdown, and other types of content",
|
|
},
|
|
new ListItem(new SampleTreeContentPage())
|
|
{
|
|
Title = "Sample nested content",
|
|
Subtitle = "Example of nesting a tree of content",
|
|
},
|
|
new ListItem(new SampleCommentsPage())
|
|
{
|
|
Title = "Sample of nested comments",
|
|
Subtitle = "Demo of using nested trees of content to create a comment thread-like experience",
|
|
Icon = new IconInfo("\uE90A"), // Comment
|
|
},
|
|
new ListItem(new SampleMarkdownPage())
|
|
{
|
|
Title = "Markdown Page Sample Command",
|
|
Subtitle = "Display a page of rendered markdown",
|
|
},
|
|
new ListItem(new SampleMarkdownManyBodies())
|
|
{
|
|
Title = "Markdown with multiple blocks",
|
|
Subtitle = "A page with multiple blocks of rendered markdown",
|
|
},
|
|
new ListItem(new SampleMarkdownDetails())
|
|
{
|
|
Title = "Markdown with details",
|
|
Subtitle = "A page with markdown and details",
|
|
},
|
|
new ListItem(new SampleMarkdownImagesPage())
|
|
{
|
|
Title = "Markdown with images",
|
|
Subtitle = "A page with rendered markdown and images",
|
|
Icon = new IconInfo("\uee71"),
|
|
},
|
|
|
|
// Settings helpers
|
|
new ListItem(new SampleSettingsPage())
|
|
{
|
|
Title = "Sample settings page",
|
|
Subtitle = "A demo of the settings helpers",
|
|
},
|
|
|
|
// Evil edge cases
|
|
// Anything weird that might break the palette - put that in here.
|
|
new ListItem(new EvilSamplesPage())
|
|
{
|
|
Title = "Evil samples",
|
|
Subtitle = "Samples designed to break the palette in many different evil ways",
|
|
},
|
|
new ListItem(new AllIssueSamplesIndexPage())
|
|
{
|
|
Title = "Issue-specific samples",
|
|
Subtitle = "Samples designed to reproduce specific issues",
|
|
}
|
|
];
|
|
|
|
public SamplesListPage()
|
|
{
|
|
Name = "Samples";
|
|
Icon = new IconInfo("\ue946"); // Info
|
|
}
|
|
|
|
public override IListItem[] GetItems() => _commands;
|
|
}
|