Skip to content

Commit

Permalink
add DisplayName and Icon to profile generators; improve identifier sy…
Browse files Browse the repository at this point in the history
…stem
  • Loading branch information
carlos-zamora committed Feb 27, 2025
1 parent 27008bf commit 6932db0
Show file tree
Hide file tree
Showing 21 changed files with 219 additions and 66 deletions.
30 changes: 25 additions & 5 deletions src/cascadia/TerminalSettingsEditor/Extensions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
InitializeComponent();

_extensionPackageTemplateSelector = Resources().Lookup(box_value(L"ExtensionPackageTemplateSelector")).as<Editor::ExtensionPackageTemplateSelector>();
_extensionPackageIdentifierTemplateSelector = Resources().Lookup(box_value(L"ExtensionPackageIdentifierTemplateSelector")).as<Editor::ExtensionPackageTemplateSelector>();
}

void Extensions::OnNavigatedTo(const NavigationEventArgs& e)
{
_ViewModel = e.Parameter().as<Editor::ExtensionsViewModel>();
get_self<ExtensionsViewModel>(_ViewModel)->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
}

void Extensions::ExtensionNavigator_Click(const IInspectable& sender, const RoutedEventArgs& /*args*/)
Expand Down Expand Up @@ -98,7 +99,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
}
}

_NotifyChanges(L"IsExtensionView");
_NotifyChanges(L"IsExtensionView", L"CurrentExtensionPackageIdentifierTemplate");
}
});
}
Expand Down Expand Up @@ -183,6 +184,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
_colorSchemesAddedView = single_threaded_observable_vector<Editor::FragmentColorSchemeViewModel>(std::move(colorSchemesAddedTotal));
}

Windows::UI::Xaml::DataTemplate ExtensionsViewModel::CurrentExtensionPackageIdentifierTemplate() const
{
return _ExtensionPackageIdentifierTemplateSelector.SelectTemplate(CurrentExtensionPackage());
}

// Returns true if the extension is enabled, false otherwise
bool ExtensionsViewModel::GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings)
{
Expand Down Expand Up @@ -262,13 +268,28 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
}
}

// Returns the accessible name for the extension package in the following format:
// "<DisplayName?>, <Source>"
hstring ExtensionPackageViewModel::AccessibleName() const noexcept
{
hstring name;
const auto source = _package.Source();
if (const auto displayName = _package.DisplayName(); !displayName.empty())
{
return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), displayName, source) };
}
return source;
}

// Returns the accessible name for the extension package with the disabled state (if disabled) in the following format:
// "<DisplayName?>, <Source>: <Disabled?>"
hstring ExtensionPackageViewModel::AccessibleNameWithStatus() const noexcept
{
if (Enabled())
{
return _package.Source();
return AccessibleName();
}
return hstring{ fmt::format(L"{}: {}", _package.Source(), RS_(L"Extension_StateDisabled/Text")) };
return hstring{ fmt::format(FMT_COMPILE(L"{}: {}"), AccessibleName(), RS_(L"Extension_StateDisabled/Text")) };
}

DataTemplate ExtensionPackageTemplateSelector::SelectTemplateCore(const IInspectable& item, const DependencyObject& /*container*/)
Expand All @@ -286,7 +307,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
}
return DefaultTemplate();
}
assert(false);
return nullptr;
}
}
5 changes: 4 additions & 1 deletion src/cascadia/TerminalSettingsEditor/Extensions.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
WINRT_PROPERTY(Editor::ExtensionsViewModel, ViewModel, nullptr);

private:
Editor::ExtensionPackageTemplateSelector _extensionPackageTemplateSelector;
Editor::ExtensionPackageTemplateSelector _extensionPackageIdentifierTemplateSelector;
};

struct ExtensionsViewModel : ExtensionsViewModelT<ExtensionsViewModel>, ViewModelHelper<ExtensionsViewModel>
Expand All @@ -38,6 +38,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
ExtensionsViewModel(const Model::CascadiaSettings& settings, const Editor::ColorSchemesPageViewModel& colorSchemesPageVM);

