From 29ff5e5f96cdb334673fd2ca3195f0a8af3ee5b6 Mon Sep 17 00:00:00 2001 From: Deyan Nenov Date: Tue, 16 Jul 2024 02:12:35 +0100 Subject: [PATCH] Pm - files and folders counter - UI improvements (#15359) --- .../Properties/Resources.Designer.cs | 28 +- .../Properties/Resources.en-US.resx | 8 +- src/DynamoCore/Properties/Resources.resx | 8 +- src/DynamoCore/PublicAPI.Unshipped.txt | 2 + src/DynamoCoreWpf/PublicAPI.Unshipped.txt | 6 + .../Pages/PublishPackageFinishPage.xaml.cs | 3 +- .../Pages/PublishPackagePreviewPage.xaml | 180 +++++----- .../Pages/PublishPackagePreviewPage.xaml.cs | 72 +++- .../Pages/PublishPackageSelectPage.xaml | 313 ++++++++++-------- .../Pages/PublishPackageSelectPage.xaml.cs | 66 +++- 10 files changed, 452 insertions(+), 234 deletions(-) diff --git a/src/DynamoCore/Properties/Resources.Designer.cs b/src/DynamoCore/Properties/Resources.Designer.cs index abd8ff1c454..61cfe00c6b3 100644 --- a/src/DynamoCore/Properties/Resources.Designer.cs +++ b/src/DynamoCore/Properties/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace Dynamo.Properties { - using System; - - +namespace Dynamo.Properties +{ + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -1529,6 +1529,24 @@ public static string PackageManagerPackageAlreadyExists { } } + /// + /// Looks up a localized string similar to {0} files and {1} folders will be created.. + /// + public static string PackageManagerPackagePreviewCounter { + get { + return ResourceManager.GetString("PackageManagerPackagePreviewCounter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} files and {1} folders loaded.. + /// + public static string PackageManagerPackageSelectCounter { + get { + return ResourceManager.GetString("PackageManagerPackageSelectCounter", resourceCulture); + } + } + /// /// Looks up a localized string similar to The current user, '{0}', is not a maintainer of the package '{1}'.. /// diff --git a/src/DynamoCore/Properties/Resources.en-US.resx b/src/DynamoCore/Properties/Resources.en-US.resx index 9e0c109e30d..6af0906a03e 100644 --- a/src/DynamoCore/Properties/Resources.en-US.resx +++ b/src/DynamoCore/Properties/Resources.en-US.resx @@ -740,6 +740,12 @@ Parameter name: {0} The current user, '{0}', is not a maintainer of the package '{1}'. {0} = user name (i.e. 'DynamoTeam'), {1} = package name (i.e. 'Clockwork for Dynamo 1.x') + + {0} files and {1} folders will be created. + + + {0} files and {1} folders loaded. + An older version of the package called {0} version {2} was found at {1} with version {3}. The older version has been ignored. @@ -914,4 +920,4 @@ This package likely contains an assembly that is blocked. You will need to load default input name, rename me! - \ No newline at end of file + diff --git a/src/DynamoCore/Properties/Resources.resx b/src/DynamoCore/Properties/Resources.resx index 2439e0fe643..0b04d7adc50 100644 --- a/src/DynamoCore/Properties/Resources.resx +++ b/src/DynamoCore/Properties/Resources.resx @@ -742,6 +742,12 @@ Parameter name: {0} The current user, '{0}', is not a maintainer of the package '{1}'. {0} = user name (i.e. 'DynamoTeam'), {1} = package name (i.e. 'Clockwork for Dynamo 1.x') + + {0} files and {1} folders will be created. + + + {0} files and {1} folders loaded. + An older version of the package called {0} version {2} was found at {1} with version {3}. The older version has been ignored. @@ -917,4 +923,4 @@ This package likely contains an assembly that is blocked. You will need to load default input name, rename me! - \ No newline at end of file + diff --git a/src/DynamoCore/PublicAPI.Unshipped.txt b/src/DynamoCore/PublicAPI.Unshipped.txt index 7a74b2752ec..cfa65c57d11 100644 --- a/src/DynamoCore/PublicAPI.Unshipped.txt +++ b/src/DynamoCore/PublicAPI.Unshipped.txt @@ -2894,6 +2894,8 @@ static Dynamo.Properties.Resources.OutputPortAlternativeName.get -> string static Dynamo.Properties.Resources.PackageEmpty.get -> string static Dynamo.Properties.Resources.PackageLoadFailureForBlockedAssembly.get -> string static Dynamo.Properties.Resources.PackageManagerPackageAlreadyExists.get -> string +static Dynamo.Properties.Resources.PackageManagerPackagePreviewCounter.get -> string +static Dynamo.Properties.Resources.PackageManagerPackageSelectCounter.get -> string static Dynamo.Properties.Resources.PackageManagerUserIsNotAMaintainer.get -> string static Dynamo.Properties.Resources.PackageStateError.get -> string static Dynamo.Properties.Resources.PackageStateErrorTooltip.get -> string diff --git a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt index 906d58ddc31..2cb587f4f03 100644 --- a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt +++ b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt @@ -1249,7 +1249,10 @@ Dynamo.PackageManager.UI.PackageNameLengthValidationRule Dynamo.PackageManager.UI.PackageNameLengthValidationRule.PackageNameLengthValidationRule() -> void Dynamo.PackageManager.UI.PublishPackagePreviewPage Dynamo.PackageManager.UI.PublishPackagePreviewPage.Dispose() -> void +Dynamo.PackageManager.UI.PublishPackagePreviewPage.FilesAndFoldersCounterPreview.get -> string +Dynamo.PackageManager.UI.PublishPackagePreviewPage.FilesAndFoldersCounterPreview.set -> void Dynamo.PackageManager.UI.PublishPackagePreviewPage.InitializeComponent() -> void +Dynamo.PackageManager.UI.PublishPackagePreviewPage.PropertyChanged -> System.ComponentModel.PropertyChangedEventHandler Dynamo.PackageManager.UI.PublishPackagePreviewPage.PublishPackagePreviewPage() -> void Dynamo.PackageManager.UI.PublishPackagePublishPage Dynamo.PackageManager.UI.PublishPackagePublishPage.Dispose() -> void @@ -1260,6 +1263,8 @@ Dynamo.PackageManager.UI.PublishPackageSelectPage Dynamo.PackageManager.UI.PublishPackageSelectPage.AllItemsSelected.get -> bool Dynamo.PackageManager.UI.PublishPackageSelectPage.AllItemsSelected.set -> void Dynamo.PackageManager.UI.PublishPackageSelectPage.Dispose() -> void +Dynamo.PackageManager.UI.PublishPackageSelectPage.FilesAndFoldersCounterPreview.get -> string +Dynamo.PackageManager.UI.PublishPackageSelectPage.FilesAndFoldersCounterPreview.set -> void Dynamo.PackageManager.UI.PublishPackageSelectPage.InitializeComponent() -> void Dynamo.PackageManager.UI.PublishPackageSelectPage.ItemSelection.get -> System.Collections.ObjectModel.ObservableCollection Dynamo.PackageManager.UI.PublishPackageSelectPage.ItemSelection.set -> void @@ -5623,6 +5628,7 @@ virtual Dynamo.Controls.IntegerDisplay.Convert(object value, System.Type targetT virtual Dynamo.Controls.IntegerDisplay.ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) -> object virtual Dynamo.PackageManager.PackageManagerSearchViewModel.OnRequestShowFileDialog(object sender, Dynamo.ViewModels.PackagePathEventArgs e) -> void virtual Dynamo.PackageManager.PublishPackageViewModel.OnRequestShowFileDialog(object sender, Dynamo.ViewModels.PackagePathEventArgs e) -> void +virtual Dynamo.PackageManager.UI.PublishPackagePreviewPage.RaisePropertyChanged(string propertyName) -> void virtual Dynamo.PackageManager.UI.PublishPackageSelectPage.RaisePropertyChanged(string propertyName) -> void virtual Dynamo.PackageManager.ViewModels.PackageManagerSearchElementViewModel.OnRequestShowFileDialog(object sender, Dynamo.ViewModels.PackagePathEventArgs e) -> void virtual Dynamo.UI.Controls.CodeCompletionEditor.OnCommitChange() -> void diff --git a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageFinishPage.xaml.cs b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageFinishPage.xaml.cs index ebe06b98c30..fe9097ee9b8 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageFinishPage.xaml.cs +++ b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageFinishPage.xaml.cs @@ -30,7 +30,8 @@ internal void LoadEvents() var uploadType = PublishPackageViewModel.UploadType; var publishedFiles = PackageItemRootViewModel.GetFiles(PublishPackageViewModel.PackageContents.ToList()); - var count = publishedFiles.Count(x => x.DependencyType != DependencyType.Folder); + var count = publishedFiles.Count(x => x.DependencyType != DependencyType.Folder + || x.DependencyType != DependencyType.CustomNodePreview); var message = uploadType.Equals(PackageUploadHandle.UploadType.Local) ? Dynamo.Wpf.Properties.Resources.PackageManagerFinishedPackageFilesPublishedMessage : Dynamo.Wpf.Properties.Resources.PackageManagerFinishedPackageFilesUploadedMessage; diff --git a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml index db73da4bdd7..f2ae65ed2d1 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml +++ b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml @@ -11,6 +11,7 @@ xmlns:packagemanager="clr-namespace:Dynamo.PackageManager" d:DesignHeight="450" d:DesignWidth="800" UseLayoutRounding="True" + x:Name="PreviewPackagePage" Title="PublishPackagePreviewPage"> @@ -305,27 +306,37 @@ + + - - - - - - - - - - + + + + + + + + + + + + - - + + + - - - - - + + + + + - - - + + - - - - - - + + + - - - - - + + - - + - - - - - - - + + + + + + - - - + + - - - - - - - - - - - - + + + + + + + + + - - - + + + + + + + diff --git a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml.cs b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml.cs index 16826c28ba7..ac55af4fcbb 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml.cs +++ b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackagePreviewPage.xaml.cs @@ -1,15 +1,38 @@ +using System.ComponentModel; using System.Windows; using System.Windows.Controls; + namespace Dynamo.PackageManager.UI { /// /// Interaction logic for PublishPackagePreviewPage.xaml /// - public partial class PublishPackagePreviewPage : Page + public partial class PublishPackagePreviewPage : Page, INotifyPropertyChanged { private PublishPackageViewModel PublishPackageViewModel; + public event PropertyChangedEventHandler PropertyChanged; + + private string _filesAndFoldersCounterPreview; + public string FilesAndFoldersCounterPreview + { + get { return _filesAndFoldersCounterPreview; } + set + { + if (_filesAndFoldersCounterPreview != value) + { + _filesAndFoldersCounterPreview = value; + RaisePropertyChanged(nameof(FilesAndFoldersCounterPreview)); + } + } + } + + protected virtual void RaisePropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + /// /// Constructor /// @@ -21,9 +44,55 @@ public PublishPackagePreviewPage() this.Tag = "Preview Package Contents"; } + private void PublishPackageViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (PublishPackageViewModel == null) return; + if (e.PropertyName == nameof(PublishPackageViewModel.PreviewPackageContents)) + { + int contentFileCount = 0; + int contentFolderCount = 0; + + foreach (var item in PublishPackageViewModel.PreviewPackageContents) + { + CountFileItems(item, ref contentFileCount, ref contentFolderCount); + } + + //set the counter text + var counterText = string.Format(Properties.Resources.PackageManagerPackagePreviewCounter, contentFileCount, contentFolderCount); + FilesAndFoldersCounterPreview = counterText; + }; + } + + private void CountFileItems(PackageItemRootViewModel item, ref int contentFileCount, ref int contentFolderCount) + { + // Base count if the item itself is a file, custom node, or assembly + if (item.DependencyType == DependencyType.File || + item.DependencyType == DependencyType.CustomNodePreview || + item.DependencyType == DependencyType.Assembly) + { + contentFileCount++; + } + + // If the item is a folder, recursively count its children + if (item.DependencyType == DependencyType.Folder) + { + contentFolderCount++; + foreach (var child in item.ChildItems) + { + CountFileItems(child, ref contentFileCount, ref contentFolderCount); + } + } + } + private void PublishPackagePublishPage_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { + if (PublishPackageViewModel != null) + { + PublishPackageViewModel.PropertyChanged -= PublishPackageViewModel_PropertyChanged; + } + PublishPackageViewModel = this.DataContext as PublishPackageViewModel; + PublishPackageViewModel.PropertyChanged += PublishPackageViewModel_PropertyChanged; } internal void LoadEvents() @@ -41,6 +110,7 @@ internal void LoadEvents() public void Dispose() { + this.PublishPackageViewModel.PropertyChanged -= PublishPackageViewModel_PropertyChanged; this.PublishPackageViewModel = null; this.DataContextChanged -= PublishPackagePublishPage_DataContextChanged; this.customBrowserControl?.Dispose(); diff --git a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml index 4e9d6ac0caf..3719628a928 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml +++ b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml @@ -11,7 +11,7 @@ mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" UseLayoutRounding="True" - x:Name="PublishPackagePage" + x:Name="SelectPackagePage" Title="PublishPackageSelectPage"> @@ -179,7 +179,7 @@ VerticalAlignment="Center"> @@ -253,7 +253,7 @@ FontSize="14"> - @@ -367,109 +367,118 @@ - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + + + + - - + + + + + - - - + + - - + - - - - - + + + + - - - - + + + - - - - - - - + + + + + + + + + - - - + + - - + - - - - - - - + + + + + + - - - + + - - - - - - - - - - - + + + + + + + + + - - + - - + - - - - - - - - + + + + - - - - + + + + + + + + diff --git a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml.cs b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml.cs index a5132dc1aac..07c17ea72ce 100644 --- a/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml.cs +++ b/src/DynamoCoreWpf/Views/PackageManager/Pages/PublishPackageSelectPage.xaml.cs @@ -25,6 +25,23 @@ public partial class PublishPackageSelectPage : Page, INotifyPropertyChanged /// public ObservableCollection ItemSelection { get; set; } = new ObservableCollection(); + + private string _filesAndFoldersCounterPreview; + + public string FilesAndFoldersCounterPreview + { + get { return _filesAndFoldersCounterPreview; } + set + { + if (_filesAndFoldersCounterPreview != value) + { + _filesAndFoldersCounterPreview = value; + RaisePropertyChanged(nameof(FilesAndFoldersCounterPreview)); + } + } + } + + private bool _allItemsSelected; /// /// Indicates if all preview items are currently selected @@ -57,11 +74,57 @@ public PublishPackageSelectPage() this.Tag = "Select Package Contents"; } + private void PublishPackageViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (PublishPackageViewModel == null) return; + if (e.PropertyName == nameof(PublishPackageViewModel.PackageContents)) + { + int contentFileCount = 0; + int contentFolderCount = 0; + + foreach (var item in PublishPackageViewModel.PackageContents) + { + CountFileItems(item, ref contentFileCount, ref contentFolderCount); + } + + //set the counter text + var counterText = string.Format(Properties.Resources.PackageManagerPackageSelectCounter, contentFileCount, contentFolderCount); + FilesAndFoldersCounterPreview = counterText; + }; + } + + private void CountFileItems(PackageItemRootViewModel item, ref int contentFileCount, ref int contentFolderCount) + { + // Base count if the item itself is a file, custom node, or assembly + if (item.DependencyType == DependencyType.File || + item.DependencyType == DependencyType.CustomNode || + item.DependencyType == DependencyType.Assembly) + { + contentFileCount++; + } + + // If the item is a folder, recursively count its children + if (item.DependencyType == DependencyType.Folder) + { + contentFolderCount++; + foreach (var child in item.ChildItems) + { + CountFileItems(child, ref contentFileCount, ref contentFolderCount); + } + } + } + private void PublishPackagePublishPage_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { + if(PublishPackageViewModel != null) + { + PublishPackageViewModel.PropertyChanged -= PublishPackageViewModel_PropertyChanged; + } + PublishPackageViewModel = this.DataContext as PublishPackageViewModel; + PublishPackageViewModel.PropertyChanged += PublishPackageViewModel_PropertyChanged; } - + internal void LoadEvents() { this.IsEnabled = true; @@ -78,6 +141,7 @@ internal void LoadEvents() public void Dispose() { this.ItemSelection?.Clear(); + this.PublishPackageViewModel.PropertyChanged -= PublishPackageViewModel_PropertyChanged; this.PublishPackageViewModel = null; this.DataContextChanged -= PublishPackagePublishPage_DataContextChanged; this.customBrowserControl?.Dispose();