-
Notifications
You must be signed in to change notification settings - Fork 8.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Extensions page to Settings UI #18559
base: main
Are you sure you want to change the base?
Conversation
This comment was marked as outdated.
This comment was marked as outdated.
Remaining work
For any reviewers that come along, let me know what you think! 😊 What else would you like to see here? |
@@ -59,7 +59,7 @@ | |||
<IconSourceElement Grid.Column="0" | |||
Width="16" | |||
Height="16" | |||
IconSource="{x:Bind mtu:IconPathConverter.IconSourceWUX(Icon), Mode=OneTime}" /> | |||
IconSource="{x:Bind mtu:IconPathConverter.IconSourceWUX(EvaluatedIcon), Mode=OneTime}" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 Admittedly, a drive by. Happy to pull this out into a separate PR if desired.
@@ -1199,7 +1199,7 @@ | |||
<Setter Property="HorizontalAlignment" Value="Stretch" /> | |||
<Setter Property="CornerRadius" Value="{ThemeResource ControlCornerRadius}" /> | |||
<Setter Property="VerticalAlignment" Value="Stretch" /> | |||
<Setter Property="HorizontalContentAlignment" Value="Left" /> | |||
<Setter Property="HorizontalContentAlignment" Value="Stretch" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 Had to update this style a bit to enable functionality for showing "Disabled" on the right side when an extension was disabled.
The way I made that work is that we have a 2-column grid. We need the grid to take up the entire horizontal content, so we need to set HorizontalContentAlignmen to stretch
<!-- TODO CARLOS: Icon --> | ||
<!-- TODO GH #18281: Icon --> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 This one's on me 😅
@@ -227,6 +227,45 @@ | |||
</Setter> | |||
</Style> | |||
|
|||
<!-- A basic setting container displaying immutable text as content --> | |||
<Style x:Key="SettingContainerWithTextContent" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 Used to display the Scope for an extension. Also allowed me to apply the SecondaryTextBlockStyle to the text shown on the right side (aka the value of Scope)
if (_DisabledProfileSources) | ||
{ | ||
globals->_DisabledProfileSources = winrt::single_threaded_vector<hstring>(); | ||
for (const auto& src : *_DisabledProfileSources) | ||
{ | ||
globals->_DisabledProfileSources->Append(src); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 Surprised we never copied these over! It's ok though! We didn't have a way for users to modify DisabledProfileSources via the SUI, so this never was a problem!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For cloning it you can use wil::to_vector
: https://github.com/microsoft/wil/blob/1b9fd9d9482a16cd176fcdca8dd49c7fd3ee5fa0/include/wil/cppwinrt_helpers.h#L294-L311
for (const auto&& entry : fragExt.ModifiedProfilesView()) | ||
{ | ||
// Ensure entry successfully modifies a profile before creating and registering the object | ||
if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid())) | ||
{ | ||
auto vm = winrt::make<FragmentProfileViewModel>(entry, fragExt, deducedProfile); | ||
currentProfilesModified.push_back(vm); | ||
if (extensionEnabled) | ||
{ | ||
profilesModifiedTotal.push_back(vm); | ||
} | ||
} | ||
} | ||
|
||
for (const auto&& entry : fragExt.NewProfilesView()) | ||
{ | ||
// Ensure entry successfully points to a profile before creating and registering the object. | ||
// The profile may have been removed by the user. | ||
if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid())) | ||
{ | ||
auto vm = winrt::make<FragmentProfileViewModel>(entry, fragExt, deducedProfile); | ||
currentProfilesAdded.push_back(vm); | ||
if (extensionEnabled) | ||
{ | ||
profilesAddedTotal.push_back(vm); | ||
} | ||
} | ||
} | ||
|
||
for (const auto&& entry : fragExt.ColorSchemesView()) | ||
{ | ||
for (const auto& schemeVM : _colorSchemesPageVM.AllColorSchemes()) | ||
{ | ||
if (schemeVM.Name() == entry.ColorSchemeName()) | ||
{ | ||
auto vm = winrt::make<FragmentColorSchemeViewModel>(entry, fragExt, schemeVM); | ||
currentColorSchemesAdded.push_back(vm); | ||
if (extensionEnabled) | ||
{ | ||
colorSchemesAddedTotal.push_back(vm); | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm only displaying the ones that were added successfully and point to something that already exists.
Long-term, do we want to do more here? Perhaps show the ones that weren't added successfully? I'm just not sure what the next steps would be and how we would want to approach this issue.
Summary of the Pull Request
Adds an Extensions page to the Settings UI. This lets you enable/disable extensions and see how they affect your settings (i.e. adding/modifying profiles and adding color schemes). This page is specifically designed for fragment extensions, but can be expanded on in the future as we develop a more advanced extensions model.
Detailed Description of the Pull Request / Additional comments
FragmentSettings
represents a parsed json fragment extension.FragmentProfileEntry
andFragmentColorSchemeEntry
are used to track profiles and color schemes added/modifiedExtensionsViewModel
operates as the main view model for the page.FragmentProfileViewModel
andFragmentColorSchemeViewModel
are used to reference specific components of fragments. They also provide support for navigating to the linked profile or color scheme via the settings UI!ExtensionPackageViewModel
is a VM for a group of extensions exposed by a single source. This is mainly needed because a single source can have multiple JSON fragments in it. This is used for the navigators on the main page. Can be extended to provide additional information (i.e. package logo, package name, etc.)Extensions.xaml
uses a lot of data templates. These are reused inItemsControl
s to display extension components.Follow-ups
AppExtension