2015-06-10 17:53:17 -07:00
/ *
Copyright ( c ) 2015 , Lars Brubaker
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are met :
1. Redistributions of source code must retain the above copyright notice , this
list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
and / or other materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies ,
either expressed or implied , of the FreeBSD Project .
* /
2015-09-22 15:20:49 -07:00
using MatterHackers.Agg ;
2015-06-25 12:19:19 -07:00
using MatterHackers.Agg.PlatformAbstract ;
2015-06-17 17:58:38 -07:00
using MatterHackers.Agg.UI ;
2016-01-14 14:20:11 -08:00
using MatterHackers.Localizations ;
2015-06-12 17:21:51 -07:00
using MatterHackers.MatterControl.DataStorage ;
2015-06-10 17:53:17 -07:00
using MatterHackers.MatterControl.PrintQueue ;
2015-06-25 12:19:19 -07:00
using MatterHackers.MatterControl.SettingsManagement ;
2015-06-22 18:21:56 -07:00
using MatterHackers.PolygonMesh ;
2015-06-25 12:19:19 -07:00
using MatterHackers.PolygonMesh.Processors ;
2015-06-10 17:53:17 -07:00
using System ;
using System.Collections.Generic ;
2015-09-10 12:42:52 -07:00
using System.Diagnostics ;
2015-06-25 12:19:19 -07:00
using System.IO ;
using System.Linq ;
2015-09-10 12:42:52 -07:00
using System.Threading ;
2015-07-02 11:23:44 -07:00
using System.Threading.Tasks ;
2015-06-10 17:53:17 -07:00
namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
2015-08-25 12:01:15 -07:00
public class LibraryProviderSQLite : LibraryProvider
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
public static bool PreloadingCalibrationFiles = false ;
2015-08-13 17:48:34 -07:00
protected PrintItemCollection baseLibraryCollection ;
protected List < PrintItemCollection > childCollections = new List < PrintItemCollection > ( ) ;
2015-08-25 12:11:35 -07:00
private bool ignoreNextKeywordFilter = false ;
2015-08-25 12:01:15 -07:00
private string keywordFilter = string . Empty ;
2015-09-09 15:35:31 -07:00
private List < PrintItem > printItems = new List < PrintItem > ( ) ;
2015-08-25 12:01:15 -07:00
2015-09-22 15:20:49 -07:00
public static RootedObjectEventHandler ItemAdded = new RootedObjectEventHandler ( ) ;
2015-09-03 12:21:20 -07:00
2015-10-06 18:47:35 -07:00
private Object initializingLock = new Object ( ) ;
public LibraryProviderSQLite ( PrintItemCollection callerSuppliedCollection , Action < LibraryProvider > setCurrentLibraryProvider , LibraryProvider parentLibraryProvider , string visibleName )
2015-09-02 11:05:50 -07:00
: base ( parentLibraryProvider , setCurrentLibraryProvider )
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:01:15 -07:00
this . Name = visibleName ;
2015-10-06 18:47:35 -07:00
// Lock ensures that SQLite providers initialized near the same time from different threads (which has been observed during debug)
// will run in a serial fashion and only one instance will construct and assign to .baseLibraryCollection
lock ( initializingLock )
2015-08-25 12:01:15 -07:00
{
2015-10-06 18:47:35 -07:00
// Use null coalescing operator to assign either the caller supplied collection or if null, the root library collection
this . baseLibraryCollection = callerSuppliedCollection ? ? GetRootLibraryCollection ( ) ;
2015-08-25 12:01:15 -07:00
}
LoadLibraryItems ( ) ;
2015-09-03 12:21:20 -07:00
2015-09-22 15:20:49 -07:00
ItemAdded . RegisterEvent ( DatabaseFileChange , ref unregisterEvents ) ;
2015-09-03 12:21:20 -07:00
}
2016-12-29 06:55:12 -08:00
private EventHandler unregisterEvents ;
2015-09-22 15:20:49 -07:00
2015-09-10 12:42:52 -07:00
public override void Dispose ( )
2015-09-03 12:21:20 -07:00
{
2015-09-22 15:20:49 -07:00
if ( unregisterEvents ! = null )
{
unregisterEvents ( this , null ) ;
}
ItemAdded . UnregisterEvent ( DatabaseFileChange , ref unregisterEvents ) ;
2015-08-13 17:48:34 -07:00
}
2015-09-10 12:42:52 -07:00
Stopwatch timeSinceLastChange = new Stopwatch ( ) ;
private async void DatabaseFileChange ( object sender , EventArgs e )
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
if ( timeSinceLastChange . IsRunning )
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
// rest the time so we will wait a bit longer
timeSinceLastChange . Restart ( ) ;
// we already have a pending update so we'll just wait for that one to complete
}
else
{
// start the time before we do the refresh
timeSinceLastChange . Restart ( ) ;
// run a thread to wait for the time to elapse
await Task . Run ( ( ) = >
2015-08-25 12:11:35 -07:00
{
2015-09-10 12:42:52 -07:00
while ( timeSinceLastChange . Elapsed . TotalSeconds < . 5 )
{
Thread . Sleep ( 10 ) ;
}
} ) ;
2015-08-25 12:11:35 -07:00
2015-09-10 12:42:52 -07:00
UiThread . RunOnIdle ( ( ) = >
{
if ( ! Datastore . Instance . WasExited ( ) )
{
LoadLibraryItems ( ) ;
}
} ) ;
timeSinceLastChange . Stop ( ) ;
2015-08-13 17:48:34 -07:00
}
}
2015-08-25 12:11:35 -07:00
public static string StaticProviderKey
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
get
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
return "LibraryProviderSqliteKey" ;
2015-08-13 17:48:34 -07:00
}
}
2015-09-17 18:03:02 -07:00
public override bool CanShare { get { return false ; } }
2015-08-25 12:11:35 -07:00
public override int CollectionCount
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
get
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
return childCollections . Count ;
2015-08-13 17:48:34 -07:00
}
}
2015-08-25 12:11:35 -07:00
public override int ItemCount
2015-06-17 17:58:38 -07:00
{
get
{
2015-08-25 12:11:35 -07:00
return printItems . Count ;
2015-06-17 17:58:38 -07:00
}
}
2015-08-25 11:56:21 -07:00
public override string KeywordFilter
{
get
{
return keywordFilter ;
}
set
{
if ( ignoreNextKeywordFilter )
{
ignoreNextKeywordFilter = false ;
return ;
}
2015-10-06 18:47:35 -07:00
PrintItemCollection rootLibraryCollection = GetRootLibraryCollection ( ) ;
2015-08-25 11:56:21 -07:00
if ( value ! = ""
& & this . baseLibraryCollection . Id ! = rootLibraryCollection . Id )
{
LibraryProviderSQLite currentProvider = this . ParentLibraryProvider as LibraryProviderSQLite ;
while ( currentProvider . ParentLibraryProvider ! = null
& & currentProvider . baseLibraryCollection . Id ! = rootLibraryCollection . Id )
{
currentProvider = currentProvider . ParentLibraryProvider as LibraryProviderSQLite ;
}
if ( currentProvider ! = null )
{
currentProvider . KeywordFilter = value ;
currentProvider . ignoreNextKeywordFilter = true ;
2015-09-02 11:05:50 -07:00
UiThread . RunOnIdle ( ( ) = > SetCurrentLibraryProvider ( currentProvider ) ) ;
2015-08-25 11:56:21 -07:00
}
}
else // the search only shows for the cloud library root
{
if ( keywordFilter ! = value )
{
keywordFilter = value ;
2015-08-25 12:11:35 -07:00
LoadLibraryItems ( ) ;
2015-08-25 11:56:21 -07:00
}
}
}
}
2015-08-25 12:11:35 -07:00
public override string ProviderKey
2015-06-10 17:53:17 -07:00
{
get
{
2015-08-25 12:11:35 -07:00
return StaticProviderKey ;
2015-06-10 17:53:17 -07:00
}
}
2015-08-25 12:11:35 -07:00
/// <summary>
/// Exposes all PrintItems for use in file purge code in AboutWidget
/// </summary>
/// <returns>A list of all print items</returns>
public static IEnumerable < PrintItem > GetAllPrintItemsRecursive ( )
2015-06-17 17:35:12 -07:00
{
2016-02-23 11:15:03 -08:00
// NOTE: We are making the assumption that everything is reference if it does not have a 0 in PrintItemCollectionID.
return Datastore . Instance . dbSQLite . Query < PrintItem > ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID != 0;" ) ;
2015-06-17 17:35:12 -07:00
}
2015-10-06 18:47:35 -07:00
public override void AddCollectionToLibrary ( string collectionName )
2015-06-25 12:19:19 -07:00
{
PrintItemCollection newCollection = new PrintItemCollection ( collectionName , "" ) ;
2015-06-30 11:34:46 -07:00
newCollection . ParentCollectionID = baseLibraryCollection . Id ;
2015-06-25 12:19:19 -07:00
newCollection . Commit ( ) ;
2015-10-06 18:47:35 -07:00
LoadLibraryItems ( ) ;
2015-06-25 12:19:19 -07:00
}
2015-10-06 18:47:35 -07:00
public override void AddItem ( PrintItemWrapper itemToAdd )
2015-06-25 12:19:19 -07:00
{
2015-10-06 18:47:35 -07:00
AddItem ( itemToAdd . Name , itemToAdd . FileLocation ) ;
2015-06-25 12:19:19 -07:00
}
2017-02-13 13:22:42 -08:00
private async void AddItem ( string fileName , string fileLocation )
2015-06-11 16:25:12 -07:00
{
2016-01-20 09:56:12 -08:00
await Task . Run ( ( ) = >
2015-06-25 12:19:19 -07:00
{
2016-01-20 09:56:12 -08:00
if ( ! string . IsNullOrEmpty ( fileName ) & & ! string . IsNullOrEmpty ( fileLocation ) )
{
2017-02-13 13:22:42 -08:00
using ( var stream = File . OpenRead ( fileLocation ) )
{
AddItem ( stream , Path . GetExtension ( fileLocation ) . ToUpper ( ) , fileName ) ;
}
2016-01-20 09:56:12 -08:00
}
2015-09-03 12:21:20 -07:00
2016-01-20 09:56:12 -08:00
UiThread . RunOnIdle ( ( ) = >
{
LoadLibraryItems ( ) ;
2015-09-22 15:20:49 -07:00
2016-01-20 09:56:12 -08:00
ItemAdded . CallEvents ( this , null ) ;
} ) ;
} ) ;
2015-06-10 17:53:17 -07:00
}
2015-10-06 18:47:35 -07:00
public void EnsureSamplePartsExist ( IEnumerable < string > filenamesToValidate )
2015-08-25 12:11:35 -07:00
{
PreloadingCalibrationFiles = true ;
var existingLibaryItems = this . GetLibraryItems ( ) . Select ( i = > i . Name ) ;
2017-02-13 13:22:42 -08:00
// Build a list of filenames that need to be imported into the library
2015-11-10 15:33:16 -08:00
var missingFiles = filenamesToValidate . Where ( fileName = > ! existingLibaryItems . Contains ( Path . GetFileNameWithoutExtension ( fileName ) , StringComparer . OrdinalIgnoreCase ) ) ;
2015-08-25 12:11:35 -07:00
2017-02-13 13:22:42 -08:00
// Import missing content into the library
foreach ( string fileName in missingFiles )
2015-08-25 12:11:35 -07:00
{
using ( Stream instream = StaticData . Instance . OpenSteam ( Path . Combine ( "OEMSettings" , "SampleParts" , fileName ) ) )
{
2017-02-13 13:22:42 -08:00
// Ideally all StaticData content should be AMF but allow STL if that's what we have
this . AddItem ( instream , Path . GetExtension ( fileName ) , Path . GetFileNameWithoutExtension ( fileName ) , forceAMF : false ) ;
2015-08-25 12:11:35 -07:00
}
}
2017-02-13 13:22:42 -08:00
// Finally, make sure that we always add at least one item to the queue - ensures that even without printer selection we have some content
var firstItem = this . GetLibraryItems ( ) . FirstOrDefault ( ) ;
if ( firstItem ! = null )
2016-09-06 16:36:25 -07:00
{
2017-02-13 13:22:42 -08:00
PreLoadItemToQueue ( firstItem ) ;
2016-09-06 16:36:25 -07:00
}
2016-09-01 13:50:11 -07:00
2015-08-25 12:11:35 -07:00
PreloadingCalibrationFiles = false ;
}
2017-02-13 13:22:42 -08:00
private void PreLoadItemToQueue ( PrintItem printItem )
2016-09-02 16:26:56 -07:00
{
2017-02-13 13:22:42 -08:00
string fileDest = printItem . FileLocation ;
2016-09-02 16:26:56 -07:00
if ( ! string . IsNullOrEmpty ( fileDest )
& & File . Exists ( fileDest ) )
{
2017-02-13 13:22:42 -08:00
var printItemToAdd = new PrintItemWrapper ( printItem ) ;
2016-09-02 16:26:56 -07:00
// check if there is a thumbnail image for this file and load it into the user cache if so
2017-02-13 13:22:42 -08:00
string justThumbFile = printItem . Name + ".png" ;
2016-09-02 16:26:56 -07:00
string applicationUserDataPath = StaticData . Instance . MapPath ( Path . Combine ( "OEMSettings" , "SampleParts" ) ) ;
string thumbnailSourceFile = Path . Combine ( applicationUserDataPath , justThumbFile ) ;
if ( File . Exists ( thumbnailSourceFile ) )
{
string thumbnailDestFile = PartThumbnailWidget . GetImageFileName ( printItemToAdd ) ;
2016-10-05 09:00:23 -07:00
Directory . CreateDirectory ( Path . GetDirectoryName ( thumbnailDestFile ) ) ;
2016-09-02 16:26:56 -07:00
// copy it to the right place
File . Copy ( thumbnailSourceFile , thumbnailDestFile ) ;
}
QueueData . Instance . AddItem ( printItemToAdd ) ;
}
}
2015-08-25 12:11:35 -07:00
public override PrintItemCollection GetCollectionItem ( int collectionIndex )
{
return childCollections [ collectionIndex ] ;
}
public IEnumerable < PrintItem > GetLibraryItems ( string keyphrase = null )
{
string query ;
2015-09-14 15:35:07 -07:00
if ( string . IsNullOrEmpty ( keyphrase ) )
2015-08-25 12:11:35 -07:00
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
}
else
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} AND Name LIKE '%{1}%' ORDER BY Name ASC;" , baseLibraryCollection . Id , keyphrase ) ;
}
2016-02-23 11:15:03 -08:00
return Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
2015-08-25 12:11:35 -07:00
}
public override string GetPrintItemName ( int itemIndex )
{
return printItems [ itemIndex ] . Name ;
}
2015-12-08 16:56:51 -08:00
public override Task < PrintItemWrapper > GetPrintItemWrapperAsync ( int index )
2015-06-15 18:31:43 -07:00
{
2015-06-25 12:19:19 -07:00
if ( index > = 0 & & index < printItems . Count )
{
2015-12-08 16:56:51 -08:00
return Task . FromResult ( new PrintItemWrapper ( printItems [ index ] , this . GetProviderLocator ( ) ) ) ;
2015-06-25 12:19:19 -07:00
}
return null ;
2015-06-12 09:48:20 -07:00
}
2015-07-22 18:30:22 -07:00
public override LibraryProvider GetProviderForCollection ( PrintItemCollection collection )
2015-06-22 18:21:56 -07:00
{
2015-09-02 11:05:50 -07:00
return new LibraryProviderSQLite ( collection , SetCurrentLibraryProvider , this , collection . Name ) ;
2015-06-22 18:21:56 -07:00
}
2015-10-06 18:47:35 -07:00
public override void RemoveCollection ( int collectionIndexToRemove )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
childCollections [ collectionIndexToRemove ] . Delete ( ) ;
2015-10-06 18:47:35 -07:00
LoadLibraryItems ( ) ;
2015-06-10 17:53:17 -07:00
}
2015-07-22 18:30:22 -07:00
public override void RemoveItem ( int itemToRemoveIndex )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
if ( itemToRemoveIndex < 0 )
2015-06-25 12:19:19 -07:00
{
// 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 ;
}
2015-08-25 12:11:35 -07:00
2015-06-25 12:19:19 -07:00
// and remove it from the data base
2015-07-22 18:30:22 -07:00
printItems [ itemToRemoveIndex ] . Delete ( ) ;
printItems . RemoveAt ( itemToRemoveIndex ) ;
2015-06-25 12:19:19 -07:00
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-10 17:53:17 -07:00
}
2015-06-15 18:31:43 -07:00
2015-08-25 12:11:35 -07:00
public override void RenameCollection ( int collectionIndexToRename , string newName )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
childCollections [ collectionIndexToRename ] . Name = newName ;
childCollections [ collectionIndexToRename ] . Commit ( ) ;
LoadLibraryItems ( ) ;
}
2015-08-04 16:17:51 -07:00
2015-08-25 12:11:35 -07:00
public override void RenameItem ( int itemIndexToRename , string newName )
{
2015-09-09 15:35:31 -07:00
printItems [ itemIndexToRename ] . Name = newName ;
printItems [ itemIndexToRename ] . Commit ( ) ;
2015-08-25 12:11:35 -07:00
LoadLibraryItems ( ) ;
}
2015-06-25 12:19:19 -07:00
2015-09-17 18:03:02 -07:00
public override void ShareItem ( int itemIndexToShare )
{
}
2017-02-13 13:22:42 -08:00
/// <summary>
/// Creates a database PrintItem entity, if forceAMF is set, converts to AMF otherwise just copies
/// the source file to a new library path and updates the PrintItem to point at the new target
/// </summary>
private void AddItem ( Stream stream , string extension , string displayName , bool forceAMF = true )
2015-08-25 12:11:35 -07:00
{
2017-02-13 13:22:42 -08:00
// Create a new entity in the database
2015-08-25 12:11:35 -07:00
PrintItem printItem = new PrintItem ( ) ;
printItem . Name = displayName ;
printItem . PrintItemCollectionID = this . baseLibraryCollection . Id ;
printItem . Commit ( ) ;
2017-02-13 13:22:42 -08:00
// Special load processing for mesh data, simple copy below for non-mesh
if ( forceAMF
& & ( extension ! = "" & & MeshFileIo . ValidFileExtensions ( ) . Contains ( extension . ToUpper ( ) ) ) )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
try
2015-06-25 12:19:19 -07:00
{
2017-02-13 13:22:42 -08:00
// Load mesh
List < MeshGroup > meshToConvertAndSave = MeshFileIo . Load ( stream , extension ) ;
// Create a new PrintItemWrapper
if ( ! printItem . FileLocation . Contains ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath ) )
{
string [ ] metaData = { "Created By" , "MatterControl" } ;
if ( false ) //AbsolutePositioned
{
metaData = new string [ ] { "Created By" , "MatterControl" , "BedPosition" , "Absolute" } ;
}
// save a copy to the library and update this to point at it
printItem . FileLocation = CreateLibraryPath ( ".amf" ) ;
var outputInfo = new MeshOutputSettings ( MeshOutputSettings . OutputType . Binary , metaData ) ;
MeshFileIo . Save ( meshToConvertAndSave , printItem . FileLocation , outputInfo ) ;
printItem . Commit ( ) ;
}
2015-08-25 12:11:35 -07:00
}
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" ) ;
} ) ;
2015-06-25 12:19:19 -07:00
}
2015-08-25 12:11:35 -07:00
}
else // it is not a mesh so just add it
{
2017-02-13 13:22:42 -08:00
// Non-mesh content - copy stream to new Library path
printItem . FileLocation = CreateLibraryPath ( extension ) ;
using ( var outStream = File . Create ( printItem . FileLocation ) )
{
stream . CopyTo ( outStream ) ;
}
printItem . Commit ( ) ;
2015-06-25 12:19:19 -07:00
}
}
2015-08-25 12:11:35 -07:00
protected IEnumerable < PrintItemCollection > GetChildCollections ( )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
string query = string . Format ( "SELECT * FROM PrintItemCollection WHERE ParentCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
2016-02-23 11:15:03 -08:00
return Datastore . Instance . dbSQLite . Query < PrintItemCollection > ( query ) ;
2015-06-25 12:19:19 -07:00
}
2015-10-06 18:47:35 -07:00
private PrintItemCollection GetRootLibraryCollection ( )
2015-06-25 12:19:19 -07:00
{
2015-08-08 11:25:51 -07:00
// Attempt to initialize the library from the Datastore if null
PrintItemCollection rootLibraryCollection = 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 ( rootLibraryCollection = = null )
2015-06-25 12:19:19 -07:00
{
2015-08-08 11:25:51 -07:00
rootLibraryCollection = new PrintItemCollection ( ) ;
rootLibraryCollection . Name = "_library" ;
rootLibraryCollection . Commit ( ) ;
// In this case we now need to update the baseLibraryCollection instance member as code that executes
// down this path will attempt to use the property and will exception if its not set
this . baseLibraryCollection = rootLibraryCollection ;
// Preload library with Oem supplied list of default parts
2015-10-06 18:47:35 -07:00
EnsureSamplePartsExist ( OemSettings . Instance . PreloadedLibraryFiles ) ;
2015-06-25 12:19:19 -07:00
}
2015-08-08 11:25:51 -07:00
return rootLibraryCollection ;
}
2015-10-06 18:47:35 -07:00
private void LoadLibraryItems ( )
2015-08-08 11:25:51 -07:00
{
2015-09-10 12:42:52 -07:00
IEnumerable < PrintItem > partFiles = null ;
IEnumerable < PrintItemCollection > collections = null ;
2015-10-06 18:47:35 -07:00
partFiles = GetLibraryItems ( KeywordFilter ) ;
collections = GetChildCollections ( ) ;
2015-09-10 12:42:52 -07:00
2015-08-08 11:25:51 -07:00
printItems . Clear ( ) ;
if ( partFiles ! = null )
2015-06-30 11:34:46 -07:00
{
2015-09-10 12:42:52 -07:00
printItems . AddRange ( partFiles ) ;
2015-06-30 11:34:46 -07:00
}
2015-08-08 11:25:51 -07:00
childCollections . Clear ( ) ;
if ( collections ! = null )
{
childCollections . AddRange ( collections ) ;
}
OnDataReloaded ( null ) ;
2015-06-25 12:19:19 -07:00
}
2017-02-13 13:22:42 -08:00
private static string CreateLibraryPath ( string extension )
{
string fileName = Path . ChangeExtension ( Path . GetRandomFileName ( ) , string . IsNullOrEmpty ( extension ) ? ".amf" : extension ) ;
return Path . Combine ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath , fileName ) ;
}
2015-06-10 17:53:17 -07:00
}
2015-08-25 12:11:35 -07:00
public class LibraryProviderSQLiteCreator : ILibraryCreator
{
public string ProviderKey
{
get
{
return LibraryProviderSQLite . StaticProviderKey ;
}
}
public virtual LibraryProvider CreateLibraryProvider ( LibraryProvider parentLibraryProvider , Action < LibraryProvider > setCurrentLibraryProvider )
{
2016-01-14 14:20:11 -08:00
return new LibraryProviderSQLite ( null , setCurrentLibraryProvider , parentLibraryProvider , "Local Library" . Localize ( ) ) ;
2015-08-25 12:11:35 -07:00
}
}
2015-06-10 17:53:17 -07:00
}