mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 19:26:39 +02:00
CmdPal: Tidy up some winget experiences (#38174)
I'm filing this so that I don't lose it on this machine I use less often. We can probably hold it out of 0.90 Fixes: * If a package is installed, we always display the version as "Unknown" * also deals with a case where getting the package metadata could fail, and we'd hide the list item. That's only possible in the "installed, no updates available" case * Allow package updates, add an icon for updates * moves off the preview winget API onto a higher stable version
This commit is contained in:
@@ -22,10 +22,12 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
private IAsyncOperationWithProgress<UninstallResult, UninstallProgress>? _unInstallAction;
|
||||
private Task? _installTask;
|
||||
|
||||
public bool IsInstalled { get; private set; }
|
||||
public PackageInstallCommandState InstallCommandState { get; private set; }
|
||||
|
||||
public static IconInfo CompletedIcon { get; } = new("\uE930"); // Completed
|
||||
|
||||
public static IconInfo UpdateIcon { get; } = new("\uE74A"); // Up
|
||||
|
||||
public static IconInfo DownloadIcon { get; } = new("\uE896"); // Download
|
||||
|
||||
public static IconInfo DeleteIcon { get; } = new("\uE74D"); // Delete
|
||||
@@ -44,23 +46,41 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
|
||||
internal bool SkipDependencies { get; set; }
|
||||
|
||||
public InstallPackageCommand(CatalogPackage package, bool isInstalled)
|
||||
public InstallPackageCommand(CatalogPackage package, PackageInstallCommandState isInstalled)
|
||||
{
|
||||
_package = package;
|
||||
IsInstalled = isInstalled;
|
||||
InstallCommandState = isInstalled;
|
||||
UpdateAppearance();
|
||||
}
|
||||
|
||||
internal void FakeChangeStatus()
|
||||
{
|
||||
IsInstalled = !IsInstalled;
|
||||
InstallCommandState = InstallCommandState switch
|
||||
{
|
||||
PackageInstallCommandState.Install => PackageInstallCommandState.Uninstall,
|
||||
PackageInstallCommandState.Update => PackageInstallCommandState.Uninstall,
|
||||
PackageInstallCommandState.Uninstall => PackageInstallCommandState.Install,
|
||||
_ => throw new NotImplementedException(),
|
||||
};
|
||||
UpdateAppearance();
|
||||
}
|
||||
|
||||
private void UpdateAppearance()
|
||||
{
|
||||
Icon = IsInstalled ? CompletedIcon : DownloadIcon;
|
||||
Name = IsInstalled ? Properties.Resources.winget_uninstall_name : Properties.Resources.winget_install_name;
|
||||
Icon = InstallCommandState switch
|
||||
{
|
||||
PackageInstallCommandState.Install => DownloadIcon,
|
||||
PackageInstallCommandState.Update => UpdateIcon,
|
||||
PackageInstallCommandState.Uninstall => CompletedIcon,
|
||||
_ => throw new NotImplementedException(),
|
||||
};
|
||||
Name = InstallCommandState switch
|
||||
{
|
||||
PackageInstallCommandState.Install => Properties.Resources.winget_install_name,
|
||||
PackageInstallCommandState.Update => Properties.Resources.winget_update_name,
|
||||
PackageInstallCommandState.Uninstall => Properties.Resources.winget_uninstall_name,
|
||||
_ => throw new NotImplementedException(),
|
||||
};
|
||||
}
|
||||
|
||||
public override ICommandResult Invoke()
|
||||
@@ -72,7 +92,7 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
return CommandResult.KeepOpen();
|
||||
}
|
||||
|
||||
if (IsInstalled)
|
||||
if (InstallCommandState == PackageInstallCommandState.Uninstall)
|
||||
{
|
||||
// Uninstall
|
||||
_installBanner.State = MessageState.Info;
|
||||
@@ -88,7 +108,8 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
|
||||
_installTask = Task.Run(() => TryDoInstallOperation(_unInstallAction));
|
||||
}
|
||||
else
|
||||
else if (InstallCommandState is PackageInstallCommandState.Install or
|
||||
PackageInstallCommandState.Update)
|
||||
{
|
||||
// Install
|
||||
_installBanner.State = MessageState.Info;
|
||||
@@ -117,7 +138,8 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
try
|
||||
{
|
||||
await action.AsTask();
|
||||
_installBanner.Message = IsInstalled ?
|
||||
|
||||
_installBanner.Message = InstallCommandState == PackageInstallCommandState.Uninstall ?
|
||||
string.Format(CultureInfo.CurrentCulture, UninstallPackageFinished, _package.Name) :
|
||||
string.Format(CultureInfo.CurrentCulture, InstallPackageFinished, _package.Name);
|
||||
|
||||
@@ -125,9 +147,10 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
_installBanner.State = MessageState.Success;
|
||||
_installTask = null;
|
||||
|
||||
_ = Task.Run(() =>
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
Thread.Sleep(2500);
|
||||
await Task.Delay(2500).ConfigureAwait(false);
|
||||
|
||||
if (_installTask == null)
|
||||
{
|
||||
WinGetExtensionHost.Instance.HideStatus(_installBanner);
|
||||
@@ -228,3 +251,10 @@ public partial class InstallPackageCommand : InvokableCommand
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum PackageInstallCommandState
|
||||
{
|
||||
Uninstall = 0,
|
||||
Update = 1,
|
||||
Install = 2,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user