diff --git a/Library/LibraryDataView.cs b/Library/LibraryDataView.cs index 3a2776968..d5565f6a1 100644 --- a/Library/LibraryDataView.cs +++ b/Library/LibraryDataView.cs @@ -64,8 +64,16 @@ namespace MatterHackers.MatterControl.PrintLibrary public static RootedObjectEventHandler ChangedCurrentLibraryProvider = new RootedObjectEventHandler(); + private static LibraryDataView libraryDataViewInstance = null; + public LibraryDataView() { + if (libraryDataViewInstance != null) + { + throw new Exception("There should only ever be one of these, Lars."); + } + libraryDataViewInstance = this; + // set the display attributes { this.AnchorAll(); @@ -83,7 +91,6 @@ namespace MatterHackers.MatterControl.PrintLibrary AddAllItems(); this.MouseLeaveBounds += new EventHandler(control_MouseLeaveBounds); - LibraryProvider.DataReloaded.RegisterEvent(LibraryDataReloaded, ref unregisterEvents); } public delegate void HoverValueChangedEventHandler(object sender, EventArgs e); @@ -110,10 +117,16 @@ namespace MatterHackers.MatterControl.PrintLibrary { if (currentLibraryProvider != value) { + // unhook the update we were getting + currentLibraryProvider.DataReloaded -= libraryDataViewInstance.LibraryDataReloaded; + // and hook the new one + value.DataReloaded += libraryDataViewInstance.LibraryDataReloaded; + bool isChildOfCurrent = value.ParentLibraryProvider == currentLibraryProvider; // Dispose of all children below this one. - while (!isChildOfCurrent && currentLibraryProvider != value && currentLibraryProvider.ParentLibraryProvider != null) + while (!isChildOfCurrent && currentLibraryProvider != value + && currentLibraryProvider.ParentLibraryProvider != null) { LibraryProvider parent = currentLibraryProvider.ParentLibraryProvider; currentLibraryProvider.Dispose(); @@ -314,11 +327,14 @@ namespace MatterHackers.MatterControl.PrintLibrary public override void OnClosed(EventArgs e) { + currentLibraryProvider.DataReloaded -= LibraryDataReloaded; + if (unregisterEvents != null) { unregisterEvents(this, null); } base.OnClosed(e); + libraryDataViewInstance = null; } public override void OnDraw(Graphics2D graphics2D) diff --git a/Library/Provider/LibraryProvider.cs b/Library/Provider/LibraryProvider.cs index 716935133..49cea0d81 100644 --- a/Library/Provider/LibraryProvider.cs +++ b/Library/Provider/LibraryProvider.cs @@ -42,7 +42,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider { public abstract class LibraryProvider : IDisposable { - public static RootedObjectEventHandler DataReloaded = new RootedObjectEventHandler(); + public event EventHandler DataReloaded; private LibraryProvider parentLibraryProvider = null; public LibraryProvider(LibraryProvider parentLibraryProvider) @@ -163,9 +163,12 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider #region Static Methods - public static void OnDataReloaded(EventArgs eventArgs) + public void OnDataReloaded(EventArgs eventArgs) { - DataReloaded.CallEvents(null, eventArgs); + if (DataReloaded != null) + { + DataReloaded(null, eventArgs); + } } #endregion Static Methods diff --git a/Library/Provider/LibraryProviderFileSystem.cs b/Library/Provider/LibraryProviderFileSystem.cs index d93388207..75d6bb7e8 100644 --- a/Library/Provider/LibraryProviderFileSystem.cs +++ b/Library/Provider/LibraryProviderFileSystem.cs @@ -304,7 +304,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider { } - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } private string GetPathFromLocator(List providerLocator) diff --git a/Library/Provider/LibraryProviderSelector.cs b/Library/Provider/LibraryProviderSelector.cs index d3a174fc9..a58fe1fc6 100644 --- a/Library/Provider/LibraryProviderSelector.cs +++ b/Library/Provider/LibraryProviderSelector.cs @@ -111,7 +111,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider private void FilterProviders() { this.visibleProviders = libraryProviders.Where(p => p.Visible).ToList(); - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } public void CloudSyncStatusChanged(object sender, EventArgs eventArgs) diff --git a/Library/Provider/LibraryProviderSqlite.cs b/Library/Provider/LibraryProviderSqlite.cs index 8378827de..48dfa7121 100644 --- a/Library/Provider/LibraryProviderSqlite.cs +++ b/Library/Provider/LibraryProviderSqlite.cs @@ -265,7 +265,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider if (baseLibraryCollection != null) { LoadLibraryItems(); - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } } } @@ -328,14 +328,14 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider childCollections.AddRange(collections); } - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } public override void RemoveCollection(int collectionIndexToRemove) { childCollections[collectionIndexToRemove].Delete(); LoadLibraryItems(); - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } public override void RemoveItem(int itemToRemoveIndex) @@ -352,7 +352,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider printItems.RemoveAt(itemToRemoveIndex); - LibraryProvider.OnDataReloaded(null); + OnDataReloaded(null); } private static void AddStlOrGcode(LibraryProviderSQLite libraryToAddTo, string loadedFileName, string extension) diff --git a/Tests/MatterControl.Tests/MatterControl/LibraryProviderTests.cs b/Tests/MatterControl.Tests/MatterControl/LibraryProviderTests.cs index 1c807fd36..9893ee36b 100644 --- a/Tests/MatterControl.Tests/MatterControl/LibraryProviderTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/LibraryProviderTests.cs @@ -64,6 +64,8 @@ namespace MatterControl.Tests Thread.Sleep(3000); // wait for the library to finish initializing LibraryProviderFileSystem testProvider = new LibraryProviderFileSystem(pathToMesh, "TestPath", null); + testProvider.DataReloaded += (sender, e) => { dataReloaded = true; }; + Assert.IsTrue(testProvider.CollectionCount == 0, "Start with a new database for these tests."); Assert.IsTrue(testProvider.ItemCount == 1, "Start with a new database for these tests."); @@ -82,6 +84,7 @@ namespace MatterControl.Tests // add an item works correctly LibraryProvider subProvider = testProvider.GetProviderForCollection(testProvider.GetCollectionItem(0)); + subProvider.DataReloaded += (sender, e) => { dataReloaded = true; }; dataReloaded = false; //itemAdded = false; string subPathAndFile = Path.Combine(createdDirectory, meshFileName); @@ -121,6 +124,7 @@ namespace MatterControl.Tests { Datastore.Instance.Initialize(); LibraryProviderSQLite testProvider = new LibraryProviderSQLite(null, null); + testProvider.DataReloaded += (sender, e) => { dataReloaded = true; }; Thread.Sleep(3000); // wait for the library to finish initializing Assert.IsTrue(testProvider.CollectionCount == 0, "Start with a new database for these tests."); Assert.IsTrue(testProvider.ItemCount == 1, "Start with a new database for these tests."); @@ -174,8 +178,6 @@ namespace MatterControl.Tests meshPathAndFileName = Path.Combine(pathToMesh, meshFileName); dataReloaded = false; - - LibraryProvider.DataReloaded.RegisterEvent((sender, e) => { dataReloaded = true; }, ref unregisterEvents); } [TearDown]