Making code go through the new LibraryProviderSqlite rather than the old sqliteData

Put in an add item.
Put in a FilySystemWatch for the LibraryProviderFileSystem
Lots of work on LibraryProviderSqlite
CodeMaid Models.cs
This commit is contained in:
Lars Brubaker 2015-06-25 12:19:19 -07:00
parent f6d32a62a5
commit dfff3e3a71
10 changed files with 626 additions and 270 deletions

View file

@ -28,21 +28,37 @@ either expressed or implied, of the FreeBSD Project.
*/
using MatterHackers.Agg;
using MatterHackers.Agg.PlatformAbstract;
using MatterHackers.Agg.UI;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.PrintQueue;
using MatterHackers.MatterControl.SettingsManagement;
using MatterHackers.PolygonMesh;
using MatterHackers.PolygonMesh.Processors;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
public class LibraryProviderSQLite : LibraryProvider
{
private static LibraryProviderSQLite instance = null;
private static PrintItemCollection rotLibraryCollection;
private List<PrintItemCollection> childCollections = new List<PrintItemCollection>();
private PrintItemCollection collectionBase = GetRootLibraryCollection();
private string keywordFilter = string.Empty;
private string parentProviderKey = null;
private List<PrintItemWrapper> printItems = new List<PrintItemWrapper>();
public LibraryProviderSQLite()
{
LoadLibraryItems();
}
public new static LibraryProviderSQLite Instance
{
get
@ -68,7 +84,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
get
{
return 0;
return childCollections.Count;
}
}
@ -89,7 +105,7 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
get
{
return LibrarySQLiteData.Instance.ItemCount;
return printItems.Count;
}
}
@ -97,12 +113,12 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
get
{
return LibrarySQLiteData.Instance.KeywordFilter;
return keywordFilter;
}
set
{
LibrarySQLiteData.Instance.KeywordFilter = value;
keywordFilter = value;
}
}
@ -122,19 +138,146 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
}
}
public static IEnumerable<PrintItem> GetAllPrintItemsRecursive()
{
// NOTE: We are making the assumption that everything is reference if it does not have a 0 in eth PrintItemCollectionID.
string query = "SELECT * FROM PrintItem WHERE PrintItemCollectionID != 0;";
IEnumerable<PrintItem> result = (IEnumerable<PrintItem>)Datastore.Instance.dbSQLite.Query<PrintItem>(query);
return result;
}
public static PrintItemCollection GetRootLibraryCollection()
{
// Attempt to initialize the library from the Datastore if null
if (rotLibraryCollection == null)
{
rotLibraryCollection = Datastore.Instance.dbSQLite.Table<PrintItemCollection>().Where(v => v.Name == "_library").Take(1).FirstOrDefault();
}
// If the _library collection is still missing, create and populate it with default content
if (rotLibraryCollection == null)
{
rotLibraryCollection = new PrintItemCollection();
rotLibraryCollection.Name = "_library";
rotLibraryCollection.Commit();
// Preload library with Oem supplied list of default parts
string[] itemsToAdd = SyncCalibrationFilesToDisk(OemSettings.Instance.PreloadedLibraryFiles);
if (itemsToAdd.Length > 0)
{
// Import any files sync'd to disk into the library, then add them to the queue
Instance.AddFilesToLibrary(itemsToAdd);
}
}
return rotLibraryCollection;
}
static public void SaveToLibraryFolder(PrintItemWrapper printItemWrapper, List<MeshGroup> meshGroups, bool AbsolutePositioned)
{
string[] metaData = { "Created By", "MatterControl" };
if (AbsolutePositioned)
{
metaData = new string[] { "Created By", "MatterControl", "BedPosition", "Absolute" };
}
if (printItemWrapper.FileLocation.Contains(ApplicationDataStorage.Instance.ApplicationLibraryDataPath))
{
MeshOutputSettings outputInfo = new MeshOutputSettings(MeshOutputSettings.OutputType.Binary, metaData);
MeshFileIo.Save(meshGroups, printItemWrapper.FileLocation, outputInfo);
}
else // save a copy to the library and update this to point at it
{
string fileName = Path.ChangeExtension(Path.GetRandomFileName(), ".amf");
printItemWrapper.FileLocation = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, fileName);
MeshOutputSettings outputInfo = new MeshOutputSettings(MeshOutputSettings.OutputType.Binary, metaData);
MeshFileIo.Save(meshGroups, printItemWrapper.FileLocation, outputInfo);
printItemWrapper.PrintItem.Commit();
// let the queue know that the item has changed so it load the correct part
QueueData.Instance.SaveDefaultQueue();
}
printItemWrapper.OnFileHasChanged();
}
public static string[] SyncCalibrationFilesToDisk(List<string> calibrationPrintFileNames)
{
// Ensure the CalibrationParts directory exists to store/import the files from disk
string tempPath = Path.Combine(ApplicationDataStorage.Instance.ApplicationUserDataPath, "data", "temp", "calibration-parts");
Directory.CreateDirectory(tempPath);
// Build a list of temporary files that should be imported into the library
return calibrationPrintFileNames.Where(fileName =>
{
// Filter out items that already exist in the library
return Instance.GetLibraryItems(Path.GetFileNameWithoutExtension(fileName)).Count() <= 0;
}).Select(fileName =>
{
// Copy calibration prints from StaticData to the filesystem before importing into the library
string tempFile = Path.Combine(tempPath, Path.GetFileName(fileName));
using (FileStream outstream = File.OpenWrite(tempFile))
using (Stream instream = StaticData.Instance.OpenSteam(Path.Combine("OEMSettings", "SampleParts", fileName)))
{
instream.CopyTo(outstream);
}
// Project the new filename to the output
return tempFile;
}).ToArray();
}
public override void AddCollectionToLibrary(string collectionName)
{
PrintItemCollection newCollection = new PrintItemCollection(collectionName, "");
newCollection.ParentCollectionID = collectionBase.Id;
newCollection.Commit();
}
public override void AddFilesToLibrary(IList<string> files, List<ProviderLocatorNode> providerSavePath = null, ReportProgressRatio reportProgress = null, RunWorkerCompletedEventHandler callback = null)
{
if (files != null && files.Count > 0)
{
BackgroundWorker loadFilesIntoLibraryBackgroundWorker = new BackgroundWorker();
loadFilesIntoLibraryBackgroundWorker.WorkerReportsProgress = true;
loadFilesIntoLibraryBackgroundWorker.DoWork += new DoWorkEventHandler(loadFilesIntoLibraryBackgoundWorker_DoWork);
loadFilesIntoLibraryBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(loadFilesIntoLibraryBackgroundWorker_RunWorkerCompleted);
if (callback != null)
{
loadFilesIntoLibraryBackgroundWorker.RunWorkerCompleted += callback;
}
loadFilesIntoLibraryBackgroundWorker.RunWorkerAsync(files);
}
}
public override void AddItem(PrintItemWrapper itemToAdd)
{
throw new NotImplementedException();
}
public override void AddFilesToLibrary(IList<string> files, List<ProviderLocatorNode> providerSavePath, ReportProgressRatio reportProgress = null, RunWorkerCompletedEventHandler callback = null)
public void AddItem(PrintItemWrapper item, int indexToInsert = -1)
{
LibrarySQLiteData.Instance.LoadFilesIntoLibrary(files, reportProgress, callback);
if (indexToInsert == -1)
{
indexToInsert = printItems.Count;
}
printItems.Insert(indexToInsert, item);
// Check if the collection we are adding to is the the currently visible collection.
List<ProviderLocatorNode> currentDisplayedCollection = LibraryProvider.Instance.GetProviderLocator();
if (currentDisplayedCollection.Count > 0 && currentDisplayedCollection[1].Key == LibraryProviderSQLite.StaticProviderKey)
{
OnItemAdded(new IndexArgs(indexToInsert));
}
item.PrintItem.PrintItemCollectionID = GetRootLibraryCollection().Id;
item.PrintItem.Commit();
}
public override PrintItemCollection GetCollectionItem(int collectionIndex)
{
throw new NotImplementedException();
return childCollections[collectionIndex];
}
public override PrintItemCollection GetParentCollectionItem()
@ -149,9 +292,14 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
}
}
public override PrintItemWrapper GetPrintItemWrapper(int itemIndex)
public override PrintItemWrapper GetPrintItemWrapper(int index)
{
return LibrarySQLiteData.Instance.GetPrintItemWrapper(itemIndex);
if (index >= 0 && index < printItems.Count)
{
return printItems[index];
}
return null;
}
public override List<ProviderLocatorNode> GetProviderLocator()
@ -159,6 +307,22 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
throw new NotImplementedException();
}
public void LoadLibraryItems()
{
printItems.Clear();
IEnumerable<PrintItem> partFiles = GetLibraryItems(KeywordFilter);
if (partFiles != null)
{
foreach (PrintItem part in partFiles)
{
printItems.Add(new PrintItemWrapper(part));
}
}
childCollections.Clear();
childCollections.AddRange(GetChildCollections());
}
public override void RemoveCollection(string collectionName)
{
throw new NotImplementedException();
@ -166,7 +330,19 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
public override void RemoveItem(PrintItemWrapper printItemWrapper)
{
LibrarySQLiteData.Instance.RemoveItem(printItemWrapper);
int index = printItems.IndexOf(printItemWrapper);
if (index < 0)
{
// It may be possible to have the same item in the remove list twice.
// so if it is not in the PrintItems then ignore it.
return;
}
printItems.RemoveAt(index);
// and remove it from the data base
printItemWrapper.Delete();
OnItemRemoved(new IndexArgs(index));
}
public override void SaveToLibrary(PrintItemWrapper printItemWrapper, List<MeshGroup> meshGroupsToSave, List<ProviderLocatorNode> providerSavePath)
@ -176,6 +352,9 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
public override void SetCollectionBase(PrintItemCollection collectionBase)
{
this.collectionBase = collectionBase;
LoadLibraryItems();
}
public void SetParentKey(string parentKey)
@ -183,5 +362,130 @@ namespace MatterHackers.MatterControl.PrintLibrary.Provider
this.parentProviderKey = parentKey;
UiThread.RunOnIdle(() => LibraryProvider.OnDataReloaded(null));
}
private static void AddStlOrGcode(string loadedFileName, string extension)
{
PrintItem printItem = new PrintItem();
printItem.Name = Path.GetFileNameWithoutExtension(loadedFileName);
printItem.FileLocation = Path.GetFullPath(loadedFileName);
printItem.PrintItemCollectionID = GetRootLibraryCollection().Id;
printItem.Commit();
if (MeshFileIo.ValidFileExtensions().Contains(extension))
{
List<MeshGroup> meshToConvertAndSave = MeshFileIo.Load(loadedFileName);
try
{
PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem);
SaveToLibraryFolder(printItemWrapper, meshToConvertAndSave, false);
Instance.AddItem(printItemWrapper);
}
catch (System.UnauthorizedAccessException)
{
UiThread.RunOnIdle(() =>
{
//Do something special when unauthorized?
StyledMessageBox.ShowMessageBox(null, "Oops! Unable to save changes, unauthorized access", "Unable to save");
});
}
catch
{
UiThread.RunOnIdle(() =>
{
StyledMessageBox.ShowMessageBox(null, "Oops! Unable to save changes.", "Unable to save");
});
}
}
else // it is not a mesh so just add it
{
PrintItemWrapper printItemWrapper = new PrintItemWrapper(printItem);
if (false)
{
Instance.AddItem(printItemWrapper);
}
else // save a copy to the library and update this to point at it
{
string sourceFileName = printItem.FileLocation;
string newFileName = Path.ChangeExtension(Path.GetRandomFileName(), Path.GetExtension(printItem.FileLocation));
string destFileName = Path.Combine(ApplicationDataStorage.Instance.ApplicationLibraryDataPath, newFileName);
File.Copy(sourceFileName, destFileName, true);
printItemWrapper.FileLocation = destFileName;
printItemWrapper.PrintItem.Commit();
// let the queue know that the item has changed so it load the correct part
Instance.AddItem(printItemWrapper);
}
}
}
private IEnumerable<PrintItemCollection> GetChildCollections()
{
if (collectionBase != null)
{
string query;
query = string.Format("SELECT * FROM PrintItemCollection WHERE ParentCollectionID = {0} ORDER BY Name ASC;", collectionBase.Id);
IEnumerable<PrintItemCollection> result = (IEnumerable<PrintItemCollection>)Datastore.Instance.dbSQLite.Query<PrintItemCollection>(query);
return result;
}
return null;
}
private IEnumerable<PrintItem> GetLibraryItems(string keyphrase = null)
{
if (collectionBase != null)
{
string query;
if (keyphrase == null)
{
query = string.Format("SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} ORDER BY Name ASC;", collectionBase.Id);
}
else
{
query = string.Format("SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} AND Name LIKE '%{1}%' ORDER BY Name ASC;", collectionBase.Id, keyphrase);
}
IEnumerable<PrintItem> result = (IEnumerable<PrintItem>)Datastore.Instance.dbSQLite.Query<PrintItem>(query);
return result;
}
return null;
}
private void loadFilesIntoLibraryBackgoundWorker_DoWork(object sender, DoWorkEventArgs e)
{
IList<string> fileList = e.Argument as IList<string>;
foreach (string loadedFileName in fileList)
{
string extension = Path.GetExtension(loadedFileName).ToUpper();
if (MeshFileIo.ValidFileExtensions().Contains(extension)
|| extension == ".GCODE"
|| extension == ".ZIP")
{
if (extension == ".ZIP")
{
ProjectFileHandler project = new ProjectFileHandler(null);
List<PrintItem> partFiles = project.ImportFromProjectArchive(loadedFileName);
if (partFiles != null)
{
foreach (PrintItem part in partFiles)
{
AddStlOrGcode(part.FileLocation, Path.GetExtension(part.FileLocation).ToUpper());
}
}
}
else
{
AddStlOrGcode(loadedFileName, extension);
}
}
}
}
private void loadFilesIntoLibraryBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
}
}