From 18ccb8734b8b6ffa184af75d499b6490e6fdf23f Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Tue, 14 May 2024 11:24:08 -0700 Subject: [PATCH 1/6] strings and url --- tools/Utilities/src/Strings/en-us/Resources.resw | 7 +++---- .../Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/Utilities/src/Strings/en-us/Resources.resw b/tools/Utilities/src/Strings/en-us/Resources.resw index 750d5e7f02..36a0d5b43f 100644 --- a/tools/Utilities/src/Strings/en-us/Resources.resw +++ b/tools/Utilities/src/Strings/en-us/Resources.resw @@ -118,14 +118,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - A quick utility for managing environment variables. + Create and manage variable sets with a lightweight UI. Environment Variables Editor - Quick and simple utility for managing hosts file. - ;Locked={"hosts"} + Add, filter, or remove file entries in less time. Hosts File Editor @@ -142,7 +141,7 @@ Project Ironsides - A quick little utility to visualize and edit complex Windows Registry files. + Edit and visualize Windows Registry files faster. Registry Preview diff --git a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs index 65f9285c56..46b83fd337 100644 --- a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs @@ -25,21 +25,21 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService { Title = stringResource.GetLocalized("HostsFileEditorUtilityTitle"), Description = stringResource.GetLocalized("HostsFileEditorUtilityDesc"), - NavigateUri = "https://aka.ms/PowerToysOverview_HostsFileEditor", + NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2271355", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\HostsUILib", "Hosts.ico"), }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.RegistryPreviewApp.exe")) { Title = stringResource.GetLocalized("RegistryPreviewUtilityTitle"), Description = stringResource.GetLocalized("RegistryPreviewUtilityDesc"), - NavigateUri = "https://aka.ms/PowerToysOverview_RegistryPreview", + NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270966", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\RegistryPreview", "RegistryPreview.ico"), }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.EnvironmentVariablesApp.exe")) { Title = stringResource.GetLocalized("EnvVariablesEditorUtilityTitle"), Description = stringResource.GetLocalized("EnvVariablesEditorUtilityDesc"), - NavigateUri = "https://aka.ms/PowerToysOverview_EnvironmentVariables", + NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270894", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\EnvironmentVariables", "EnvironmentVariables.ico"), }, new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.pi.exe"), experimentationService, "ProjectIronsidesExperiment") From eed753f4bef667547e945c42effa110cf7580b69 Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Tue, 14 May 2024 12:59:13 -0700 Subject: [PATCH 2/6] visibility --- .../ViewModels/UtilitiesMainPageViewModel.cs | 3 ++ .../src/ViewModels/UtilityViewModel.cs | 35 +++++++++++-------- tools/Utilities/src/Views/UtilityView.xaml | 29 +++++++-------- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs index 46b83fd337..6011ed1767 100644 --- a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs @@ -27,6 +27,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("HostsFileEditorUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2271355", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\HostsUILib", "Hosts.ico"), + LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Visible, }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.RegistryPreviewApp.exe")) { @@ -34,6 +35,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("RegistryPreviewUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270966", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\RegistryPreview", "RegistryPreview.ico"), + LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Collapsed, }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.EnvironmentVariablesApp.exe")) { @@ -41,6 +43,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("EnvVariablesEditorUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270894", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\EnvironmentVariables", "EnvironmentVariables.ico"), + LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Visible, }, new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.pi.exe"), experimentationService, "ProjectIronsidesExperiment") { diff --git a/tools/Utilities/src/ViewModels/UtilityViewModel.cs b/tools/Utilities/src/ViewModels/UtilityViewModel.cs index 09ecf37bbd..cdbf2e60b5 100644 --- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs @@ -9,6 +9,7 @@ using DevHome.Common.Services; using DevHome.Telemetry; using DevHome.Utilities.TelemetryEvents; +using Microsoft.UI.Xaml; using Serilog; namespace DevHome.Utilities.ViewModels; @@ -38,6 +39,8 @@ public bool Visible } } + private bool launchAsAdmin; + public string Title { get; set; } public string Description { get; set; } @@ -48,7 +51,20 @@ public bool Visible public ICommand LaunchCommand { get; set; } - public ICommand LaunchAsAdminCommand { get; set; } + public Visibility LaunchAsAdminVisibility { get; set; } + + public bool LaunchAsAdmin + { + get => launchAsAdmin; + + set + { + if (launchAsAdmin != value) + { + launchAsAdmin = value; + } + } + } public event PropertyChangedEventHandler PropertyChanged; @@ -64,24 +80,13 @@ public UtilityViewModel(string exeName, IExperimentationService? experimentation this.experimentationService = experimentationService; this.experimentalFeature = experimentalFeature; LaunchCommand = new RelayCommand(Launch); - LaunchAsAdminCommand = new RelayCommand(LaunchAsAdmin); _log.Information("UtilityViewModel created for Title: {Title}, exe: {ExeName}", Title, exeName); } #nullable disable private void Launch() { - LaunchInternal(false); - } - - private void LaunchAsAdmin() - { - LaunchInternal(true); - } - - private void LaunchInternal(bool runAsAdmin) - { - _log.Information("Launching {ExeName}, as admin: {RunAsAdmin}", exeName, runAsAdmin); + _log.Information("Launching {ExeName}, as admin: {RunAsAdmin}", exeName, launchAsAdmin); // We need to start the process with ShellExecute to run elevated var processStartInfo = new ProcessStartInfo @@ -89,7 +94,7 @@ private void LaunchInternal(bool runAsAdmin) FileName = exeName, UseShellExecute = true, - Verb = runAsAdmin ? "runas" : "open", + Verb = launchAsAdmin ? "runas" : "open", }; try @@ -106,6 +111,6 @@ private void LaunchInternal(bool runAsAdmin) _log.Error(ex, "Failed to start process {ExeName}", exeName); } - TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, runAsAdmin), null); + TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, launchAsAdmin), null); } } diff --git a/tools/Utilities/src/Views/UtilityView.xaml b/tools/Utilities/src/Views/UtilityView.xaml index 8602f18bef..3615018512 100644 --- a/tools/Utilities/src/Views/UtilityView.xaml +++ b/tools/Utilities/src/Views/UtilityView.xaml @@ -22,13 +22,15 @@ + @@ -60,27 +62,22 @@ + + From 49c18719d6fb56dd940b81217573f5e05e434ea1 Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Tue, 14 May 2024 17:46:45 -0700 Subject: [PATCH 3/6] pr feedback --- src/NavConfig.jsonc | 2 +- tools/Utilities/src/ViewModels/UtilityViewModel.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/NavConfig.jsonc b/src/NavConfig.jsonc index 3c47f1a159..4cb68f5781 100644 --- a/src/NavConfig.jsonc +++ b/src/NavConfig.jsonc @@ -38,7 +38,7 @@ "assembly": "DevHome.Utilities", "viewFullName": "DevHome.Utilities.Views.UtilitiesMainPageView", "viewModelFullName": "DevHome.Utilities.ViewModels.UtilitiesMainPageViewModel", - "icon": "ED35" + "icon": "ECED" } ] } diff --git a/tools/Utilities/src/ViewModels/UtilityViewModel.cs b/tools/Utilities/src/ViewModels/UtilityViewModel.cs index cdbf2e60b5..2c609bef5c 100644 --- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs @@ -21,7 +21,7 @@ public class UtilityViewModel : INotifyPropertyChanged private readonly ILogger _log = Log.ForContext("SourceContext", nameof(UtilityViewModel)); private readonly IExperimentationService? experimentationService; private readonly string? experimentalFeature; - private readonly string exeName; + private readonly string _exeName; #nullable disable public bool Visible @@ -76,7 +76,7 @@ protected virtual void OnPropertyChanged(string propertyName) #nullable enable public UtilityViewModel(string exeName, IExperimentationService? experimentationService = null, string? experimentalFeature = null) { - this.exeName = exeName; + this._exeName = exeName; this.experimentationService = experimentationService; this.experimentalFeature = experimentalFeature; LaunchCommand = new RelayCommand(Launch); @@ -86,12 +86,12 @@ public UtilityViewModel(string exeName, IExperimentationService? experimentation private void Launch() { - _log.Information("Launching {ExeName}, as admin: {RunAsAdmin}", exeName, launchAsAdmin); + _log.Information($"Launching {_exeName}, as admin: {launchAsAdmin}"); // We need to start the process with ShellExecute to run elevated var processStartInfo = new ProcessStartInfo { - FileName = exeName, + FileName = _exeName, UseShellExecute = true, Verb = launchAsAdmin ? "runas" : "open", @@ -108,7 +108,7 @@ private void Launch() } catch (Exception ex) { - _log.Error(ex, "Failed to start process {ExeName}", exeName); + _log.Error(ex, "Failed to start process {ExeName}", _exeName); } TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, launchAsAdmin), null); From 0f564ee97a166ea4c0bf9cfc749240b1aaaf6017 Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Tue, 14 May 2024 18:35:56 -0700 Subject: [PATCH 4/6] pr feedback --- .../src/Strings/en-us/Resources.resw | 9 +++++ .../ViewModels/UtilitiesMainPageViewModel.cs | 6 ++-- .../src/ViewModels/UtilityViewModel.cs | 34 +++++-------------- tools/Utilities/src/Views/UtilityView.xaml | 10 +++--- 4 files changed, 24 insertions(+), 35 deletions(-) diff --git a/tools/Utilities/src/Strings/en-us/Resources.resw b/tools/Utilities/src/Strings/en-us/Resources.resw index 36a0d5b43f..ad69b988c2 100644 --- a/tools/Utilities/src/Strings/en-us/Resources.resw +++ b/tools/Utilities/src/Strings/en-us/Resources.resw @@ -130,6 +130,9 @@ Hosts File Editor ;Locked={"Hosts"} + + Launch + Utilities Utilities @@ -146,4 +149,10 @@ Registry Preview + + Launch as administrator + + + Launch as administrator + \ No newline at end of file diff --git a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs index 6011ed1767..4bdc6f3f06 100644 --- a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs @@ -27,7 +27,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("HostsFileEditorUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2271355", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\HostsUILib", "Hosts.ico"), - LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Visible, + SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Visible, }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.RegistryPreviewApp.exe")) { @@ -35,7 +35,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("RegistryPreviewUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270966", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\RegistryPreview", "RegistryPreview.ico"), - LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Collapsed, + SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Collapsed, }, new(Path.Combine(appExAliasAbsFolderPath, "DevHome.EnvironmentVariablesApp.exe")) { @@ -43,7 +43,7 @@ public UtilitiesMainPageViewModel(IExperimentationService experimentationService Description = stringResource.GetLocalized("EnvVariablesEditorUtilityDesc"), NavigateUri = "https://go.microsoft.com/fwlink/?Linkid=2270894", ImageSource = Path.Combine(AppContext.BaseDirectory, "Assets\\EnvironmentVariables", "EnvironmentVariables.ico"), - LaunchAsAdminVisibility = Microsoft.UI.Xaml.Visibility.Visible, + SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Visible, }, new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.pi.exe"), experimentationService, "ProjectIronsidesExperiment") { diff --git a/tools/Utilities/src/ViewModels/UtilityViewModel.cs b/tools/Utilities/src/ViewModels/UtilityViewModel.cs index 2c609bef5c..9150d02945 100644 --- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs @@ -5,6 +5,7 @@ using System.ComponentModel; using System.Diagnostics; using System.Windows.Input; +using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using DevHome.Common.Services; using DevHome.Telemetry; @@ -14,7 +15,7 @@ namespace DevHome.Utilities.ViewModels; -public class UtilityViewModel : INotifyPropertyChanged +public partial class UtilityViewModel : ObservableObject { #nullable enable @@ -39,8 +40,6 @@ public bool Visible } } - private bool launchAsAdmin; - public string Title { get; set; } public string Description { get; set; } @@ -51,27 +50,10 @@ public bool Visible public ICommand LaunchCommand { get; set; } - public Visibility LaunchAsAdminVisibility { get; set; } - - public bool LaunchAsAdmin - { - get => launchAsAdmin; - - set - { - if (launchAsAdmin != value) - { - launchAsAdmin = value; - } - } - } - - public event PropertyChangedEventHandler PropertyChanged; + public Visibility SupportsLaunchAsAdmin { get; set; } - protected virtual void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } + [ObservableProperty] + private bool _launchAsAdmin; #nullable enable public UtilityViewModel(string exeName, IExperimentationService? experimentationService = null, string? experimentalFeature = null) @@ -86,7 +68,7 @@ public UtilityViewModel(string exeName, IExperimentationService? experimentation private void Launch() { - _log.Information($"Launching {_exeName}, as admin: {launchAsAdmin}"); + _log.Information($"Launching {_exeName}, as admin: {LaunchAsAdmin}"); // We need to start the process with ShellExecute to run elevated var processStartInfo = new ProcessStartInfo @@ -94,7 +76,7 @@ private void Launch() FileName = _exeName, UseShellExecute = true, - Verb = launchAsAdmin ? "runas" : "open", + Verb = LaunchAsAdmin ? "runas" : "open", }; try @@ -111,6 +93,6 @@ private void Launch() _log.Error(ex, "Failed to start process {ExeName}", _exeName); } - TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, launchAsAdmin), null); + TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, LaunchAsAdmin), null); } } diff --git a/tools/Utilities/src/Views/UtilityView.xaml b/tools/Utilities/src/Views/UtilityView.xaml index 3615018512..d1e5c90dcd 100644 --- a/tools/Utilities/src/Views/UtilityView.xaml +++ b/tools/Utilities/src/Views/UtilityView.xaml @@ -60,12 +60,11 @@ - From a9c60534c0884ff16b7f90fe454a3cb0e9e0c6c1 Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Wed, 15 May 2024 12:05:35 -0700 Subject: [PATCH 5/6] string and icon --- src/NavConfig.jsonc | 2 +- tools/Utilities/src/Strings/en-us/Resources.resw | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/NavConfig.jsonc b/src/NavConfig.jsonc index 4cb68f5781..3c47f1a159 100644 --- a/src/NavConfig.jsonc +++ b/src/NavConfig.jsonc @@ -38,7 +38,7 @@ "assembly": "DevHome.Utilities", "viewFullName": "DevHome.Utilities.Views.UtilitiesMainPageView", "viewModelFullName": "DevHome.Utilities.ViewModels.UtilitiesMainPageViewModel", - "icon": "ECED" + "icon": "ED35" } ] } diff --git a/tools/Utilities/src/Strings/en-us/Resources.resw b/tools/Utilities/src/Strings/en-us/Resources.resw index ad69b988c2..1e6af7af3f 100644 --- a/tools/Utilities/src/Strings/en-us/Resources.resw +++ b/tools/Utilities/src/Strings/en-us/Resources.resw @@ -118,13 +118,14 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Create and manage variable sets with a lightweight UI. + Create and manage environment variables. Environment Variables Editor - Add, filter, or remove file entries in less time. + Add, filter or remove Hosts file entries. + ;Locked={"Hosts"} Hosts File Editor @@ -144,7 +145,7 @@ Project Ironsides - Edit and visualize Windows Registry files faster. + Edit and visualize Windows Registry files. Registry Preview From c73a15870aa5da90bab775979b4f8013d44c0224 Mon Sep 17 00:00:00 2001 From: Darshak Bhatti Date: Wed, 15 May 2024 13:38:39 -0700 Subject: [PATCH 6/6] merge conflict --- tools/Utilities/src/ViewModels/UtilityViewModel.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/Utilities/src/ViewModels/UtilityViewModel.cs b/tools/Utilities/src/ViewModels/UtilityViewModel.cs index 9150d02945..9f547e9ea5 100644 --- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs @@ -62,7 +62,7 @@ public UtilityViewModel(string exeName, IExperimentationService? experimentation this.experimentationService = experimentationService; this.experimentalFeature = experimentalFeature; LaunchCommand = new RelayCommand(Launch); - _log.Information("UtilityViewModel created for Title: {Title}, exe: {ExeName}", Title, exeName); + _log.Information($"UtilityViewModel created for Title: {Title}, exe: {exeName}"); } #nullable disable @@ -84,13 +84,13 @@ private void Launch() var process = Process.Start(processStartInfo); if (process is null) { - _log.Error("Failed to start process {ExeName}", exeName); + _log.Error($"Failed to start process {_exeName}"); throw new InvalidOperationException("Failed to start process"); } } catch (Exception ex) { - _log.Error(ex, "Failed to start process {ExeName}", _exeName); + _log.Error(ex, $"Failed to start process {_exeName}"); } TelemetryFactory.Get().Log("Utilities_UtilitiesLaunchEvent", LogLevel.Critical, new UtilitiesLaunchEvent(Title, LaunchAsAdmin), null);