diff --git a/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs b/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs index bb90b8846e4..7da9efdfa83 100644 --- a/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs +++ b/src/DynamoCoreWpf/Extensions/ViewLoadedParams.cs @@ -9,7 +9,6 @@ using Dynamo.Utilities; using Dynamo.ViewModels; using Dynamo.Visualization; -using Dynamo.Wpf.ViewModels; using Dynamo.Wpf.ViewModels.Watch3D; namespace Dynamo.Wpf.Extensions diff --git a/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs b/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs index 5478854f6c7..a9c6a4f19f4 100644 --- a/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs +++ b/src/DynamoCoreWpf/Views/Core/DynamoView.xaml.cs @@ -68,6 +68,8 @@ public partial class DynamoView : Window, IDisposable internal ViewExtensionManager viewExtensionManager; private ShortcutToolbar shortcutBar; private bool loaded = false; + // This event is raised on the dynamo view when an extension tab is closed. + internal static event Action CloseExtension; internal ObservableCollection TabItems { set; get; } = new ObservableCollection(); @@ -203,14 +205,15 @@ public DynamoView(DynamoViewModel dynamoViewModel) } /// - /// This method close a tab item in the right side bar based on passed extension + /// This method will close a tab item in the right side bar based on passed extension /// /// Extension to be closed /// internal void CloseTabItem(IViewExtension viewExtension) { string tabName = viewExtension.Name; - CloseTab(tabName); + TabItem tabitem = TabItems.OfType().SingleOrDefault(n => n.Header.ToString() == tabName); + CloseTab(tabitem); } // This method adds a tab item to the right side bar and @@ -227,6 +230,7 @@ internal TabItem AddTabItem(IViewExtension viewExtension, ContentControl content TabItem tab = new TabItem(); tab.Header = viewExtension.Name; tab.Tag = viewExtension.GetType(); + tab.Uid = viewExtension.UniqueId; tab.HeaderTemplate = tabDynamic.FindResource("TabHeader") as DataTemplate; // setting the extension UI to the current tab content @@ -242,7 +246,6 @@ internal TabItem AddTabItem(IViewExtension viewExtension, ContentControl content //Insert the tab at the end TabItems.Insert(count, tab); - TabItems = TabItems; tabDynamic.DataContext = TabItems; tabDynamic.SelectedItem = tab; @@ -255,31 +258,35 @@ internal TabItem AddTabItem(IViewExtension viewExtension, ContentControl content // This method triggers the close operation on the selected tab. private void CloseTab(object sender, RoutedEventArgs e) { - string tabName = (sender as Button).CommandParameter.ToString(); - CloseTab(tabName); + string tabName = (sender as Button).DataContext.ToString(); + + CloseExtension?.Invoke(tabName); + + TabItem tabitem = TabItems.OfType().SingleOrDefault(n => n.Header.ToString() == tabName); + CloseTab(tabitem); } /// /// Close tab by its name /// - /// tab name - private void CloseTab(string tabName) + /// tab item + private void CloseTab(TabItem tabitem) { - TabItem tab = tabDynamic.SelectedItem as TabItem; + TabItem tabToBeRemoved = tabitem; - if (tab != null) - { - // get the selected tab - TabItem selectedTab = tabDynamic.SelectedItem as TabItem; + // get the selected tab + TabItem selectedTab = tabDynamic.SelectedItem as TabItem; + if (tabToBeRemoved != null) + { // clear tab control binding and bind to the new tab-list. tabDynamic.DataContext = null; - TabItems.Remove(tab); + TabItems.Remove(tabToBeRemoved); TabItems = TabItems; tabDynamic.DataContext = TabItems; // Highlight previously selected tab. if that is removed then Highlight the first tab - if (selectedTab == null || selectedTab.Equals(tab)) + if (selectedTab.Equals(tabToBeRemoved)) { if (TabItems.Count > 0) { diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs index ff1ef12fbdf..b867223f30b 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyView.xaml.cs @@ -6,6 +6,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; +using Dynamo.Controls; using Dynamo.Graph.Workspaces; using Dynamo.Logging; using Dynamo.Utilities; @@ -53,6 +54,10 @@ private Boolean HasDependencyIssue if (hasDependencyIssue) { loadedParams.AddToExtensionsSideBar(dependencyViewExtension, this); + if (dependencyViewExtension.workspaceReferencesMenuItem != null && !dependencyViewExtension.workspaceReferencesMenuItem.IsChecked) + { + dependencyViewExtension.workspaceReferencesMenuItem.IsChecked = true; + } } } } @@ -167,6 +172,21 @@ public WorkspaceDependencyView(WorkspaceDependencyViewExtension viewExtension, V packageInstaller = p.PackageInstaller; dependencyViewExtension = viewExtension; DependencyRegen(currentWorkspace); + DynamoView.CloseExtension += this.OnExtensionTabClosedHandler; + } + + /// + /// This event is raised when an extension tab is closed and this event + /// is subscribed by the Workspace dependency view extension. + /// + /// + internal event Action OnExtensionTabClosed; + private void OnExtensionTabClosedHandler(String extensionTabName) + { + if (OnExtensionTabClosed != null) + { + OnExtensionTabClosed(extensionTabName); + } } /// @@ -247,6 +267,7 @@ public void Dispose() loadedParams.CurrentWorkspaceChanged -= OnWorkspaceChanged; loadedParams.CurrentWorkspaceCleared -= OnWorkspaceCleared; WorkspaceModel.DummyNodesReloaded -= TriggerDependencyRegen; + DynamoView.CloseExtension -= this.OnExtensionTabClosedHandler; } private void Refresh_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) diff --git a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs index bf18e1702d2..289a2809c74 100644 --- a/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs +++ b/src/WorkspaceDependencyViewExtension/WorkspaceDependencyViewExtension.cs @@ -17,7 +17,8 @@ namespace Dynamo.WorkspaceDependency /// public class WorkspaceDependencyViewExtension : IViewExtension, ILogSource { - private MenuItem packageDependencyMenuItem; + internal MenuItem workspaceReferencesMenuItem; + private const String extensionName = "Workspace References"; internal WorkspaceDependencyView DependencyView { @@ -34,7 +35,7 @@ public string Name { get { - return "Workspace References"; + return extensionName; } } @@ -54,6 +55,7 @@ public string UniqueId /// public void Dispose() { + DependencyView.OnExtensionTabClosed -= OnCloseExtension; } @@ -74,11 +76,20 @@ public void Startup(ViewStartupParams viewLoadedParams) } public event Action MessageLogged; + internal void OnMessageLogged(ILogMessage msg) { this.MessageLogged?.Invoke(msg); } + internal void OnCloseExtension(String extensionTabName) + { + if (extensionTabName.Equals(extensionName)) + { + this.workspaceReferencesMenuItem.IsChecked = false; + } + } + public void Loaded(ViewLoadedParams viewLoadedParams) { DependencyView = new WorkspaceDependencyView(this, viewLoadedParams); @@ -90,23 +101,27 @@ public void Loaded(ViewLoadedParams viewLoadedParams) DependencyView.DependencyRegen(viewLoadedParams.CurrentWorkspaceModel as WorkspaceModel); }; + DependencyView.OnExtensionTabClosed += OnCloseExtension; + // Adding a button in view menu to refresh and show manually - packageDependencyMenuItem = new MenuItem { Header = Resources.MenuItemString, IsCheckable = true, IsChecked = false }; - packageDependencyMenuItem.Click += (sender, args) => + workspaceReferencesMenuItem = new MenuItem { Header = Resources.MenuItemString, IsCheckable = true, IsChecked = false }; + workspaceReferencesMenuItem.Click += (sender, args) => { - if (packageDependencyMenuItem.IsChecked) + if (workspaceReferencesMenuItem.IsChecked) { // Refresh dependency data DependencyView.DependencyRegen(viewLoadedParams.CurrentWorkspaceModel as WorkspaceModel); viewLoadedParams.AddToExtensionsSideBar(this, DependencyView); + workspaceReferencesMenuItem.IsChecked = true; } else { viewLoadedParams.CloseExtensioninInSideBar(this); + workspaceReferencesMenuItem.IsChecked = false; } }; - viewLoadedParams.AddMenuItem(MenuBarType.View, packageDependencyMenuItem); + viewLoadedParams.AddMenuItem(MenuBarType.View, workspaceReferencesMenuItem); } }