Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/cascadia/TerminalSettingsEditor/CommonResources.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -1267,4 +1267,24 @@
</Setter.Value>
</Setter>
</Style>

<Style x:Key="NewInfoBadge"
TargetType="muxc:InfoBadge">
<Setter Property="Padding" Value="5,1,5,2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="muxc:InfoBadge">
<Border x:Name="RootGrid"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.InfoBadgeCornerRadius}">
<TextBlock x:Uid="NewInfoBadgeTextBlock"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="10" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
17 changes: 16 additions & 1 deletion src/cascadia/TerminalSettingsEditor/Extensions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ using namespace winrt::Windows::UI::Xaml::Navigation;

namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
static constexpr std::wstring_view ExtensionPageId{ L"page.extensions" };

Extensions::Extensions()
{
InitializeComponent();
Expand All @@ -35,7 +37,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void Extensions::OnNavigatedTo(const NavigationEventArgs& e)
{
_ViewModel = e.Parameter().as<Editor::ExtensionsViewModel>();
get_self<ExtensionsViewModel>(_ViewModel)->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
auto vmImpl = get_self<ExtensionsViewModel>(_ViewModel);
vmImpl->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
vmImpl->MarkAsVisited();
}

void Extensions::ExtensionNavigator_Click(const IInspectable& sender, const RoutedEventArgs& /*args*/)
Expand Down Expand Up @@ -203,6 +207,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
return _ExtensionPackageIdentifierTemplateSelector.SelectTemplate(CurrentExtensionPackage());
}

bool ExtensionsViewModel::DisplayBadge() const noexcept
{
return !Model::ApplicationState::SharedInstance().BadgeDismissed(ExtensionPageId);
}

// Returns true if the extension is enabled, false otherwise
bool ExtensionsViewModel::GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings)
{
Expand Down Expand Up @@ -263,6 +272,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
NavigateToColorSchemeRequested.raise(*this, nullptr);
}

void ExtensionsViewModel::MarkAsVisited()
{
Model::ApplicationState::SharedInstance().DismissBadge(ExtensionPageId);
_NotifyChanges(L"DisplayBadge");
}

hstring ExtensionPackageViewModel::Scope() const noexcept
{
return _package.Scope() == Model::FragmentScope::User ? RS_(L"Extensions_ScopeUser") : RS_(L"Extensions_ScopeSystem");
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalSettingsEditor/Extensions.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
bool NoProfilesModified() const noexcept { return _profilesModifiedView.Size() == 0; }
bool NoProfilesAdded() const noexcept { return _profilesAddedView.Size() == 0; }
bool NoSchemesAdded() const noexcept { return _colorSchemesAddedView.Size() == 0; }
bool DisplayBadge() const noexcept;

// Views
Windows::Foundation::Collections::IObservableVector<Editor::ExtensionPackageViewModel> ExtensionPackages() const noexcept { return _extensionPackages; }
Expand All @@ -55,6 +56,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void UpdateSettings(const Model::CascadiaSettings& settings, const Editor::ColorSchemesPageViewModel& colorSchemesPageVM);
void NavigateToProfile(const guid profileGuid);
void NavigateToColorScheme(const Editor::ColorSchemeViewModel& schemeVM);
void MarkAsVisited();

static bool GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings);
static void SetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings, bool enableExt);
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalSettingsEditor/Extensions.idl
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace Microsoft.Terminal.Settings.Editor
Boolean NoProfilesModified { get; };
Boolean NoProfilesAdded { get; };
Boolean NoSchemesAdded { get; };
Boolean DisplayBadge { get; };

// Views
IVector<ExtensionPackageViewModel> ExtensionPackages { get; };
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalSettingsEditor/MainPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
winrt::Windows::UI::Xaml::Media::Brush BackgroundBrush();

Windows::Foundation::Collections::IObservableVector<IInspectable> Breadcrumbs() noexcept;
Editor::ExtensionsViewModel ExtensionsVM() const noexcept { return _extensionsVM; }

til::typed_event<Windows::Foundation::IInspectable, Model::SettingsTarget> OpenJson;

Expand Down
3 changes: 3 additions & 0 deletions src/cascadia/TerminalSettingsEditor/MainPage.idl
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import "Extensions.idl";