// Properties
Windows::UI::Xaml::DataTemplate CurrentExtensionPackageIdentifierTemplate() const;
bool IsExtensionView() const noexcept { return _CurrentExtensionPackage != nullptr; }
bool NoExtensionPackages() const noexcept { return _extensionPackages.Size() == 0; }
bool NoProfilesModified() const noexcept { return _profilesModifiedView.Size() == 0; }
Expand All @@ -62,6 +63,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
til::typed_event<IInspectable, Editor::ColorSchemeViewModel> NavigateToColorSchemeRequested;

VIEW_MODEL_OBSERVABLE_PROPERTY(Editor::ExtensionPackageViewModel, CurrentExtensionPackage, nullptr);
WINRT_PROPERTY(Editor::ExtensionPackageTemplateSelector, ExtensionPackageIdentifierTemplateSelector, nullptr);

private:
Model::CascadiaSettings _settings;
Expand All @@ -85,6 +87,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
bool Enabled() const;
void Enabled(bool val);
hstring AccessibleName() const noexcept;
hstring AccessibleNameWithStatus() const noexcept;
Windows::Foundation::Collections::IObservableVector<Editor::FragmentExtensionViewModel> FragmentExtensions() { return _fragmentExtensions; }

private:
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalSettingsEditor/Extensions.idl
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace Microsoft.Terminal.Settings.Editor
{
// Properties
ExtensionPackageViewModel CurrentExtensionPackage;
Windows.UI.Xaml.DataTemplate CurrentExtensionPackageIdentifierTemplate { get; };
Boolean IsExtensionView { get; };
Boolean NoExtensionPackages { get; };
Boolean NoProfilesModified { get; };
Expand All @@ -40,6 +41,7 @@ namespace Microsoft.Terminal.Settings.Editor
Boolean Enabled;
String Scope { get; };
String AccessibleName { get; };
String AccessibleNameWithStatus { get; };
IVector<FragmentExtensionViewModel> FragmentExtensions { get; };
}

Expand Down
139 changes: 93 additions & 46 deletions src/cascadia/TerminalSettingsEditor/Extensions.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,47 @@
<Setter Property="VerticalScrollBarVisibility" Value="Disabled" />
</Style>

<local:ExtensionPackageTemplateSelector x:Key="ExtensionPackageTemplateSelector"
DefaultTemplate="{StaticResource DefaultExtensionNavigatorTemplate}"
ComplexTemplate="{StaticResource ComplexExtensionNavigatorTemplate}" />
<local:ExtensionPackageTemplateSelector x:Key="ExtensionPackageIdentifierTemplateSelector"
ComplexTemplate="{StaticResource ComplexExtensionIdentifierTemplate}"
DefaultTemplate="{StaticResource DefaultExtensionIdentifierTemplate}" />

<DataTemplate x:Key="DefaultExtensionIdentifierTemplate"
x:DataType="local:ExtensionPackageViewModel">
<TextBlock Text="{x:Bind Package.Source}" />
</DataTemplate>

<DataTemplate x:Key="ComplexExtensionIdentifierTemplate"
x:DataType="local:ExtensionPackageViewModel">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<IconSourceElement Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="0"
Width="32"
Height="32"
Margin="0,0,8,0"
IconSource="{x:Bind mtu:IconPathConverter.IconSourceWUX(Package.Icon)}" />
<TextBlock Grid.Row="0"
Grid.Column="1"
Text="{x:Bind Package.DisplayName}" />
<TextBlock Grid.Row="1"
Grid.Column="1"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{x:Bind Package.Source}" />
</Grid>
</DataTemplate>

<local:ExtensionPackageTemplateSelector x:Key="ExtensionPackageNavigatorTemplateSelector"
ComplexTemplate="{StaticResource ComplexExtensionNavigatorTemplate}"
DefaultTemplate="{StaticResource DefaultExtensionNavigatorTemplate}" />

