Skip to content

Commit 7368458

Browse files
[CmdPal] Single settings window (#38069)
## Summary of the Pull Request Make settings window single. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] **Closes:** zadjii-msft#581 ## Validation Steps Performed Manual test. - Open settings windows multiple times - Activate minimized settings window
1 parent 4d7691a commit 7368458

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) Microsoft Corporation
2+
// The Microsoft Corporation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
namespace Microsoft.CmdPal.UI.ViewModels.Messages;
6+
7+
public record SettingsWindowClosedMessage
8+
{
9+
}

src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs

+11-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public sealed partial class ShellPage : Microsoft.UI.Xaml.Controls.Page,
3535
IRecipient<ClearSearchMessage>,
3636
IRecipient<HandleCommandResultMessage>,
3737
IRecipient<LaunchUriMessage>,
38+
IRecipient<SettingsWindowClosedMessage>,
3839
INotifyPropertyChanged
3940
{
4041
private readonly DispatcherQueue _queue = DispatcherQueue.GetForCurrentThread();
@@ -50,6 +51,7 @@ public sealed partial class ShellPage : Microsoft.UI.Xaml.Controls.Page,
5051

5152
private readonly Lock _invokeLock = new();
5253
private Task? _handleInvokeTask;
54+
private SettingsWindow? _settingsWindow;
5355

5456
public ShellViewModel ViewModel { get; private set; } = App.Current.Services.GetService<ShellViewModel>()!;
5557

@@ -65,6 +67,7 @@ public ShellPage()
6567
WeakReferenceMessenger.Default.Register<HandleCommandResultMessage>(this);
6668
WeakReferenceMessenger.Default.Register<OpenSettingsMessage>(this);
6769
WeakReferenceMessenger.Default.Register<HotkeySummonMessage>(this);
70+
WeakReferenceMessenger.Default.Register<SettingsWindowClosedMessage>(this);
6871

6972
WeakReferenceMessenger.Default.Register<ShowDetailsMessage>(this);
7073
WeakReferenceMessenger.Default.Register<HideDetailsMessage>(this);
@@ -396,8 +399,12 @@ public void Receive(OpenSettingsMessage message)
396399
// Also hide our details pane about here, if we had one
397400
HideDetails();
398401

399-
var settingsWindow = new SettingsWindow();
400-
settingsWindow.Activate();
402+
if (_settingsWindow == null)
403+
{
404+
_settingsWindow = new SettingsWindow();
405+
}
406+
407+
_settingsWindow.Activate();
401408

402409
WeakReferenceMessenger.Default.Send<UpdateCommandBarMessage>(new(null));
403410
});
@@ -458,6 +465,8 @@ public void Receive(HotkeySummonMessage message)
458465
_ = DispatcherQueue.TryEnqueue(() => SummonOnUiThread(message));
459466
}
460467

468+
public void Receive(SettingsWindowClosedMessage message) => _settingsWindow = null;
469+
461470
private void SummonOnUiThread(HotkeySummonMessage message)
462471
{
463472
var settings = App.Current.Services.GetService<SettingsModel>()!;

src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/SettingsWindow.xaml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
xmlns:ui="using:CommunityToolkit.WinUI"
1010
Title="SettingsWindow"
1111
Activated="Window_Activated"
12+
Closed="Window_Closed"
1213
mc:Ignorable="d">
1314
<Window.SystemBackdrop>
1415
<MicaBackdrop />

src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/SettingsWindow.xaml.cs

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ private void Window_Activated(object sender, WindowActivatedEventArgs args)
105105
WeakReferenceMessenger.Default.Send<WindowActivatedEventArgs>(args);
106106
}
107107

108+
private void Window_Closed(object sender, WindowEventArgs args)
109+
{
110+
WeakReferenceMessenger.Default.Send<SettingsWindowClosedMessage>();
111+
}
112+
108113
public void Receive(QuitMessage message)
109114
{
110115
// This might come in on a background thread

0 commit comments

Comments
 (0)