namespace Microsoft.Terminal.Settings.Editor
{
// Due to a XAML Compiler bug, it is hard for us to propagate an HWND into a XAML-using runtimeclass.
Expand Down Expand Up @@ -43,6 +45,7 @@ namespace Microsoft.Terminal.Settings.Editor
void SetHostingWindow(UInt64 window);

Windows.Foundation.Collections.IObservableVector<IInspectable> Breadcrumbs { get; };
ExtensionsViewModel ExtensionsVM { get; };

Windows.UI.Xaml.Media.Brush BackgroundBrush { get; };
}
Expand Down
4 changes: 4 additions & 0 deletions src/cascadia/TerminalSettingsEditor/MainPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@
<muxc:NavigationViewItem.Icon>
<FontIcon Glyph="&#xEA86;" />
</muxc:NavigationViewItem.Icon>
<muxc:NavigationViewItem.InfoBadge>
<muxc:InfoBadge Style="{StaticResource NewInfoBadge}"
Visibility="{x:Bind ExtensionsVM.DisplayBadge, Mode=OneWay}" />
</muxc:NavigationViewItem.InfoBadge>
</muxc:NavigationViewItem>

<muxc:NavigationViewItemHeader x:Uid="Nav_Profiles" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2403,4 +2403,8 @@
<value>Disabled</value>
<comment>Text displayed when an extension is disabled</comment>
</data>
<data name="NewInfoBadgeTextBlock.Text" xml:space="preserve">
<value>NEW</value>
<comment>Text is used on an info badge for new navigation items. Must be all caps.</comment>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not believe the translators actually read these. or exist.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it may be beneficial for us long-term if we replaced the comments with ones like

"NEW" as in "New item!"

in this case. Even if there aren't always human translators, the potential LLM translators may be "thankful"? for it. 😅

</data>
</root>
25 changes: 25 additions & 0 deletions src/cascadia/TerminalSettingsModel/ApplicationState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,31 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
_throttler();
}

bool ApplicationState::DismissBadge(const hstring& badgeId)
{
bool inserted{ false };
{
const auto state = _state.lock();
if (!state->DismissedBadges)
{
state->DismissedBadges = std::unordered_set<hstring>{};
}
inserted = state->DismissedBadges->insert(badgeId).second;
}
_throttler();
return inserted;
}

bool ApplicationState::BadgeDismissed(const hstring& badgeId) const
{
const auto state = _state.lock_shared();
if (state->DismissedBadges)
{
return state->DismissedBadges->contains(badgeId);
}
return false;
}

// Generate all getter/setters
#define MTSM_APPLICATION_STATE_GEN(source, type, name, key, ...) \
type ApplicationState::name() const noexcept \
Expand Down
5 changes: 4 additions & 1 deletion src/cascadia/TerminalSettingsModel/ApplicationState.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
X(FileSource::Local, Windows::Foundation::Collections::IVector<Model::WindowLayout>, PersistedWindowLayouts, "persistedWindowLayouts") \
X(FileSource::Shared, Windows::Foundation::Collections::IVector<hstring>, RecentCommands, "recentCommands") \
X(FileSource::Shared, Windows::Foundation::Collections::IVector<winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage>, DismissedMessages, "dismissedMessages") \
X(FileSource::Local, Windows::Foundation::Collections::IVector<hstring>, AllowedCommandlines, "allowedCommandlines")
X(FileSource::Local, Windows::Foundation::Collections::IVector<hstring>, AllowedCommandlines, "allowedCommandlines") \
X(FileSource::Local, std::unordered_set<hstring>, DismissedBadges, "dismissedBadges")

struct WindowLayout : WindowLayoutT<WindowLayout>
{
Expand Down Expand Up @@ -70,6 +71,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
Json::Value ToJson(FileSource parseSource) const noexcept;

void AppendPersistedWindowLayout(Model::WindowLayout layout);
bool DismissBadge(const hstring& badgeId);
bool BadgeDismissed(const hstring& badgeId) const;

// State getters/setters
#define MTSM_APPLICATION_STATE_GEN(source, type, name, key, ...) \
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalSettingsModel/ApplicationState.idl
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ namespace Microsoft.Terminal.Settings.Model
void Reset();

void AppendPersistedWindowLayout(WindowLayout layout);
Boolean DismissBadge(String badgeId);
Boolean BadgeDismissed(String badgeId);

String SettingsHash;
Windows.Foundation.Collections.IVector<WindowLayout> PersistedWindowLayouts;
Expand Down
Loading