From 19ce1b0386d2e05435402b24b73588fc9c79afe2 Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 19 Sep 2019 15:33:33 -0400 Subject: [PATCH 01/19] Initial Commit, example to remove HomeWorkspaceViewModel leak on RunSettingsViewModel --- .../ViewModels/Core/HomeWorkspaceViewModel.cs | 4 ++++ src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/HomeWorkspaceViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/HomeWorkspaceViewModel.cs index 9e400343271..8d72fb16031 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/HomeWorkspaceViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/HomeWorkspaceViewModel.cs @@ -222,6 +222,9 @@ private bool CanStopPeriodicTimer(object parameter) return true; } + /// + /// Object dispose function + /// public override void Dispose() { base.Dispose(); @@ -230,6 +233,7 @@ public override void Dispose() hwm.EvaluationCompleted -= hwm_EvaluationCompleted; hwm.SetNodeDeltaState -= hwm_SetNodeDeltaState; RunSettingsViewModel.PropertyChanged -= RunSettingsViewModel_PropertyChanged; + RunSettingsViewModel.Dispose(); RunSettingsViewModel = null; DynamoViewModel.Model.ShutdownStarted -= Model_ShutdownStarted; } diff --git a/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs b/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs index bf2cd44a9b8..4e40a8b7bdf 100644 --- a/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs @@ -86,7 +86,7 @@ public class RunSettingsViewModel : NotificationObject #region private members private bool debug = false; - private readonly HomeWorkspaceViewModel workspaceViewModel; + private HomeWorkspaceViewModel workspaceViewModel; private readonly DynamoViewModel dynamoViewModel; private RunTypeItem selectedRunTypeItem; private SynchronizationContext context; @@ -215,7 +215,7 @@ public Visibility RunButtonVisibility #endregion - #region constructors + #region constructors and dispose function public RunSettingsViewModel(RunSettings settings, HomeWorkspaceViewModel workspaceViewModel, DynamoViewModel dynamoViewModel) { @@ -236,6 +236,14 @@ public RunSettingsViewModel(RunSettings settings, HomeWorkspaceViewModel workspa ToggleRunTypeEnabled(RunType.Periodic, false); } + /// + /// When switching workspace, this need to be called in HomeworkspaceViewModel dispose function + /// + internal void Dispose() + { + this.workspaceViewModel = null; + } + #endregion #region private and internal methods From fdbe3fef8637630ad8f3d0455d324c817964a82d Mon Sep 17 00:00:00 2001 From: tanga Date: Wed, 25 Sep 2019 14:20:55 -0400 Subject: [PATCH 02/19] Update baseclass for RunSettingsViewModel --- src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs | 10 ++++++++++ src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs index d413de78275..e640a31e47e 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs @@ -601,6 +601,16 @@ public virtual void Dispose() DynamoViewModel.EngineController.AstBuilt -= EngineController_AstBuilt; } + foreach (var p in InPorts) + { + p.Dispose(); + } + + foreach (var p in OutPorts) + { + p.Dispose(); + } + DynamoSelection.Instance.Selection.CollectionChanged -= SelectionOnCollectionChanged; } diff --git a/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs b/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs index 4e40a8b7bdf..8326c053132 100644 --- a/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/RunSettingsViewModel.cs @@ -81,7 +81,7 @@ public RunTypeItem(RunType runType) /// notifications as those notifications are raised when the value is set on the /// model. /// - public class RunSettingsViewModel : NotificationObject + public class RunSettingsViewModel : ViewModelBase { #region private members @@ -239,8 +239,9 @@ public RunSettingsViewModel(RunSettings settings, HomeWorkspaceViewModel workspa /// /// When switching workspace, this need to be called in HomeworkspaceViewModel dispose function /// - internal void Dispose() + public override void Dispose() { + base.Dispose(); this.workspaceViewModel = null; } From 7a41ce83cf36c5de86fd9b2c0321fbecd4dd799e Mon Sep 17 00:00:00 2001 From: tanga Date: Wed, 25 Sep 2019 16:51:45 -0400 Subject: [PATCH 03/19] Dispose WorkspaceDependencyView using Dispose call --- .../WorkspaceDependencyView.xaml.cs | 11 ++++++++++- .../WorkspaceDependencyViewExtension.cs | 3 +-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs index 59a51d66795..99064ac2940 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs @@ -17,7 +17,7 @@ namespace Dynamo.WorkspaceDependency /// /// Interaction logic for WorkspaceDependencyView.xaml /// - public partial class WorkspaceDependencyView : UserControl + public partial class WorkspaceDependencyView : UserControl, IDisposable { private WorkspaceModel currentWorkspace; @@ -224,6 +224,15 @@ internal void UpdateWorkspaceToUseInstalledPackage(PackageDependencyInfo info) } } } + + /// + /// Dispose function for WorkspaceDependencyView + /// + public void Dispose() + { + loadedParams.CurrentWorkspaceChanged -= OnWorkspaceChanged; + loadedParams.CurrentWorkspaceCleared -= OnWorkspaceCleared; + } } /// diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs index a2972dfbaf1..25b4bd51ac2 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs @@ -65,8 +65,7 @@ public void Ready(ReadyParams readyParams) public void Shutdown() { - LoadedParams.CurrentWorkspaceChanged -= DependencyView.OnWorkspaceChanged; - LoadedParams.CurrentWorkspaceCleared -= DependencyView.OnWorkspaceCleared; + DependencyView.Dispose(); this.Dispose(); } From 9d4b0b6fd863e991d90117f73622c9faa4e2c918 Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 26 Sep 2019 13:09:36 -0400 Subject: [PATCH 04/19] Remove property no longer needed --- .../WorkspaceDependencyViewExtension.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs index 25b4bd51ac2..b1fe91eafad 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs @@ -18,7 +18,6 @@ namespace Dynamo.WorkspaceDependency public class WorkspaceDependencyViewExtension : IViewExtension, ILogSource { private MenuItem packageDependencyMenuItem; - private ViewLoadedParams LoadedParams; internal WorkspaceDependencyView DependencyView { From 305159f20da8f6631c9f9d525c3dc91238536f85 Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 26 Sep 2019 20:36:34 -0400 Subject: [PATCH 05/19] Update base class --- src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 4a44db2559b..834a4b62d13 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -89,7 +89,7 @@ public interface ISearchEntryViewModel : INotifyPropertyChanged, IDisposable ElementTypes ElementType { get; } } - public class NodeCategoryViewModel : NotificationObject, ISearchEntryViewModel + public class NodeCategoryViewModel : ViewModelBase, ISearchEntryViewModel { public ICommand ClickedCommand { get; private set; } From 81d2bcc5b7680c714f3d90be8097397af9f60f92 Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 10 Oct 2019 14:53:53 -0400 Subject: [PATCH 06/19] Address memory leak on notifications property --- .../NotificationsViewExtension.cs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Notifications/NotificationsViewExtension.cs b/src/Notifications/NotificationsViewExtension.cs index 75ed9f854dc..86b325229c1 100644 --- a/src/Notifications/NotificationsViewExtension.cs +++ b/src/Notifications/NotificationsViewExtension.cs @@ -1,5 +1,6 @@ using System; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Controls; @@ -11,11 +12,23 @@ namespace Dynamo.Notifications { - public class NotificationsViewExtension : IViewExtension + public class NotificationsViewExtension : IViewExtension, INotifyPropertyChanged { private ViewLoadedParams viewLoadedParams; private Action notificationHandler; - public ObservableCollection Notifications { get; private set; } + + private ObservableCollection notifications; + public ObservableCollection Notifications + { + get { return notifications; } + private set + { + if(notifications != value) + notifications = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Notifications))); + } + } + private NotificationsMenuItem notificationsMenuItem; private DynamoLogger logger; @@ -36,7 +49,9 @@ public string UniqueId } internal Window dynamoWindow; - + + public event PropertyChangedEventHandler PropertyChanged; + public void Dispose() { UnregisterEventHandlers(); From 278b2f5f6c44b04670c16a804c8445ed6c8a13e5 Mon Sep 17 00:00:00 2001 From: tanga Date: Mon, 14 Oct 2019 20:17:58 -0400 Subject: [PATCH 07/19] Some improvement on eventhandlers leak --- .../ViewModels/Search/BrowserItemViewModel.cs | 10 ++++++++-- .../ViewModels/Search/NodeSearchElementViewModel.cs | 7 +++++-- src/Notifications/NotificationsViewExtension.cs | 3 +++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 834a4b62d13..1772f48cbaa 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -97,8 +97,8 @@ public class NodeCategoryViewModel : ViewModelBase, ISearchEntryViewModel private string fullCategoryName; private string assembly; private ObservableCollection items; - private readonly ObservableCollection entries; - private readonly ObservableCollection subCategories; + private ObservableCollection entries; + private ObservableCollection subCategories; private bool visibility; private bool isExpanded; private bool isSelected; @@ -365,9 +365,15 @@ public void Dispose() { foreach (var category in SubCategories) category.PropertyChanged -= CategoryOnPropertyChanged; + Entries.CollectionChanged -= OnCollectionChanged; + SubCategories.CollectionChanged -= OnCollectionChanged; + SubCategories.CollectionChanged -= SubCategoriesOnCollectionChanged; + Items.CollectionChanged -= ItemsOnCollectionChanged; foreach (var item in Items) item.PropertyChanged -= ItemOnPropertyChanged; + this.entries = null; + this.subCategories = null; } public void DisposeTree() diff --git a/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs index 7dad717cd32..e008b638276 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs @@ -15,7 +15,7 @@ namespace Dynamo.Wpf.ViewModels { - public class NodeSearchElementViewModel : NotificationObject, ISearchEntryViewModel + public class NodeSearchElementViewModel : ViewModelBase, ISearchEntryViewModel { private Dictionary FontAwesomeDict; @@ -54,10 +54,13 @@ private void ModelOnVisibilityChanged() RaisePropertyChanged("Visibility"); } - public void Dispose() + public override void Dispose() { + searchViewModel = null; + Model.VisibilityChanged -= ModelOnVisibilityChanged; if (searchViewModel != null) Clicked -= searchViewModel.OnSearchElementClicked; + base.Dispose(); } public NodeSearchElement Model { get; set; } diff --git a/src/Notifications/NotificationsViewExtension.cs b/src/Notifications/NotificationsViewExtension.cs index 86b325229c1..77bfcd18094 100644 --- a/src/Notifications/NotificationsViewExtension.cs +++ b/src/Notifications/NotificationsViewExtension.cs @@ -18,6 +18,9 @@ public class NotificationsViewExtension : IViewExtension, INotifyPropertyChanged private Action notificationHandler; private ObservableCollection notifications; + /// + /// Notifications data collection. PropertyChanged event is raised to help dealing WPF bind dispose. + /// public ObservableCollection Notifications { get { return notifications; } From 412bd54afcdd472a72a847e057477f2c8212fd9c Mon Sep 17 00:00:00 2001 From: tanga Date: Mon, 14 Oct 2019 22:51:12 -0400 Subject: [PATCH 08/19] Code Clean up --- src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs | 4 +++- .../ViewModels/Search/NodeSearchElementViewModel.cs | 5 +++-- src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 1772f48cbaa..40194c8c0a0 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -361,10 +361,11 @@ private void SubCategoriesOnCollectionChanged(object sender, NotifyCollectionCha } } - public void Dispose() + public override void Dispose() { foreach (var category in SubCategories) category.PropertyChanged -= CategoryOnPropertyChanged; + Entries.CollectionChanged -= OnCollectionChanged; SubCategories.CollectionChanged -= OnCollectionChanged; SubCategories.CollectionChanged -= SubCategoriesOnCollectionChanged; @@ -374,6 +375,7 @@ public void Dispose() item.PropertyChanged -= ItemOnPropertyChanged; this.entries = null; this.subCategories = null; + base.Dispose(); } public void DisposeTree() diff --git a/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs index e008b638276..ec2605fd87c 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/NodeSearchElementViewModel.cs @@ -11,7 +11,6 @@ using Dynamo.ViewModels; using FontAwesome.WPF; using Microsoft.Practices.Prism.Commands; -using Microsoft.Practices.Prism.ViewModel; namespace Dynamo.Wpf.ViewModels { @@ -56,10 +55,12 @@ private void ModelOnVisibilityChanged() public override void Dispose() { - searchViewModel = null; Model.VisibilityChanged -= ModelOnVisibilityChanged; if (searchViewModel != null) + { Clicked -= searchViewModel.OnSearchElementClicked; + searchViewModel = null; + } base.Dispose(); } diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index 6066479f61f..f309618e694 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -86,7 +86,7 @@ public string SearchText /// SearchIconAlignment property /// /// - /// This is used for aligment search icon and text. + /// This is used for alignment search icon and text. /// private HorizontalAlignment searchIconAlignment; public HorizontalAlignment SearchIconAlignment @@ -210,7 +210,7 @@ internal void Filter() } /// - /// Unselects all items and selectes the first one. + /// Unselects all items and selects the first one. /// internal IEnumerable ToggleSelect(IEnumerable items) { From e13ca60e2b641e5fb85c1ae68e9e5813f9160742 Mon Sep 17 00:00:00 2001 From: tanga Date: Tue, 15 Oct 2019 14:05:56 -0400 Subject: [PATCH 09/19] Code Clean Up --- .../ViewModels/Search/BrowserItemViewModel.cs | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 40194c8c0a0..1de29dc26d5 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -283,19 +283,29 @@ public ImageSource SmallIcon } } + /// + /// Constructor + /// + /// Category name public NodeCategoryViewModel(string name) : this( name, Enumerable.Empty(), Enumerable.Empty()) { } + /// + /// Constructor + /// + /// Category name + /// Sub elements + /// Sub Categories public NodeCategoryViewModel(string name, IEnumerable entries, IEnumerable subs) { ClickedCommand = new DelegateCommand(Expand); Name = name; - this.entries = new ObservableCollection(entries.OrderBy(x => x.Name)); - subCategories = new ObservableCollection(subs.OrderBy(x => x.Name)); + entries = entries != null? new ObservableCollection(entries.OrderBy(x => x.Name)) : new ObservableCollection(); + subCategories = subs != null ? new ObservableCollection(subs.OrderBy(x => x.Name)) : new ObservableCollection(); foreach (var category in SubCategories) category.PropertyChanged += CategoryOnPropertyChanged; @@ -361,6 +371,9 @@ private void SubCategoriesOnCollectionChanged(object sender, NotifyCollectionCha } } + /// + /// Dispose function + /// public override void Dispose() { foreach (var category in SubCategories) @@ -378,6 +391,10 @@ public override void Dispose() base.Dispose(); } + /// + /// Dispose the category and all the sub categories. + /// note: does not seem to be called in Dynamo + /// public void DisposeTree() { Dispose(); @@ -507,7 +524,7 @@ private void AddToItems(IEnumerable newItems) var list = Items.Where(cat => !(cat is ClassesNodeCategoryViewModel)); var nextLargerItemIndex = FindInsertionPointByName(list, entry.Name); - // Nodecategories(i.e. namespaces) should be before members. + // Node categories(i.e. namespaces) should be before members. if (entry is NodeSearchElementViewModel) { if (nextLargerItemIndex >= 0) From 5937131f6550a8036cae773824ddf7d8076571db Mon Sep 17 00:00:00 2001 From: tanga Date: Tue, 15 Oct 2019 14:45:14 -0400 Subject: [PATCH 10/19] Use Auto property --- .../ViewModels/Search/BrowserItemViewModel.cs | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 1de29dc26d5..446737bd50b 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -96,9 +96,6 @@ public class NodeCategoryViewModel : ViewModelBase, ISearchEntryViewModel private string name; private string fullCategoryName; private string assembly; - private ObservableCollection items; - private ObservableCollection entries; - private ObservableCollection subCategories; private bool visibility; private bool isExpanded; private bool isSelected; @@ -205,20 +202,11 @@ private void DetermineElementType() } } - public ObservableCollection Items - { - get { return items; } - } + public ObservableCollection Items { get; private set; } - public ObservableCollection Entries - { - get { return entries; } - } + public ObservableCollection Entries { get; private set; } - public ObservableCollection SubCategories - { - get { return subCategories; } - } + public ObservableCollection SubCategories { get; private set; } public bool Visibility { @@ -304,8 +292,8 @@ public NodeCategoryViewModel(string name, IEnumerable(entries.OrderBy(x => x.Name)) : new ObservableCollection(); - subCategories = subs != null ? new ObservableCollection(subs.OrderBy(x => x.Name)) : new ObservableCollection(); + Entries = entries != null? new ObservableCollection(entries.OrderBy(x => x.Name)) : new ObservableCollection(); + SubCategories = subs != null ? new ObservableCollection(subs.OrderBy(x => x.Name)) : new ObservableCollection(); foreach (var category in SubCategories) category.PropertyChanged += CategoryOnPropertyChanged; @@ -314,7 +302,7 @@ public NodeCategoryViewModel(string name, IEnumerable( + Items = new ObservableCollection( SubCategories.Cast().Concat(Entries)); Items.CollectionChanged += ItemsOnCollectionChanged; @@ -386,8 +374,8 @@ public override void Dispose() foreach (var item in Items) item.PropertyChanged -= ItemOnPropertyChanged; - this.entries = null; - this.subCategories = null; + this.Entries = null; + this.SubCategories = null; base.Dispose(); } @@ -491,16 +479,16 @@ private void SyncItems() { Items.CollectionChanged -= ItemsOnCollectionChanged; - foreach (var item in items) + foreach (var item in Items) item.PropertyChanged -= ItemOnPropertyChanged; - items = new ObservableCollection( + Items = new ObservableCollection( Entries.Cast().Concat(SubCategories) .OrderBy(x => x.Name)); Items.CollectionChanged += ItemsOnCollectionChanged; - foreach (var item in items) + foreach (var item in Items) item.PropertyChanged += ItemOnPropertyChanged; } From b3bd3aba2e4c6d501f08bc3c09b097adc1ed3d1a Mon Sep 17 00:00:00 2001 From: tanga Date: Tue, 15 Oct 2019 15:21:49 -0400 Subject: [PATCH 11/19] Code Clean up --- .../ViewModels/Core/WorkspaceViewModel.cs | 2 +- .../ViewModels/Search/BrowserItemViewModel.cs | 8 +++----- .../ViewModels/Search/SearchViewModel.cs | 13 +++++++++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs index f4d3a94b0ca..b5a0db8e62e 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs @@ -513,7 +513,7 @@ public override void Dispose() Nodes.Clear(); Notes.Clear(); Connectors.Clear(); - + InCanvasSearchViewModel.Dispose(); } internal void ZoomInInternal() diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index 446737bd50b..ebe7b1f8495 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -367,15 +367,13 @@ public override void Dispose() foreach (var category in SubCategories) category.PropertyChanged -= CategoryOnPropertyChanged; + foreach (var item in Items) + item.PropertyChanged -= ItemOnPropertyChanged; + Entries.CollectionChanged -= OnCollectionChanged; SubCategories.CollectionChanged -= OnCollectionChanged; SubCategories.CollectionChanged -= SubCategoriesOnCollectionChanged; Items.CollectionChanged -= ItemsOnCollectionChanged; - - foreach (var item in Items) - item.PropertyChanged -= ItemOnPropertyChanged; - this.Entries = null; - this.SubCategories = null; base.Dispose(); } diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index f309618e694..53857139a33 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -22,7 +22,7 @@ namespace Dynamo.ViewModels { - public partial class SearchViewModel : NotificationObject + public partial class SearchViewModel : ViewModelBase { #region events @@ -324,13 +324,22 @@ internal SearchViewModel(DynamoViewModel dynamoViewModel) InitializeCore(); } - // Just for tests. + // Just for tests. Please refer to LibraryTests.cs internal SearchViewModel(NodeSearchModel model) { Model = model; InitializeCore(); } + /// + /// Dispose function + /// + public override void Dispose() + { + libraryRoot.DisposeTree(); + base.Dispose(); + } + private void InitializeCore() { searchResults = new List(); From c9b1d3ae0bccd35c6e35ab153727c8431a958c6b Mon Sep 17 00:00:00 2001 From: tanga Date: Wed, 16 Oct 2019 00:55:16 -0400 Subject: [PATCH 12/19] Update SearchViewModel Dispose function to start from all roots --- src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index 53857139a33..5cfd1b61408 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -336,7 +336,14 @@ internal SearchViewModel(NodeSearchModel model) /// public override void Dispose() { - libraryRoot.DisposeTree(); + foreach (var cate in LibraryRootCategories) + { + cate.DisposeTree(); + } + foreach (var cate in BrowserRootCategories) + { + cate.DisposeTree(); + } base.Dispose(); } From 338291ef5b7ceb635280eefd6527b744763c08b3 Mon Sep 17 00:00:00 2001 From: tanga Date: Wed, 16 Oct 2019 01:18:00 -0400 Subject: [PATCH 13/19] Obsolete SearchViewModel initialization on DynamoViewModel --- src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs | 5 +++-- src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs | 2 +- src/LibraryViewExtension/LibraryViewController.cs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs index decae12a7ea..43bd45ed449 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs @@ -415,6 +415,7 @@ public bool ShowDebugASTs public IWatchHandler WatchHandler { get; private set; } + [Obsolete("This Property will be obsoleted in Dynamo 3.0.")] public SearchViewModel SearchViewModel { get; private set; } public PackageManagerClientViewModel PackageManagerClientViewModel { get; private set; } @@ -535,7 +536,7 @@ protected DynamoViewModel(StartConfiguration startConfiguration) this.WatchHandler = startConfiguration.WatchHandler; var pmExtension = model.GetPackageManagerExtension(); this.PackageManagerClientViewModel = new PackageManagerClientViewModel(this, pmExtension.PackageManagerClient); - this.SearchViewModel = new SearchViewModel(this); + this.SearchViewModel = null; // Start page should not show up during test mode. this.ShowStartPage = !DynamoModel.IsTestMode; @@ -2290,7 +2291,7 @@ public void ImportLibrary(object parameter) string.Format(detailedMessage, file)); } } - SearchViewModel.SearchAndUpdateResults(); + CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults(); } catch(LibraryLoadFailedException ex) { diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index e9406348e40..b12f4183a29 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -654,7 +654,7 @@ private void OnMouseRelease(object sender, MouseButtonEventArgs e) ContextMenuPopup.IsOpen = false; if (returnToSearch) { - ViewModel.DynamoViewModel.SearchViewModel.OnRequestFocusSearch(); + ViewModel.DynamoViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.OnRequestFocusSearch(); } else if (e.ChangedButton == MouseButton.Right && e.OriginalSource == zoomBorder) { diff --git a/src/LibraryViewExtension/LibraryViewController.cs b/src/LibraryViewExtension/LibraryViewController.cs index 675ac386e51..05407d52209 100644 --- a/src/LibraryViewExtension/LibraryViewController.cs +++ b/src/LibraryViewExtension/LibraryViewController.cs @@ -280,7 +280,7 @@ private FloatingLibraryTooltipPopup CreateTooltipControl() private NodeSearchElementViewModel FindTooltipContext(String nodeName) { - return dynamoViewModel.SearchViewModel.FindViewModelForNode(nodeName); + return dynamoViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FindViewModelForNode(nodeName); } private void ShowTooltip(String nodeName, double y) From 7aca3f31c8e13a6e3d05c9154966a6bd5ffd7c91 Mon Sep 17 00:00:00 2001 From: tanga Date: Wed, 16 Oct 2019 14:35:08 -0400 Subject: [PATCH 14/19] Dispose InfoBuubleView and workspaceView correctly --- .../ViewModels/Core/NodeViewModel.cs | 8 ++++++-- .../ViewModels/Preview/InfoBubbleViewModel.cs | 4 ++++ .../Views/Core/WorkspaceView.xaml.cs | 2 +- .../Views/Preview/InfoBubbleView.xaml.cs | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs index e640a31e47e..d4c6b85d8fb 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs @@ -590,7 +590,10 @@ public NodeViewModel(WorkspaceViewModel workspaceViewModel, NodeModel logic) ++NoteViewModel.StaticZIndex; } - public virtual void Dispose() + /// + /// Dispose function + /// + public override void Dispose() { this.NodeModel.PropertyChanged -= logic_PropertyChanged; @@ -610,8 +613,9 @@ public virtual void Dispose() { p.Dispose(); } - + ErrorBubble.Dispose(); DynamoSelection.Instance.Selection.CollectionChanged -= SelectionOnCollectionChanged; + base.Dispose(); } public NodeViewModel(WorkspaceViewModel workspaceViewModel, NodeModel logic, Size preferredSize) diff --git a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs index e2058ac5fce..5f336811845 100644 --- a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs @@ -133,6 +133,10 @@ public void OnRequestAction(InfoBubbleEventArgs e) #region Public Methods + /// + /// Constructor + /// + /// public InfoBubbleViewModel(DynamoViewModel dynamoViewModel) { this.DynamoViewModel = dynamoViewModel; diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index b12f4183a29..25c943f6b94 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -82,7 +82,7 @@ internal bool IsSnappedToPort public WorkspaceView() { Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoModernDictionary); - Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoColorsAndBrushesDictionary); + //Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoColorsAndBrushesDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.DataTemplatesDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoConvertersDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.ConnectorsDictionary); diff --git a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs index 69846264d21..1f0fdb83e94 100644 --- a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs @@ -121,6 +121,12 @@ public InfoBubbleView() { InitializeComponent(); + // Make sure to resubscribe to the event handlers + Unloaded += (s, e) => + { + Dispose(); + }; + fadeInStoryBoard = (Storyboard)FindResource("fadeInStoryBoard"); fadeOutStoryBoard = (Storyboard)FindResource("fadeOutStoryBoard"); @@ -860,6 +866,15 @@ private void InfoBubble_MouseWheel(object sender, MouseWheelEventArgs e) e.Handled = true; } + /// + /// Dispose function adding resubscribe logic + /// + public void Dispose() + { + viewModel.PropertyChanged -= ViewModel_PropertyChanged; + viewModel.RequestAction -= InfoBubbleRequestAction; + } + #endregion } } \ No newline at end of file From b71a0ac3312e9b7a4aefa13d72dcea71e9626a2a Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 17 Oct 2019 01:14:04 -0400 Subject: [PATCH 15/19] Some Code CleanUp --- .../ViewModels/Core/WorkspaceViewModel.cs | 70 ++++++++----------- .../ViewModels/Search/SearchViewModel.cs | 12 +--- .../Views/Core/WorkspaceView.xaml.cs | 2 +- 3 files changed, 33 insertions(+), 51 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs index b5a0db8e62e..3ef03025bcf 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/WorkspaceViewModel.cs @@ -251,29 +251,19 @@ public bool IsCursorForced set { isCursorForced = value; RaisePropertyChanged("IsCursorForced"); } } - private CompositeCollection _workspaceElements = new CompositeCollection(); [JsonIgnore] - public CompositeCollection WorkspaceElements { get { return _workspaceElements; } } - - ObservableCollection _connectors = new ObservableCollection(); + public CompositeCollection WorkspaceElements { get; } = new CompositeCollection(); [JsonIgnore] - public ObservableCollection Connectors { get { return _connectors; } } + public ObservableCollection Connectors { get; } = new ObservableCollection(); - ObservableCollection _nodes = new ObservableCollection(); [JsonProperty("NodeViews")] - public ObservableCollection Nodes { get { return _nodes; } } - + public ObservableCollection Nodes { get; } = new ObservableCollection(); // Do not serialize notes, they will be converted to annotations during serialization - ObservableCollection _notes = new ObservableCollection(); [JsonIgnore] - public ObservableCollection Notes { get { return _notes; } } - - ObservableCollection _errors = new ObservableCollection(); + public ObservableCollection Notes { get; } = new ObservableCollection(); [JsonIgnore] - public ObservableCollection Errors { get { return _errors; } } - - ObservableCollection _annotations = new ObservableCollection(); - public ObservableCollection Annotations { get { return _annotations; } } + public ObservableCollection Errors { get; } = new ObservableCollection(); + public ObservableCollection Annotations { get; } = new ObservableCollection(); [JsonIgnore] public string Name @@ -419,19 +409,19 @@ public WorkspaceViewModel(WorkspaceModel model, DynamoViewModel dynamoViewModel) stateMachine = new StateMachine(this); var nodesColl = new CollectionContainer { Collection = Nodes }; - _workspaceElements.Add(nodesColl); + WorkspaceElements.Add(nodesColl); var connColl = new CollectionContainer { Collection = Connectors }; - _workspaceElements.Add(connColl); + WorkspaceElements.Add(connColl); var notesColl = new CollectionContainer { Collection = Notes }; - _workspaceElements.Add(notesColl); + WorkspaceElements.Add(notesColl); var errorsColl = new CollectionContainer { Collection = Errors }; - _workspaceElements.Add(errorsColl); + WorkspaceElements.Add(errorsColl); var annotationsColl = new CollectionContainer {Collection = Annotations}; - _workspaceElements.Add(annotationsColl); + WorkspaceElements.Add(annotationsColl); //respond to collection changes on the model by creating new view models //currently, view models are added for notes and nodes @@ -621,16 +611,16 @@ void CopyPasteChanged(object sender, EventArgs e) void Connectors_ConnectorAdded(ConnectorModel c) { var viewModel = new ConnectorViewModel(this, c); - if (_connectors.All(x => x.ConnectorModel != c)) - _connectors.Add(viewModel); + if (Connectors.All(x => x.ConnectorModel != c)) + Connectors.Add(viewModel); } void Connectors_ConnectorDeleted(ConnectorModel c) { - var connector = _connectors.FirstOrDefault(x => x.ConnectorModel == c); + var connector = Connectors.FirstOrDefault(x => x.ConnectorModel == c); if (connector != null) { - _connectors.Remove(connector); + Connectors.Remove(connector); connector.Dispose(); } } @@ -638,49 +628,49 @@ void Connectors_ConnectorDeleted(ConnectorModel c) private void Model_NoteAdded(NoteModel note) { var viewModel = new NoteViewModel(this, note); - _notes.Add(viewModel); + Notes.Add(viewModel); } private void Model_NoteRemoved(NoteModel note) { - var matchingNoteViewModel = _notes.First(x => x.Model == note); - _notes.Remove(matchingNoteViewModel); + var matchingNoteViewModel = Notes.First(x => x.Model == note); + Notes.Remove(matchingNoteViewModel); matchingNoteViewModel.Dispose(); } private void Model_NotesCleared() { - foreach (var noteViewModel in _notes) + foreach (var noteViewModel in Notes) { noteViewModel.Dispose(); } - _notes.Clear(); + Notes.Clear(); } private void Model_AnnotationAdded(AnnotationModel annotation) { var viewModel = new AnnotationViewModel(this, annotation); - _annotations.Add(viewModel); + Annotations.Add(viewModel); } private void Model_AnnotationRemoved(AnnotationModel annotation) { - _annotations.Remove(_annotations.First(x => x.AnnotationModel == annotation)); + Annotations.Remove(Annotations.First(x => x.AnnotationModel == annotation)); } private void Model_AnnotationsCleared() { - _annotations.Clear(); + Annotations.Clear(); } void Model_NodesCleared() { - foreach(var nodeViewModel in _nodes) + foreach(var nodeViewModel in Nodes) { this.unsubscribeNodeEvents(nodeViewModel); nodeViewModel.Dispose(); } - _nodes.Clear(); + Nodes.Clear(); Errors.Clear(); PostNodeChangeActions(); @@ -694,9 +684,9 @@ private void unsubscribeNodeEvents(NodeViewModel nodeViewModel) void Model_NodeRemoved(NodeModel node) { - NodeViewModel nodeViewModel = _nodes.First(x => x.NodeLogic == node); + NodeViewModel nodeViewModel = Nodes.First(x => x.NodeLogic == node); Errors.Remove(nodeViewModel.ErrorBubble); - _nodes.Remove(nodeViewModel); + Nodes.Remove(nodeViewModel); //unsub the events we attached below in NodeAdded. this.unsubscribeNodeEvents(nodeViewModel); nodeViewModel.Dispose(); @@ -709,7 +699,7 @@ void Model_NodeAdded(NodeModel node) var nodeViewModel = new NodeViewModel(this, node); nodeViewModel.SnapInputEvent += nodeViewModel_SnapInputEvent; nodeViewModel.NodeLogic.Modified += OnNodeModified; - _nodes.Add(nodeViewModel); + Nodes.Add(nodeViewModel); Errors.Add(nodeViewModel.ErrorBubble); nodeViewModel.UpdateBubbleContent(); @@ -1222,8 +1212,8 @@ internal void FitViewInternal() else { // no selection, fitview all nodes and notes - var nodes = _nodes.Select(x => x.NodeModel); - var notes = _notes.Select(x => x.Model); + var nodes = Nodes.Select(x => x.NodeModel); + var notes = Notes.Select(x => x.Model); var models = nodes.Concat(notes); if (!models.Any()) return; diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index 5cfd1b61408..f69b654228d 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -344,6 +344,8 @@ public override void Dispose() { cate.DisposeTree(); } + Model.EntryUpdated -= UpdateEntry; + Model.EntryRemoved -= RemoveEntry; base.Dispose(); } @@ -376,9 +378,6 @@ private void InitializeCore() DefineFullCategoryNames(LibraryRootCategories, ""); InsertClassesIntoTree(LibraryRootCategories); - - //TASK : MAGN 8159 - Do not Expand Geometry by Default. - //ChangeRootCategoryExpandState(BuiltinNodeCategories.GEOMETRY_CATEGORY, true); } private IEnumerable CategorizeEntries(IEnumerable entries, bool expanded) @@ -787,13 +786,6 @@ private static string MakeFullyQualifiedName(string path, string addition) path + Configurations.CategoryDelimiterString + addition; } - internal void ChangeRootCategoryExpandState(string categoryName, bool isExpanded) - { - var category = LibraryRootCategories.FirstOrDefault(cat => cat.Name == categoryName); - if (category != null && category.IsExpanded != isExpanded) - category.IsExpanded = isExpanded; - } - #endregion #region Search diff --git a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs index 25c943f6b94..b12f4183a29 100644 --- a/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/WorkspaceView.xaml.cs @@ -82,7 +82,7 @@ internal bool IsSnappedToPort public WorkspaceView() { Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoModernDictionary); - //Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoColorsAndBrushesDictionary); + Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoColorsAndBrushesDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.DataTemplatesDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.DynamoConvertersDictionary); Resources.MergedDictionaries.Add(SharedDictionaryManager.ConnectorsDictionary); From 5f0938133fd77ce7cd4ba89e1584245b007fb25e Mon Sep 17 00:00:00 2001 From: tanga Date: Thu, 17 Oct 2019 01:59:07 -0400 Subject: [PATCH 16/19] Dispose temp root cates correctly --- src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index f69b654228d..55e20883301 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -402,6 +402,10 @@ private IEnumerable CategorizeEntries(IEnumerable Date: Thu, 17 Oct 2019 15:55:24 -0400 Subject: [PATCH 17/19] Regressions --- .../ViewModels/Search/SearchViewModel.cs | 2 +- test/DynamoCoreWpfTests/SearchSideEffects.cs | 18 +++---- test/DynamoCoreWpfTests/WorkspaceSaving.cs | 48 +++++++++---------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs index 55e20883301..857054f6883 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/SearchViewModel.cs @@ -763,7 +763,7 @@ private void AddEntryToExistingCategory(NodeCategoryViewModel category, // package the category names in dyf is different from what we show it // on the tree view. so when you click on the category to populate it // triggers an update to category name. on the same instance when you uninstall - // and insall the clockwork package, the categories are named correctly but + // and install the clockwork package, the categories are named correctly but // every install triggers an update that gives a duplicate entry. so check if the // entry is already added (specific to browse). if (category.Entries.All(x => x.FullName != entry.FullName)) diff --git a/test/DynamoCoreWpfTests/SearchSideEffects.cs b/test/DynamoCoreWpfTests/SearchSideEffects.cs index 7ec9fd11725..a5669a33c05 100644 --- a/test/DynamoCoreWpfTests/SearchSideEffects.cs +++ b/test/DynamoCoreWpfTests/SearchSideEffects.cs @@ -9,16 +9,16 @@ public class SearchSideEffects : DynamoViewModelUnitTest { [Test] [Category("UnitTests")] - public void WhenStartingDynamoInputAndOutputNodesAreMissingFromSearch() + public void WhenStartingDynamoInputAndOutputNodesAreNolongerMissingFromSearch() { Assert.IsAssignableFrom( typeof(HomeWorkspaceModel), ViewModel.Model.CurrentWorkspace ); // search and results are correct - ViewModel.SearchViewModel.SearchAndUpdateResults("Input"); - Assert.AreEqual(0, ViewModel.SearchViewModel.FilteredResults.Count(x => x.Model.Name == "Input")); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Input"); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count(x => x.Model.Name == "Input")); - ViewModel.SearchViewModel.SearchAndUpdateResults("Output"); - Assert.AreEqual(0, ViewModel.SearchViewModel.FilteredResults.Count(x => x.Model.Name == "Output")); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Output"); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count(x => x.Model.Name == "Output")); } [Test] @@ -38,11 +38,11 @@ public void WhenHomeWorkspaceIsFocusedInputAndOutputNodesAreMissingFromSearch() Assert.AreEqual(model.CurrentWorkspace.Name, "Home"); // search and results are correct - ViewModel.SearchViewModel.SearchAndUpdateResults("Input"); - Assert.AreEqual(0, ViewModel.SearchViewModel.FilteredResults.Count(x => x.Model.Name == "Input")); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Input"); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count(x => x.Model.Name == "Input")); - ViewModel.SearchViewModel.SearchAndUpdateResults("Output"); - Assert.AreEqual(0, ViewModel.SearchViewModel.FilteredResults.Count(x => x.Model.Name == "Output")); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Output"); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count(x => x.Model.Name == "Output")); } [Test] diff --git a/test/DynamoCoreWpfTests/WorkspaceSaving.cs b/test/DynamoCoreWpfTests/WorkspaceSaving.cs index ad1dc701185..8cd80c4d046 100644 --- a/test/DynamoCoreWpfTests/WorkspaceSaving.cs +++ b/test/DynamoCoreWpfTests/WorkspaceSaving.cs @@ -814,10 +814,10 @@ public void CustomNodeEditNodeDescriptionKeepingViewBlockInDyf() // Set file path workspace.FileName = GetNewFileNameOnTempPath("dyf"); // search common base name - ViewModel.SearchViewModel.Visible = true; - ViewModel.SearchViewModel.SearchAndUpdateResults("Cool"); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.Visible = true; + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Cool"); // results are correct - Assert.AreEqual(1, ViewModel.SearchViewModel.FilteredResults.Count()); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); var newCustNodeInstance = dynamoModel.CustomNodeManager.CreateCustomNodeInstance(initialId); dynamoModel.CurrentWorkspace.AddAndRegisterNode(newCustNodeInstance, false); @@ -970,14 +970,14 @@ public void CustomNodeSaveAsAddsNewCustomNodeToSearch() var newId = nodeWorkspace.CustomNodeDefinition.FunctionId; - ViewModel.SearchViewModel.Visible = true; - ViewModel.SearchViewModel.SearchAndUpdateResults("Constant2"); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.Visible = true; + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Constant2"); Assert.AreEqual(originalNumElements + 1, ViewModel.Model.SearchModel.NumElements); - Assert.AreEqual(2, ViewModel.SearchViewModel.FilteredResults.Count()); + Assert.AreEqual(2, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); - var res1 = ViewModel.SearchViewModel.FilteredResults.ElementAt(0); - var res2 = ViewModel.SearchViewModel.FilteredResults.ElementAt(1); + var res1 = ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(0); + var res2 = ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(1); Assert.IsAssignableFrom(typeof(CustomNodeSearchElementViewModel), res1); Assert.IsAssignableFrom(typeof(CustomNodeSearchElementViewModel), res2); @@ -1072,20 +1072,20 @@ public void CustomNodeSaveAsAddsNewCustomNodeToSearchAndItCanBeRefactoredWhilePr Assert.AreEqual(originalNumElements + 1, ViewModel.Model.SearchModel.NumElements); // search for refactored node - ViewModel.SearchViewModel.Visible = true; - ViewModel.SearchViewModel.SearchAndUpdateResults("TheNoodle"); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.Visible = true; + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("TheNoodle"); // results are correct - Assert.AreEqual(1, ViewModel.SearchViewModel.FilteredResults.Count()); - var node3 = (CustomNodeSearchElement)ViewModel.SearchViewModel.FilteredResults.ElementAt(0).Model; + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); + var node3 = (CustomNodeSearchElement)ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(0).Model; Assert.AreEqual(newId, node3.ID); // search for un-refactored node - ViewModel.SearchViewModel.SearchAndUpdateResults("Constant2"); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Constant2"); // results are correct - Assert.AreEqual(1, ViewModel.SearchViewModel.FilteredResults.Count()); - var node4 = (CustomNodeSearchElement)ViewModel.SearchViewModel.FilteredResults.ElementAt(0).Model; + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); + var node4 = (CustomNodeSearchElement)ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(0).Model; Assert.AreEqual(oldId, node4.ID); } @@ -1127,14 +1127,14 @@ public void CustomNodeSaveAsAddsNewCustomNodeToSearchAndItCanBeRefactoredWhilePr Assert.AreEqual(originalNumElements + 1, ViewModel.Model.SearchModel.NumElements); // search common base name - ViewModel.SearchViewModel.Visible = true; - ViewModel.SearchViewModel.SearchAndUpdateResults("Constant2"); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.Visible = true; + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults("Constant2"); // results are correct - Assert.AreEqual(2, ViewModel.SearchViewModel.FilteredResults.Count()); + Assert.AreEqual(2, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); - var res1 = ViewModel.SearchViewModel.FilteredResults.ElementAt(0); - var res2 = ViewModel.SearchViewModel.FilteredResults.ElementAt(1); + var res1 = ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(0); + var res2 = ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.ElementAt(1); Assert.IsAssignableFrom(typeof(CustomNodeSearchElementViewModel), res1); Assert.IsAssignableFrom(typeof(CustomNodeSearchElementViewModel), res2); @@ -1207,7 +1207,7 @@ public void CusotmNodeSaveAsUpdateItsName() var def = dynamoModel.CustomNodeManager.CreateCustomNode(nodeName, catName, "", null); var workspace = (CustomNodeWorkspaceModel)def; - ViewModel.SearchViewModel.Visible = true; + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.Visible = true; for (var i = 0; i < 10; i++) { @@ -1219,11 +1219,11 @@ public void CusotmNodeSaveAsUpdateItsName() Assert.AreEqual(newName, workspace.Name); // Verify new name is searchable - ViewModel.SearchViewModel.SearchAndUpdateResults(newName); - Assert.AreEqual(1, ViewModel.SearchViewModel.FilteredResults.Count()); + ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.SearchAndUpdateResults(newName); + Assert.AreEqual(1, ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.Count()); // Verify search element's name is new name - var res = ViewModel.SearchViewModel.FilteredResults.First(); + var res = ViewModel.CurrentSpaceViewModel.InCanvasSearchViewModel.FilteredResults.First(); Assert.IsAssignableFrom(typeof(CustomNodeSearchElementViewModel), res); Assert.AreEqual(res.Name, newName); From 259123c1605f89ff0adcdbab718a3d3184d1782b Mon Sep 17 00:00:00 2001 From: tanga Date: Fri, 18 Oct 2019 02:17:49 -0400 Subject: [PATCH 18/19] regression none sense :) --- src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs index ebe7b1f8495..fe6cd747f12 100644 --- a/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Search/BrowserItemViewModel.cs @@ -371,7 +371,6 @@ public override void Dispose() item.PropertyChanged -= ItemOnPropertyChanged; Entries.CollectionChanged -= OnCollectionChanged; - SubCategories.CollectionChanged -= OnCollectionChanged; SubCategories.CollectionChanged -= SubCategoriesOnCollectionChanged; Items.CollectionChanged -= ItemsOnCollectionChanged; base.Dispose(); From 4a1bdf4cf755183c2c27b1ef521311543c5da0bc Mon Sep 17 00:00:00 2001 From: tanga Date: Tue, 22 Oct 2019 13:18:24 -0400 Subject: [PATCH 19/19] comments --- src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs index 1f0fdb83e94..ccc7c280bec 100644 --- a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml.cs @@ -121,7 +121,7 @@ public InfoBubbleView() { InitializeComponent(); - // Make sure to resubscribe to the event handlers + // Make sure to unsubscribe to the event handlers Unloaded += (s, e) => { Dispose();