diff --git a/tools/Utilities/src/Strings/en-us/Resources.resw b/tools/Utilities/src/Strings/en-us/Resources.resw index 750d5e7f02..1e6af7af3f 100644 --- a/tools/Utilities/src/Strings/en-us/Resources.resw +++ b/tools/Utilities/src/Strings/en-us/Resources.resw @@ -118,19 +118,22 @@ 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 environment variables. Environment Variables Editor - Quick and simple utility for managing hosts file. - ;Locked={"hosts"} + Add, filter or remove Hosts file entries. + ;Locked={"Hosts"} Hosts File Editor ;Locked={"Hosts"} + + Launch + Utilities Utilities @@ -142,9 +145,15 @@ Project Ironsides - A quick little utility to visualize and edit complex Windows Registry files. + Edit and visualize Windows Registry files. 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 65f9285c56..4bdc6f3f06 100644 --- a/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilitiesMainPageViewModel.cs @@ -25,22 +25,25 @@ 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"), + SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Visible, }, 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"), + SupportsLaunchAsAdmin = Microsoft.UI.Xaml.Visibility.Collapsed, }, 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"), + 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 09ecf37bbd..9f547e9ea5 100644 --- a/tools/Utilities/src/ViewModels/UtilityViewModel.cs +++ b/tools/Utilities/src/ViewModels/UtilityViewModel.cs @@ -5,22 +5,24 @@ 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; using DevHome.Utilities.TelemetryEvents; +using Microsoft.UI.Xaml; using Serilog; namespace DevHome.Utilities.ViewModels; -public class UtilityViewModel : INotifyPropertyChanged +public partial class UtilityViewModel : ObservableObject { #nullable enable 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 @@ -48,48 +50,33 @@ public bool Visible public ICommand LaunchCommand { get; set; } - public ICommand LaunchAsAdminCommand { get; set; } + public Visibility SupportsLaunchAsAdmin { get; set; } - public event PropertyChangedEventHandler PropertyChanged; - - 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) { - this.exeName = exeName; + this._exeName = exeName; 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); + _log.Information($"UtilityViewModel created for Title: {Title}, exe: {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: {LaunchAsAdmin}"); // We need to start the process with ShellExecute to run elevated var processStartInfo = new ProcessStartInfo { - FileName = exeName, + FileName = _exeName, UseShellExecute = true, - Verb = runAsAdmin ? "runas" : "open", + Verb = LaunchAsAdmin ? "runas" : "open", }; try @@ -97,15 +84,15 @@ private void LaunchInternal(bool runAsAdmin) 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, 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..d1e5c90dcd 100644 --- a/tools/Utilities/src/Views/UtilityView.xaml +++ b/tools/Utilities/src/Views/UtilityView.xaml @@ -22,13 +22,15 @@ + @@ -58,29 +60,22 @@ - + +