From e3c6333ba16444aaea96e9314fc16a04bd09e39a Mon Sep 17 00:00:00 2001 From: John Lewin Date: Thu, 17 Sep 2015 07:36:46 -0700 Subject: [PATCH] Reduce library flickering - Prevent the LibraryProviderSelector from creating new providers when it already has ones loaded, stored and referenced - Add WebRequest2 type to support custom post/request values --- Library/PrintLibraryWidget.cs | 17 ++++++++++++---- Library/Provider/LibraryProvider.cs | 11 +++++++++++ Library/Provider/LibraryProviderSelector.cs | 6 ++++++ VersionManagement/WebRequestHandler.cs | 22 +++++++++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/Library/PrintLibraryWidget.cs b/Library/PrintLibraryWidget.cs index 123fc926a..0c646855e 100644 --- a/Library/PrintLibraryWidget.cs +++ b/Library/PrintLibraryWidget.cs @@ -39,6 +39,7 @@ using MatterHackers.VectorMath; using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; namespace MatterHackers.MatterControl.PrintLibrary @@ -546,11 +547,19 @@ namespace MatterHackers.MatterControl.PrintLibrary { libraryDataView.SelectedItems.Sort(SortRowItemsOnIndex); - // remove them last to first - for(int i=libraryDataView.SelectedItems.Count-1; i>=0; i--) + if (libraryDataView.SelectedItems.Count == 1) { - LibraryRowItem item = libraryDataView.SelectedItems[i]; - item.RemoveFromCollection(); + // remove them last to first + for (int i = libraryDataView.SelectedItems.Count - 1; i >= 0; i--) + { + LibraryRowItem item = libraryDataView.SelectedItems[i]; + item.RemoveFromCollection(); + } + } + else if (libraryDataView.SelectedItems.Count > 1) + { + var indexesToRemove = libraryDataView.SelectedItems.Cast().Select(l => l.ItemIndex).ToArray(); + libraryDataView.CurrentLibraryProvider.RemoveItems(indexesToRemove); } libraryDataView.ClearSelectedItems(); diff --git a/Library/Provider/LibraryProvider.cs b/Library/Provider/LibraryProvider.cs index 76a91e55f..47a1a960c 100644 --- a/Library/Provider/LibraryProvider.cs +++ b/Library/Provider/LibraryProvider.cs @@ -38,6 +38,7 @@ using MatterHackers.PolygonMesh.Processors; using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; namespace MatterHackers.MatterControl.PrintLibrary.Provider @@ -180,6 +181,16 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider public abstract void RemoveItem(int itemIndexToRemove); + // Base implmentation simply calls RemoveItem + public virtual void RemoveItems(int[] indexes) + { + // Remove items in reverse order + foreach (var i in indexes.OrderByDescending(i => i)) + { + RemoveItem(i); + } + } + public abstract void RenameCollection(int collectionIndexToRename, string newName); public abstract void RenameItem(int itemIndexToRename, string newName); diff --git a/Library/Provider/LibraryProviderSelector.cs b/Library/Provider/LibraryProviderSelector.cs index f81fae5bc..24c3dda5c 100644 --- a/Library/Provider/LibraryProviderSelector.cs +++ b/Library/Provider/LibraryProviderSelector.cs @@ -262,6 +262,12 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider public override LibraryProvider GetProviderForCollection(PrintItemCollection collection) { + LibraryProvider provider = libraryProviders.Values.Where(p => p.ProviderKey == collection.Key).FirstOrDefault(); + if (provider != null) + { + return provider; + } + foreach (ILibraryCreator libraryCreator in libraryCreators) { if (collection.Key == libraryCreator.ProviderKey) diff --git a/VersionManagement/WebRequestHandler.cs b/VersionManagement/WebRequestHandler.cs index 5a5ca8e5a..82b947229 100644 --- a/VersionManagement/WebRequestHandler.cs +++ b/VersionManagement/WebRequestHandler.cs @@ -157,6 +157,28 @@ namespace MatterHackers.MatterControl.VersionManagement } } + /// + /// Provides a WebReqeustBase implementation that allows the caller to specify the serialization object used by the WebRequestBase http post + /// + /// The type which will be passed to the Request method, stored in a local instance and serialized for the http post + public class WebRequest2 : WebRequestBase where RequestType : class + { + private RequestType localRequestValues; + + public void Request(string requestUrl, RequestType requestValues) + { + this.uri = requestUrl; + localRequestValues = requestValues; + this.Request(); + } + + protected override string getJsonToSend() + { + return JsonConvert.SerializeObject(localRequestValues); + } + } + + public class WebRequestBase { protected Dictionary requestValues;