diff --git a/Bonsai.NuGet.Design/GalleryDialog.Designer.cs b/Bonsai.NuGet.Design/GalleryDialog.Designer.cs index 2f699fb8..52df8dfe 100644 --- a/Bonsai.NuGet.Design/GalleryDialog.Designer.cs +++ b/Bonsai.NuGet.Design/GalleryDialog.Designer.cs @@ -187,7 +187,6 @@ private void InitializeComponent() this.packageView.ItemHeight = 64; this.packageView.Location = new System.Drawing.Point(3, 3); this.packageView.Name = "packageView"; - this.packageView.Operation = Bonsai.NuGet.Design.PackageOperationType.Open; this.packageView.SelectedImageIndex = 0; this.packageView.ShowLines = false; this.packageView.ShowRootLines = false; diff --git a/Bonsai.NuGet.Design/GalleryDialog.cs b/Bonsai.NuGet.Design/GalleryDialog.cs index 5fa9d4b3..15df436c 100644 --- a/Bonsai.NuGet.Design/GalleryDialog.cs +++ b/Bonsai.NuGet.Design/GalleryDialog.cs @@ -32,7 +32,6 @@ public GalleryDialog(NuGetFramework projectFramework, string path) packageIcons, searchComboBox, prereleaseCheckBox, - () => false, value => { }); packageViewController.SearchPrefix = $"tags:{Constants.GalleryDirectory} "; packageViewController.PackageType = Constants.GalleryPackageType; @@ -101,7 +100,7 @@ private void packageView_OperationClick(object sender, PackageViewEventArgs e) { targetPackage = package.Identity; targetPath = saveFolderDialog.FileName; - packageViewController.RunPackageOperation(new[] { package }, true); + packageViewController.RunPackageOperation(new[] { package }, e.Operation, true); if (DialogResult == DialogResult.OK) { Close(); diff --git a/Bonsai.NuGet.Design/PackageManagerDialog.Designer.cs b/Bonsai.NuGet.Design/PackageManagerDialog.Designer.cs index 7d4a40c0..dea3375c 100644 --- a/Bonsai.NuGet.Design/PackageManagerDialog.Designer.cs +++ b/Bonsai.NuGet.Design/PackageManagerDialog.Designer.cs @@ -303,7 +303,6 @@ private void InitializeComponent() this.packageView.ItemHeight = 64; this.packageView.Location = new System.Drawing.Point(3, 32); this.packageView.Name = "packageView"; - this.packageView.Operation = Bonsai.NuGet.Design.PackageOperationType.Install; this.packageView.SelectedImageIndex = 0; this.packageView.ShowLines = false; this.packageView.ShowRootLines = false; diff --git a/Bonsai.NuGet.Design/PackageManagerDialog.cs b/Bonsai.NuGet.Design/PackageManagerDialog.cs index 00f0e73c..95c40e00 100644 --- a/Bonsai.NuGet.Design/PackageManagerDialog.cs +++ b/Bonsai.NuGet.Design/PackageManagerDialog.cs @@ -1,4 +1,4 @@ -using Bonsai.NuGet.Design.Properties; +using Bonsai.NuGet.Design.Properties; using NuGet.Frameworks; using NuGet.Packaging; using NuGet.Packaging.Core; @@ -31,7 +31,6 @@ public PackageManagerDialog(NuGetFramework projectFramework, string path) packageIcons, searchComboBox, prereleaseCheckBox, - () => updatesButton.Checked, value => multiOperationPanel.Visible = value); packageViewController.PackageType = Constants.LibraryPackageType; packageViewController.PackageManager.PackageManagerPlugins.Add(new ExecutablePackagePlugin(this)); @@ -71,26 +70,23 @@ private void UpdateSelectedRepository() { packageViewController.SetPackageViewStatus(Resources.NoItemsFoundLabel); packageViewController.ClearActiveRequests(); + + var selectedItem = packageSourceComboBox.SelectedItem; + if (!AggregateRepository.Equals(selectedItem)) + { + packageViewController.SelectedRepository = (SourceRepository)selectedItem; + } + else packageViewController.SelectedRepository = null; + if (installedButton.Checked) { - packageViewController.Operation = PackageOperationType.Uninstall; - packageViewController.SelectedRepository = PackageManager.LocalRepository; + packageViewController.SelectedTab = PackageOperationType.Uninstall; } - else + else if (updatesButton.Checked) { - var selectedItem = packageSourceComboBox.SelectedItem; - if (!AggregateRepository.Equals(selectedItem)) - { - packageViewController.SelectedRepository = (SourceRepository)selectedItem; - } - else packageViewController.SelectedRepository = null; - - if (updatesButton.Checked) - { - packageViewController.Operation = PackageOperationType.Update; - } - else packageViewController.Operation = PackageOperationType.Install; + packageViewController.SelectedTab = PackageOperationType.Update; } + else packageViewController.SelectedTab = PackageOperationType.Install; searchComboBox.Text = string.Empty; packageViewController.UpdatePackageQuery(); @@ -138,14 +134,11 @@ protected override void OnResizeEnd(EventArgs e) private void multiOperationButton_Click(object sender, EventArgs e) { - if (packageViewController.Operation == PackageOperationType.Update) - { - var packages = packageView.Nodes.Cast() - .Select(node => node.Tag as IPackageSearchMetadata) - .Where(package => package != null) - .ToList(); - packageViewController.RunPackageOperation(packages, true); - } + var packages = packageView.Nodes.Cast() + .Select(node => node.Tag as IPackageSearchMetadata) + .Where(package => package != null) + .ToList(); + packageViewController.RunPackageOperation(packages, PackageOperationType.Install, true); } private void packageView_OperationClick(object sender, PackageViewEventArgs e) @@ -154,7 +147,7 @@ private void packageView_OperationClick(object sender, PackageViewEventArgs e) var package = e.Package; if (package != null) { - if (packageViewController.SelectedRepository == PackageManager.LocalRepository) + if (e.Operation == PackageOperationType.Uninstall) { var nearestDependencyGroup = package.DependencySets.GetNearest(packageViewController.ProjectFramework); var dependencies = ((nearestDependencyGroup?.Packages) ?? Enumerable.Empty()).ToList(); @@ -173,7 +166,7 @@ private void packageView_OperationClick(object sender, PackageViewEventArgs e) } } - packageViewController.RunPackageOperation(new[] { package }, handleDependencies); + packageViewController.RunPackageOperation(new[] { package }, e.Operation, handleDependencies); if (DialogResult == DialogResult.OK) { Close(); diff --git a/Bonsai.NuGet.Design/PackageOperationType.cs b/Bonsai.NuGet.Design/PackageOperationType.cs index 4881b646..d353e105 100644 --- a/Bonsai.NuGet.Design/PackageOperationType.cs +++ b/Bonsai.NuGet.Design/PackageOperationType.cs @@ -4,7 +4,6 @@ internal enum PackageOperationType { Install, Uninstall, - Update, - Open + Update } } diff --git a/Bonsai.NuGet.Design/PackageView.cs b/Bonsai.NuGet.Design/PackageView.cs index 9eb6f842..47dcdff7 100644 --- a/Bonsai.NuGet.Design/PackageView.cs +++ b/Bonsai.NuGet.Design/PackageView.cs @@ -1,6 +1,7 @@ using Bonsai.NuGet.Design.Properties; using NuGet.Protocol; using NuGet.Protocol.Core.Types; +using NuGet.Versioning; using System; using System.ComponentModel; using System.Drawing; @@ -26,10 +27,10 @@ class PackageView : TreeView Brush nodeHighlight; int boundsMargin; SizeF buttonSize; + int updateButtonOffset; int verticalScrollBarWidth; - PackageOperationType operation; TreeNode operationHoverNode; - bool operationButtonState; + OperationHitTestLocation operationHoverState; const int DefaultBoundsMargin = 6; static readonly object OperationClickEvent = new(); @@ -61,24 +62,6 @@ public event PackageViewEventHandler OperationClick remove { Events.RemoveHandler(OperationClickEvent, value); } } - private Image OperationImage { get; set; } - - public PackageOperationType Operation - { - get => operation; - set - { - operation = value; - OperationImage = operation switch - { - PackageOperationType.Open => Resources.OpenImage, - PackageOperationType.Update => Resources.PackageUpdateImage, - PackageOperationType.Uninstall => Resources.PackageRemoveImage, - PackageOperationType.Install or _ => Resources.DownloadImage - }; - } - } - public bool CanSelectNodes { get; set; } private void OnOperationClick(PackageViewEventArgs e) @@ -103,7 +86,8 @@ protected override void ScaleControl(SizeF factor, BoundsSpecified specified) verticalScrollBarWidth = (int)(SystemInformation.VerticalScrollBarWidth * widthScaleFactor); boundsMargin = (int)(DefaultBoundsMargin * factor.Height); using var graphics = CreateGraphics(); - buttonSize = graphics.GetImageSize(OperationImage); + buttonSize = graphics.GetImageSize(Resources.DownloadImage); + updateButtonOffset = (int)Math.Ceiling(buttonSize.Height + boundsMargin / 2); base.ScaleControl(factor, specified); } @@ -152,22 +136,21 @@ protected override void OnMouseDown(MouseEventArgs e) protected override void OnMouseMove(MouseEventArgs e) { - var node = GetNodeAt(e.Location); + var hoverState = OperationHitTest(e.Location, out TreeViewHitTestInfo hitTestInfo); + var node = hitTestInfo.Node; if (operationHoverNode != node) - operationButtonState = false; + operationHoverState = 0; if (node != null) { - var buttonBounds = GetOperationButtonBounds(node.Bounds); - var hoverState = buttonBounds.Contains(e.Location); - if (operationButtonState != hoverState) + if (operationHoverState != hoverState) { var nodeBounds = node.Bounds; nodeBounds.Width = Width - nodeBounds.X; Invalidate(nodeBounds); } - operationButtonState = hoverState; + operationHoverState = hoverState; } operationHoverNode = node; @@ -176,27 +159,44 @@ protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseClick(MouseEventArgs e) { + OperationHitTestLocation result; if (e.Button == MouseButtons.Left && - OperationHitTest(e.Location, out TreeViewHitTestInfo hitTestInfo)) + (result = OperationHitTest(e.Location, out TreeViewHitTestInfo hitTestInfo)) > 0) { - OnOperationClick(new PackageViewEventArgs( - (IPackageSearchMetadata)hitTestInfo.Node.Tag, - Operation)); + var packageInfo = new TreeNodePackageInfo(hitTestInfo.Node); + if (result == OperationHitTestLocation.Primary && packageInfo.HasLocalPackage) + { + var metadataBuilder = PackageSearchMetadataBuilder.FromIdentity(packageInfo.LocalPackage.Identity); + OnOperationClick(new PackageViewEventArgs(metadataBuilder.Build(), PackageOperationType.Uninstall)); + } + else + { + var operation = result == OperationHitTestLocation.Secondary + ? PackageOperationType.Update + : PackageOperationType.Install; + OnOperationClick(new((IPackageSearchMetadata)hitTestInfo.Node.Tag, operation)); + } } base.OnMouseClick(e); } - private bool OperationHitTest(Point pt, out TreeViewHitTestInfo hitTestInfo) + private OperationHitTestLocation OperationHitTest(Point pt, out TreeViewHitTestInfo hitTestInfo) { hitTestInfo = HitTest(pt); - if (hitTestInfo.Node != null && !hitTestInfo.Node.Checked) + if (hitTestInfo.Node?.Tag != null) { - if (hitTestInfo.Node.Tag == null) return false; var buttonBounds = GetOperationButtonBounds(hitTestInfo.Node.Bounds); - return buttonBounds.Contains(pt); + if (buttonBounds.Contains(pt)) return OperationHitTestLocation.Primary; + + var packageInfo = new TreeNodePackageInfo(hitTestInfo.Node); + if (packageInfo.HasPackageUpdates) + { + buttonBounds.Y += updateButtonOffset; + if (buttonBounds.Contains(pt)) return OperationHitTestLocation.Secondary; + } } - return false; + return OperationHitTestLocation.None; } private int RightMargin @@ -239,7 +239,7 @@ private void DrawInlineImage(Graphics graphics, Image image, ref Rectangle bound var imageSize = Size.Round(graphics.GetImageSize(image)); imageX = bounds.Right - imageSize.Width; graphics.DrawImage(image, imageX, bounds.Y); - bounds.Width -= imageSize.Width + boundsMargin; + bounds.Width -= imageSize.Width; } private void DrawInlineText( @@ -264,6 +264,29 @@ private void DrawInlineText( bounds.Width -= textSize.Width; } + private void DrawOperationImage(Graphics graphics, Image image, bool visible, bool highlight, ref Rectangle bounds) + { + bounds.Width -= boundsMargin; + if (visible) + { + if (highlight) + FillImageBounds(graphics, SystemBrushes.ButtonHighlight, image, ref bounds); + DrawInlineImage(graphics, image, ref bounds); + } + else + bounds.Width -= Size.Round(graphics.GetImageSize(image)).Width; + } + + private Size DrawVersionText(Graphics graphics, NuGetVersion version, Color color, ref Rectangle bounds) + { + var packageVersion = version.ToString(); + var textSize = TextRenderer.MeasureText(graphics, packageVersion, Font); + var textPosition = new Point(bounds.Right - textSize.Width, bounds.Y); + TextRenderer.DrawText(graphics, packageVersion, Font, textPosition, color); + bounds.Width -= textSize.Width; + return textSize; + } + protected override void OnDrawNode(DrawTreeNodeEventArgs e) { e.DrawDefault = false; @@ -292,9 +315,9 @@ protected override void OnDrawNode(DrawTreeNodeEventArgs e) } // Get source and local package info - var packageMetadata = (IPackageSearchMetadata)e.Node.Tag; - var localPackageNode = e.Node.Nodes.Count > 0 ? e.Node.Nodes[Resources.UpdatesNodeName] : null; - var localPackageMetadata = (LocalPackageInfo)localPackageNode?.Tag; + var packageInfo = new TreeNodePackageInfo(e.Node); + var packageMetadata = packageInfo.PackageMetadata; + var localPackage = packageInfo.LocalPackage; // Draw package icon var iconText = Resources.PrereleaseLabel; @@ -306,9 +329,9 @@ protected override void OnDrawNode(DrawTreeNodeEventArgs e) if (iconImageIndex >= 0) { ImageList.Draw(e.Graphics, iconImageX, iconImageY, iconImageIndex); - if (localPackageMetadata != null) + if (packageInfo.HasLocalPackage) { - var iconOverlay = localPackageMetadata.Identity.Version < packageMetadata.Identity.Version + var iconOverlay = packageInfo.HasPackageUpdates ? Resources.PackageUpdateImage : Resources.PackageInstalledImage; DrawImageOverlay(e.Graphics, iconOverlay, iconImageX, iconImageY); @@ -329,36 +352,32 @@ protected override void OnDrawNode(DrawTreeNodeEventArgs e) bounds.Y += boundsMargin; bounds.Height -= boundsMargin; - // Draw operation image - bounds.Width -= boundsMargin; - if (nodeHot && OperationImage != null) + // Draw primary package version + var updateVersionBounds = bounds; + var primaryVersion = packageInfo.HasLocalPackage ? localPackage.Identity : packageMetadata.Identity; + var operationImage = packageInfo.HasLocalPackage ? Resources.PackageRemoveImage : Resources.DownloadImage; + var highlightPrimary = operationHoverState == OperationHitTestLocation.Primary; + DrawOperationImage(e.Graphics, operationImage, nodeHot, highlightPrimary, ref bounds); + var textSize = DrawVersionText(e.Graphics, primaryVersion.Version, color, ref bounds); + + // Draw package update version + if (packageInfo.HasPackageUpdates) { - var mousePosition = PointToClient(MousePosition); - var buttonBounds = GetOperationButtonBounds(e.Node.Bounds); - if (buttonBounds.Contains(mousePosition)) - { - FillImageBounds( - e.Graphics, - SystemBrushes.ButtonHighlight, - OperationImage, - ref bounds); - } - DrawInlineImage(e.Graphics, OperationImage, ref bounds); + updateVersionBounds.Y += updateButtonOffset; + updateVersionBounds.Height -= updateButtonOffset; + var highlightSecondary = operationHoverState == OperationHitTestLocation.Secondary; + DrawOperationImage(e.Graphics, Resources.PackageUpdateImage, nodeHot, highlightSecondary, ref updateVersionBounds); + DrawVersionText(e.Graphics, packageMetadata.Identity.Version, color, ref updateVersionBounds); + bounds.Width = Math.Min(bounds.Width, updateVersionBounds.Width); } - else - bounds.Width -= Size.Round(e.Graphics.GetImageSize(OperationImage)).Width + boundsMargin; - - // Draw package version - var packageVersion = packageMetadata.Identity.Version.ToString(); - var textSize = TextRenderer.MeasureText(e.Graphics, packageVersion, Font); - var textPosition = new Point(bounds.Right - textSize.Width - boundsMargin, bounds.Y); - TextRenderer.DrawText(e.Graphics, packageVersion, Font, textPosition, color); - bounds.Width -= textSize.Width + boundsMargin; // Draw package warnings var warningNode = e.Node.Nodes.Count > 0 ? e.Node.Nodes[Resources.PackageWarningKey] : null; if (warningNode != null) + { DrawInlineImage(e.Graphics, Resources.WarningImage, ref bounds); + bounds.Width -= boundsMargin; + } // Draw package title var titleBounds = bounds; @@ -449,5 +468,31 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } + + readonly struct TreeNodePackageInfo + { + public readonly IPackageSearchMetadata PackageMetadata; + public readonly LocalPackageInfo LocalPackage; + + public TreeNodePackageInfo(TreeNode node) + { + PackageMetadata = (IPackageSearchMetadata)node.Tag; + var localPackageNode = node.Nodes.Count > 0 ? node.Nodes[Resources.UpdatesNodeName] : null; + LocalPackage = (LocalPackageInfo)localPackageNode?.Tag; + } + + public bool HasLocalPackage => LocalPackage != null; + + public bool HasPackageUpdates => + HasLocalPackage && + LocalPackage.Identity.Version < PackageMetadata.Identity.Version; + } + + enum OperationHitTestLocation + { + None = 0, + Primary = 1, + Secondary = 2 + } } } diff --git a/Bonsai.NuGet.Design/PackageViewController.cs b/Bonsai.NuGet.Design/PackageViewController.cs index eb983fed..1cd3648b 100644 --- a/Bonsai.NuGet.Design/PackageViewController.cs +++ b/Bonsai.NuGet.Design/PackageViewController.cs @@ -4,6 +4,7 @@ using NuGet.Frameworks; using NuGet.Protocol; using NuGet.Protocol.Core.Types; +using NuGet.Versioning; using System; using System.Collections.Generic; using System.Drawing; @@ -37,7 +38,6 @@ class PackageViewController readonly ImageList packageIcons; readonly CueBannerComboBox searchComboBox; readonly CheckBox prereleaseCheckBox; - readonly Func getUpdateFeed; readonly Action setMultiOperationVisible; public PackageViewController( @@ -50,7 +50,6 @@ public PackageViewController( ImageList icons, CueBannerComboBox search, CheckBox prerelease, - Func updateFeed, Action multiOperationVisible) { ProjectFramework = projectFramework ?? throw new ArgumentNullException(nameof(projectFramework)); @@ -61,7 +60,6 @@ public PackageViewController( packageIcons = icons ?? throw new ArgumentNullException(nameof(icons)); searchComboBox = search ?? throw new ArgumentNullException(nameof(search)); prereleaseCheckBox = prerelease ?? throw new ArgumentNullException(nameof(prerelease)); - getUpdateFeed = updateFeed ?? throw new ArgumentNullException(nameof(updateFeed)); setMultiOperationVisible = multiOperationVisible ?? throw new ArgumentNullException(nameof(multiOperationVisible)); control.KeyDown += control_KeyDown; packageDetails.PackageLinkClicked += packageDetails_PackageLinkClicked; @@ -83,7 +81,6 @@ public PackageViewController( PackageManager = CreatePackageManager(packageSourceProvider, Enumerable.Empty()); searchComboBox.CueBanner = Resources.SearchCueBanner; packageDetails.ProjectFramework = ProjectFramework; - Operation = packageView.Operation; } public string SearchPrefix { get; set; } @@ -96,11 +93,7 @@ public PackageViewController( public LicenseAwarePackageManager PackageManager { get; private set; } - public PackageOperationType Operation - { - get => packageView.Operation; - set => packageView.Operation = value; - } + public PackageOperationType SelectedTab { get; set; } public void ClearActiveRequests() { @@ -179,15 +172,15 @@ public void UpdatePackageQuery() { iconReader.ClearCache(); var prefix = SearchPrefix; - var updateFeed = getUpdateFeed(); + var updateQuery = SelectedTab != PackageOperationType.Install; var searchTerm = searchComboBox.Text; - var pageSize = updateFeed || SelectedRepository == PackageManager.LocalRepository ? int.MaxValue - 1 : PackagesPerPage; + var pageSize = updateQuery ? int.MaxValue - 1 : PackagesPerPage; if (!string.IsNullOrEmpty(prefix)) searchTerm = prefix + searchTerm; - packageQuery = new PackageQuery(searchTerm, pageSize, GetPackageQuery(searchTerm, pageSize, updateFeed)); + packageQuery = new PackageQuery(searchTerm, pageSize, GetPackageQuery(searchTerm, pageSize, updateQuery)); packagePageSelector.SelectedPage = 0; } - QueryContinuation> GetPackageQuery(string searchTerm, int pageSize, bool updateFeed) + QueryContinuation> GetPackageQuery(string searchTerm, int pageSize, bool updateQuery) { if (PackageManager == null) { @@ -199,18 +192,24 @@ QueryContinuation> GetPackageQuery(string se if (selectedRepository == null) { var repositories = PackageManager.SourceRepositoryProvider.GetRepositories(); - var packageQueries = repositories.Select(repository => GetPackageQuery(repository, searchTerm, pageSize, allowPrereleaseVersions, updateFeed)).ToList(); + var packageQueries = repositories.Select(repository => GetPackageQuery(repository, searchTerm, pageSize, allowPrereleaseVersions, updateQuery)).ToList(); if (packageQueries.Count == 1) return packageQueries[0]; else return AggregateQuery.Create(packageQueries, results => results.SelectMany(xs => xs)); } - return GetPackageQuery(selectedRepository, searchTerm, pageSize, allowPrereleaseVersions, updateFeed); + return GetPackageQuery(selectedRepository, searchTerm, pageSize, allowPrereleaseVersions, updateQuery); } - QueryContinuation> GetPackageQuery(SourceRepository repository, string searchTerm, int pageSize, bool includePrerelease, bool updateFeed) + QueryContinuation> GetPackageQuery(SourceRepository repository, string searchTerm, int pageSize, bool includePrerelease, bool updateQuery) { - return updateFeed - ? new UpdateQuery(repository, PackageManager.LocalRepository, searchTerm, includePrerelease, PackageType) + return updateQuery + ? new UpdateQuery( + repository, + PackageManager.LocalRepository, + searchTerm, + includePrerelease, + PackageType, + SelectedTab == PackageOperationType.Uninstall ? VersionRange.All : default) : new SearchQuery(repository, searchTerm, pageSize, includePrerelease, PackageType); } @@ -242,8 +241,7 @@ private void AddPackageRange(IList packages) { if (packages.Count > 0) { - if (packages.Count > 1 && packagePageSelector.SelectedPage == 0 && - packageView.Operation == PackageOperationType.Update) + if (packages.Count > 1 && SelectedTab == PackageOperationType.Update) { setMultiOperationVisible(true); } @@ -328,7 +326,7 @@ public void UpdatePackagePage(int pageIndex = 0) if (packageCount == 0) { if (feedExceptionMessage != null) SetPackageViewStatus(feedExceptionMessage); - else if (packageView.Operation == PackageOperationType.Update) + else if (SelectedTab == PackageOperationType.Update) { SetPackageViewStatus(Resources.NoUpdatesAvailableLabel); } @@ -339,19 +337,17 @@ public void UpdatePackagePage(int pageIndex = 0) activeRequests.Add(feedRequest); } - public void RunPackageOperation(IEnumerable packages, bool handleDependencies) + public void RunPackageOperation(IEnumerable packages, PackageOperationType operation, bool handleDependencies) { using (var dialog = new PackageOperationDialog()) { var logger = PackageManager.Logger; dialog.RegisterEventLogger((EventLogger)logger); - IObservable operation; - var uninstallOperation = SelectedRepository == PackageManager.LocalRepository; - var update = packageView.Operation == PackageOperationType.Update; - if (uninstallOperation) + IObservable operationSequence; + if (operation == PackageOperationType.Uninstall) { - operation = Observable.FromAsync(async token => + operationSequence = Observable.FromAsync(async token => { foreach (var package in packages) { @@ -363,9 +359,9 @@ public void RunPackageOperation(IEnumerable packages, bo else { var allowPrereleaseVersions = AllowPrereleaseVersions; - dialog.Text = update ? Resources.UpdateOperationLabel : Resources.InstallOperationLabel; + dialog.Text = Resources.InstallOperationLabel; - operation = Observable.FromAsync(async token => + operationSequence = Observable.FromAsync(async token => { foreach (var package in packages) { @@ -379,7 +375,7 @@ public void RunPackageOperation(IEnumerable packages, bo { dialog.Shown += delegate { - operation.ObserveOn(control).Subscribe( + operationSequence.ObserveOn(control).Subscribe( xs => { }, ex => logger.LogError(ex.Message), dialog.Complete); @@ -387,7 +383,7 @@ public void RunPackageOperation(IEnumerable packages, bo if (dialog.ShowDialog() == DialogResult.OK) { - if (uninstallOperation || update) UpdatePackageQuery(); + if (SelectedTab != PackageOperationType.Install) UpdatePackageQuery(); else UpdatePackagePage(packagePageSelector.SelectedPage); } }