<DataTemplate x:Key="DefaultExtensionNavigatorTemplate"
x:DataType="local:ExtensionPackageViewModel">
Expand All @@ -55,8 +93,9 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<TextBlock Grid.Column="0"
Text="{x:Bind Package.Source}"/>
<ContentPresenter Content="{x:Bind}"
ContentTemplate="{StaticResource DefaultExtensionIdentifierTemplate}" />

<TextBlock x:Uid="Extension_StateDisabled"
Grid.Column="1"
HorizontalAlignment="Right"
Expand All @@ -69,39 +108,21 @@

<DataTemplate x:Key="ComplexExtensionNavigatorTemplate"
x:DataType="local:ExtensionPackageViewModel">
<Button AutomationProperties.Name="{x:Bind AccessibleName}"
<Button AutomationProperties.Name="{x:Bind AccessibleNameWithStatus}"
Click="ExtensionNavigator_Click"
Style="{StaticResource NavigatorButtonStyle}"
Tag="{x:Bind}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>

<IconSourceElement Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
Width="32"
Height="32"
Margin="0,0,8,0"
IconSource="{x:Bind mtu:IconPathConverter.IconSourceWUX(Package.Icon)}"/>
<TextBlock Grid.Column="1"
Grid.Row="0"
Text="{x:Bind Package.DisplayName}"/>
<TextBlock Grid.Column="1"
Grid.Row="1"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{x:Bind Package.Source}" />
<ContentPresenter Content="{x:Bind}"
ContentTemplate="{StaticResource ComplexExtensionIdentifierTemplate}" />

<TextBlock x:Uid="Extension_StateDisabled"
Grid.Column="2"
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Style="{StaticResource SecondaryTextBlockStyle}"
Expand Down Expand Up @@ -142,14 +163,19 @@
</local:SettingContainer>
</DataTemplate>

<!-- This styling matches that of ExpanderSettingContainerStyle for consistency -->
<Style x:Key="ExpanderStyle"
TargetType="muxc:Expander">
<Setter Property="MinHeight" Value="64" />
<Setter Property="Margin" Value="0,4,0,0" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

<DataTemplate x:Key="JsonTemplate"
x:DataType="local:FragmentExtensionViewModel">
<!-- This styling matches that of ExpanderSettingContainerStyle for consistency -->
<muxc:Expander MinHeight="64"
Margin="0,4,0,0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Header="{x:Bind Fragment.JsonSource}">
<muxc:Expander Header="{x:Bind Fragment.JsonSource}"
Style="{StaticResource ExpanderStyle}">
<ScrollViewer Style="{StaticResource CodeBlockScrollViewerStyle}">
<TextBlock Style="{StaticResource CodeBlockStyle}"
Text="{x:Bind Fragment.Json}" />
Expand Down Expand Up @@ -342,7 +368,7 @@
Style="{StaticResource ItalicDisclaimerStyle}"
Visibility="{x:Bind ViewModel.NoExtensionPackages, Mode=OneWay}" />
<ItemsControl IsTabStop="False"
ItemTemplateSelector="{StaticResource ExtensionPackageTemplateSelector}"
ItemTemplateSelector="{StaticResource ExtensionPackageNavigatorTemplateSelector}"
ItemsSource="{x:Bind ViewModel.ExtensionPackages}" />
</StackPanel>

Expand All @@ -352,15 +378,36 @@
Margin="0,-20,0,0"
Visibility="{x:Bind ViewModel.IsExtensionView, Mode=OneWay}">
<!-- Extension Status -->
<local:SettingContainer Header="{x:Bind ViewModel.CurrentExtensionPackage.Package.Source, Mode=OneWay}"
StartExpanded="True"
Style="{StaticResource ExpanderSettingContainerStyleWithComplexPreview}">
<local:SettingContainer.CurrentValue>
<ToggleSwitch Style="{StaticResource ToggleSwitchInExpanderStyle}"
Tag="{x:Bind ViewModel.CurrentExtensionPackage.Package.Source, Mode=OneWay}"
IsOn="{x:Bind ViewModel.CurrentExtensionPackage.Enabled, Mode=TwoWay}" />
</local:SettingContainer.CurrentValue>
<local:SettingContainer.Content>
<muxc:Expander AutomationProperties.Name="{x:Bind ViewModel.CurrentExtensionPackage.AccessibleName, Mode=OneWay}"
IsExpanded="True"
Style="{StaticResource ExpanderStyle}">
<muxc:Expander.Header>
<Grid MinHeight="64">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<!--
BODGY
Theoretically, you could use a ContentTemplateSelector directly. However, that doesn't work.
For some reason, we just get the object type's ToString called and the selector gets nullptr as a parameter.
Adding the template as a view model property is a workaround.
-->
<ContentPresenter Grid.Column="0"
VerticalAlignment="Center"
Content="{x:Bind ViewModel.CurrentExtensionPackage, Mode=OneWay}"
ContentTemplate="{x:Bind ViewModel.CurrentExtensionPackageIdentifierTemplate, Mode=OneWay}" />

