Skip to content

Commit 641b654

Browse files
committed
Add Badge to highlight new Extensions Page
1 parent b963d60 commit 641b654

File tree

9 files changed

+62
-2
lines changed

9 files changed

+62
-2
lines changed

src/cascadia/TerminalSettingsEditor/Extensions.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ using namespace winrt::Windows::UI::Xaml::Navigation;
2020

2121
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
2222
{
23+
static constexpr std::wstring_view ExtensionPageId{ L"page.extensions" };
24+
2325
Extensions::Extensions()
2426
{
2527
InitializeComponent();
@@ -35,7 +37,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
3537
void Extensions::OnNavigatedTo(const NavigationEventArgs& e)
3638
{
3739
_ViewModel = e.Parameter().as<Editor::ExtensionsViewModel>();
38-
get_self<ExtensionsViewModel>(_ViewModel)->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
40+
auto vmImpl = get_self<ExtensionsViewModel>(_ViewModel);
41+
vmImpl->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
42+
vmImpl->MarkAsVisited();
3943
}
4044

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

210+
bool ExtensionsViewModel::DisplayBadge() const noexcept
211+
{
212+
return !Model::ApplicationState::SharedInstance().BadgeDismissed(ExtensionPageId);
213+
}
214+
206215
// Returns true if the extension is enabled, false otherwise
207216
bool ExtensionsViewModel::GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings)
208217
{
@@ -263,6 +272,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
263272
NavigateToColorSchemeRequested.raise(*this, nullptr);
264273
}
265274

275+
void ExtensionsViewModel::MarkAsVisited()
276+
{
277+
Model::ApplicationState::SharedInstance().DismissBadge(ExtensionPageId);
278+
_NotifyChanges(L"DisplayBadge");
279+
}
280+
266281
hstring ExtensionPackageViewModel::Scope() const noexcept
267282
{
268283
return _package.Scope() == Model::FragmentScope::User ? RS_(L"Extensions_ScopeUser") : RS_(L"Extensions_ScopeSystem");

src/cascadia/TerminalSettingsEditor/Extensions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
4444
bool NoProfilesModified() const noexcept { return _profilesModifiedView.Size() == 0; }
4545
bool NoProfilesAdded() const noexcept { return _profilesAddedView.Size() == 0; }
4646
bool NoSchemesAdded() const noexcept { return _colorSchemesAddedView.Size() == 0; }
47+
bool DisplayBadge() const noexcept;
4748

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

5961
static bool GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings);
6062
static void SetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings, bool enableExt);

src/cascadia/TerminalSettingsEditor/Extensions.idl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace Microsoft.Terminal.Settings.Editor
2121
Boolean NoProfilesModified { get; };
2222
Boolean NoProfilesAdded { get; };
2323
Boolean NoSchemesAdded { get; };
24+
Boolean DisplayBadge { get; };
2425

2526
// Views
2627
IVector<ExtensionPackageViewModel> ExtensionPackages { get; };

src/cascadia/TerminalSettingsEditor/MainPage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
4545
winrt::Windows::UI::Xaml::Media::Brush BackgroundBrush();
4646

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

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

src/cascadia/TerminalSettingsEditor/MainPage.idl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4+
import "Extensions.idl";
5+
46
namespace Microsoft.Terminal.Settings.Editor
57
{
68
// Due to a XAML Compiler bug, it is hard for us to propagate an HWND into a XAML-using runtimeclass.
@@ -43,6 +45,7 @@ namespace Microsoft.Terminal.Settings.Editor
4345
void SetHostingWindow(UInt64 window);
4446

4547
Windows.Foundation.Collections.IObservableVector<IInspectable> Breadcrumbs { get; };
48+
ExtensionsViewModel ExtensionsVM { get; };
4649

4750
Windows.UI.Xaml.Media.Brush BackgroundBrush { get; };
4851
}

src/cascadia/TerminalSettingsEditor/MainPage.xaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@
161161
<muxc:NavigationViewItem.Icon>
162162
<FontIcon Glyph="&#xEA86;" />
163163
</muxc:NavigationViewItem.Icon>
164+
<muxc:NavigationViewItem.InfoBadge>
165+
<muxc:InfoBadge Visibility="{x:Bind ExtensionsVM.DisplayBadge, Mode=OneWay}"
166+
Value="1" />
167+
</muxc:NavigationViewItem.InfoBadge>
164168
</muxc:NavigationViewItem>
165169

166170
<muxc:NavigationViewItemHeader x:Uid="Nav_Profiles" />

src/cascadia/TerminalSettingsModel/ApplicationState.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,35 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
309309
_throttler();
310310
}
311311

312+
bool ApplicationState::DismissBadge(const hstring& badgeId)
313+
{
314+
bool inserted{ false };
315+
{
316+
const auto state = _state.lock();
317+
if (!state->DismissedBadges)
318+
{
319+
state->DismissedBadges = std::unordered_set<hstring>{};
320+
}
321+
if (!state->DismissedBadges->contains(badgeId))
322+
{
323+
state->DismissedBadges->insert(badgeId);
324+
inserted = true;
325+
}
326+
}
327+
_throttler();
328+
return inserted;
329+
}
330+
331+
bool ApplicationState::BadgeDismissed(const hstring& badgeId) const
332+
{
333+
const auto state = _state.lock_shared();
334+
if (state->DismissedBadges)
335+
{
336+
return state->DismissedBadges->contains(badgeId);
337+
}
338+
return false;
339+
}
340+
312341
// Generate all getter/setters
313342
#define MTSM_APPLICATION_STATE_GEN(source, type, name, key, ...) \
314343
type ApplicationState::name() const noexcept \

src/cascadia/TerminalSettingsModel/ApplicationState.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
4040
X(FileSource::Local, Windows::Foundation::Collections::IVector<Model::WindowLayout>, PersistedWindowLayouts, "persistedWindowLayouts") \
4141
X(FileSource::Shared, Windows::Foundation::Collections::IVector<hstring>, RecentCommands, "recentCommands") \
4242
X(FileSource::Shared, Windows::Foundation::Collections::IVector<winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage>, DismissedMessages, "dismissedMessages") \
43-
X(FileSource::Local, Windows::Foundation::Collections::IVector<hstring>, AllowedCommandlines, "allowedCommandlines")
43+
X(FileSource::Local, Windows::Foundation::Collections::IVector<hstring>, AllowedCommandlines, "allowedCommandlines") \
44+
X(FileSource::Local, std::unordered_set<hstring>, DismissedBadges, "dismissedBadges")
4445

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

7273
void AppendPersistedWindowLayout(Model::WindowLayout layout);
74+
bool DismissBadge(const hstring& badgeId);
75+
bool BadgeDismissed(const hstring& badgeId) const;
7376

7477
// State getters/setters
7578
#define MTSM_APPLICATION_STATE_GEN(source, type, name, key, ...) \

src/cascadia/TerminalSettingsModel/ApplicationState.idl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace Microsoft.Terminal.Settings.Model
3333
void Reset();
3434

3535
void AppendPersistedWindowLayout(WindowLayout layout);
36+
Boolean DismissBadge(String badgeId);
37+
Boolean BadgeDismissed(String badgeId);
3638

3739
String SettingsHash;
3840
Windows.Foundation.Collections.IVector<WindowLayout> PersistedWindowLayouts;

0 commit comments

Comments
 (0)