<ToggleSwitch Grid.Column="1"
Margin="0"
AutomationProperties.Name="{x:Bind ViewModel.CurrentExtensionPackage.AccessibleName, Mode=OneWay}"
IsOn="{x:Bind ViewModel.CurrentExtensionPackage.Enabled, Mode=TwoWay}"
Style="{StaticResource ToggleSwitchInExpanderStyle}"
Tag="{x:Bind ViewModel.CurrentExtensionPackage.Package.Source, Mode=OneWay}" />
</Grid>
</muxc:Expander.Header>
<muxc:Expander.Content>
<StackPanel>
<!-- Scope -->
<local:SettingContainer x:Uid="Extensions_Scope"
Expand All @@ -372,8 +419,8 @@
ItemTemplate="{StaticResource JsonTemplate}"
ItemsSource="{x:Bind ViewModel.CurrentExtensionPackage.FragmentExtensions, Mode=OneWay}" />
</StackPanel>
</local:SettingContainer.Content>
</local:SettingContainer>
</muxc:Expander.Content>
</muxc:Expander>
</StackPanel>

<!-- Grouping: Modified Profiles -->
Expand Down
4 changes: 3 additions & 1 deletion src/cascadia/TerminalSettingsEditor/MainPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
if (const auto& currentExtensionPackage = _extensionsVM.CurrentExtensionPackage())
{
const auto crumb = winrt::make<Breadcrumb>(box_value(currentExtensionPackage), currentExtensionPackage.Package().Source(), BreadcrumbSubPage::Extensions_Extension);
const auto& pkg = currentExtensionPackage.Package();
const auto label = pkg.DisplayName().empty() ? pkg.Source() : pkg.DisplayName();
const auto crumb = winrt::make<Breadcrumb>(box_value(currentExtensionPackage), label, BreadcrumbSubPage::Extensions_Extension);
_breadcrumbs.Append(crumb);
SettingsMainPage_ScrollViewer().ScrollToVerticalOffset(0);
}
Expand Down
2 changes: 0 additions & 2 deletions src/cascadia/TerminalSettingsEditor/NewTabMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
InitializeComponent();

_entryTemplateSelector = Resources().Lookup(box_value(L"NewTabMenuEntryTemplateSelector")).as<Editor::NewTabMenuEntryTemplateSelector>();

// Ideally, we'd bind IsEnabled to something like mtu:Converters.isEmpty(NewTabMenuListView.SelectedItems.Size) in the XAML,
// but the XAML compiler can't find NewTabMenuListView when we try that. Rather than copying the list of selected items over
// to the view model, we'll just do this instead (much simpler).
Expand Down
1 change: 0 additions & 1 deletion src/cascadia/TerminalSettingsEditor/NewTabMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
WINRT_OBSERVABLE_PROPERTY(Editor::NewTabMenuViewModel, ViewModel, _PropertyChangedHandlers, nullptr);

private:
Editor::NewTabMenuEntryTemplateSelector _entryTemplateSelector{ nullptr };
Editor::NewTabMenuEntryViewModel _draggedEntry{ nullptr };

void _ScrollToEntry(const Editor::NewTabMenuEntryViewModel& entry);
Expand Down
Loading

0 comments on commit 6932db0

Please sign in to comment.