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 .
* /
using MatterHackers.Agg ;
2015-07-24 14:00:27 -07:00
using MatterHackers.Agg.Image ;
using MatterHackers.Agg.PlatformAbstract ;
2015-07-01 13:37:59 -07:00
using MatterHackers.Agg.UI ;
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-08-08 11:25:51 -07:00
using MatterHackers.PolygonMesh ;
2015-08-07 16:35:36 -07:00
using MatterHackers.PolygonMesh.Processors ;
2015-06-10 17:53:17 -07:00
using System ;
using System.Collections.Generic ;
2015-07-23 11:48:31 -07:00
using System.IO ;
2015-07-13 13:07:26 -07:00
using System.Threading.Tasks ;
2015-06-10 17:53:17 -07:00
namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
2015-08-08 11:25:51 -07:00
public abstract class ClassicSqliteStorageProvider : LibraryProvider
{
private string keywordFilter = string . Empty ;
protected PrintItemCollection baseLibraryCollection ;
protected List < PrintItemCollection > childCollections = new List < PrintItemCollection > ( ) ;
public ClassicSqliteStorageProvider ( LibraryProvider parentLibraryProvider )
: base ( parentLibraryProvider )
{
}
protected virtual void AddStlOrGcode ( string loadedFileName , string displayName )
{
string extension = Path . GetExtension ( loadedFileName ) . ToUpper ( ) ;
PrintItem printItem = new PrintItem ( ) ;
printItem . Name = displayName ;
printItem . FileLocation = Path . GetFullPath ( loadedFileName ) ;
printItem . PrintItemCollectionID = this . baseLibraryCollection . Id ;
printItem . Commit ( ) ;
if ( ( extension ! = "" & & MeshFileIo . ValidFileExtensions ( ) . Contains ( extension ) ) )
{
List < MeshGroup > meshToConvertAndSave = MeshFileIo . Load ( loadedFileName ) ;
try
{
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem , this ) ;
SaveToLibraryFolder ( printItemWrapper , meshToConvertAndSave , false ) ;
}
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 , this ) ;
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 ( ) ;
}
}
protected static 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 override PrintItemCollection GetCollectionItem ( int collectionIndex )
{
return childCollections [ collectionIndex ] ;
}
public override bool Visible
{
get { return true ; }
}
public override void Dispose ( )
{
}
public override string ProviderData
{
get
{
return baseLibraryCollection . Id . ToString ( ) ;
}
}
public override string KeywordFilter
{
get
{
return keywordFilter ;
}
set
{
keywordFilter = value ;
}
}
protected IEnumerable < PrintItemCollection > GetChildCollections ( )
{
string query = string . Format ( "SELECT * FROM PrintItemCollection WHERE ParentCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
IEnumerable < PrintItemCollection > result = ( IEnumerable < PrintItemCollection > ) Datastore . Instance . dbSQLite . Query < PrintItemCollection > ( query ) ;
return result ;
}
public IEnumerable < PrintItem > GetLibraryItems ( string keyphrase = null )
{
string query ;
if ( keyphrase = = null )
{
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 ) ;
}
IEnumerable < PrintItem > result = ( IEnumerable < PrintItem > ) Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
return result ;
}
}
2015-07-02 18:34:10 -07:00
public abstract class LibraryProvider : IDisposable
2015-06-10 17:53:17 -07:00
{
2015-07-27 10:27:22 -07:00
public event EventHandler DataReloaded ;
2015-06-29 18:03:56 -07:00
private LibraryProvider parentLibraryProvider = null ;
2015-06-10 17:53:17 -07:00
2015-06-29 18:03:56 -07:00
public LibraryProvider ( LibraryProvider parentLibraryProvider )
2015-06-10 17:53:17 -07:00
{
2015-06-29 18:03:56 -07:00
this . parentLibraryProvider = parentLibraryProvider ;
2015-06-10 17:53:17 -07:00
}
2015-06-29 18:03:56 -07:00
public LibraryProvider ParentLibraryProvider { get { return parentLibraryProvider ; } }
2015-06-26 10:53:10 -07:00
#region Member Methods
2015-06-29 18:03:56 -07:00
2015-06-26 10:53:10 -07:00
public bool HasParent
{
get
{
2015-06-29 18:03:56 -07:00
if ( this . ParentLibraryProvider ! = null )
2015-06-26 10:53:10 -07:00
{
return true ;
}
return false ;
}
}
2015-06-29 18:03:56 -07:00
2015-07-24 14:00:27 -07:00
public abstract bool Visible { get ; }
static ImageBuffer normalFolderImage = null ;
public static ImageBuffer NormalFolderImage
{
get
{
if ( normalFolderImage = = null )
{
string path = Path . Combine ( "Icons" , "FileDialog" , "folder.png" ) ;
normalFolderImage = new ImageBuffer ( ) ;
StaticData . Instance . LoadImage ( path , normalFolderImage ) ;
}
return normalFolderImage ;
}
}
static ImageBuffer upFolderImage = null ;
public static ImageBuffer UpFolderImage
{
get
{
if ( upFolderImage = = null )
{
string path = Path . Combine ( "Icons" , "FileDialog" , "up_folder.png" ) ;
upFolderImage = new ImageBuffer ( ) ;
StaticData . Instance . LoadImage ( path , upFolderImage ) ;
}
return upFolderImage ;
}
}
2015-07-23 11:48:31 -07:00
public void AddFilesToLibrary ( IList < string > files , ReportProgressRatio reportProgress = null )
{
2015-08-07 16:35:36 -07:00
foreach ( string loadedFileName in files )
2015-07-23 11:48:31 -07:00
{
2015-08-07 16:35:36 -07:00
string extension = Path . GetExtension ( loadedFileName ) . ToUpper ( ) ;
if ( ( extension ! = "" & & 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 )
{
AddItem ( new PrintItemWrapper ( part , this ) ) ;
}
}
}
else
{
AddItem ( new PrintItemWrapper ( new PrintItem ( Path . GetFileNameWithoutExtension ( loadedFileName ) , loadedFileName ) , this ) ) ;
}
}
2015-07-23 11:48:31 -07:00
}
}
2015-06-29 18:03:56 -07:00
// A key,value list that threads into the current collection looks like "key0,displayName0|key1,displayName1|key2,displayName2|...|keyN,displayNameN".
public List < ProviderLocatorNode > GetProviderLocator ( )
{
List < ProviderLocatorNode > providerLocator = new List < ProviderLocatorNode > ( ) ;
if ( ParentLibraryProvider ! = null )
{
providerLocator . AddRange ( ParentLibraryProvider . GetProviderLocator ( ) ) ;
}
providerLocator . Add ( new ProviderLocatorNode ( ProviderKey , Name , ProviderData ) ) ;
return providerLocator ;
}
#endregion Member Methods
2015-06-26 10:53:10 -07:00
2015-06-15 18:31:43 -07:00
#region Abstract Methods
2015-06-11 12:06:40 -07:00
2015-06-11 16:25:12 -07:00
public abstract int CollectionCount { get ; }
public abstract int ItemCount { get ; }
2015-06-10 17:53:17 -07:00
public abstract string KeywordFilter { get ; set ; }
2015-06-17 15:43:37 -07:00
public abstract string Name { get ; }
2015-06-29 18:03:56 -07:00
public abstract string ProviderData { get ; }
2015-06-17 15:43:37 -07:00
public abstract string ProviderKey { get ; }
2015-06-11 16:25:12 -07:00
public abstract void AddCollectionToLibrary ( string collectionName ) ;
2015-07-24 14:00:27 -07:00
public abstract void AddItem ( PrintItemWrapper itemToAdd ) ;
public abstract void Dispose ( ) ;
2015-06-12 17:21:51 -07:00
public abstract PrintItemCollection GetCollectionItem ( int collectionIndex ) ;
2015-06-12 09:48:20 -07:00
2015-08-07 09:56:49 -07:00
public abstract Task < PrintItemWrapper > GetPrintItemWrapperAsync ( int itemIndex ) ;
2015-06-10 17:53:17 -07:00
2015-07-22 18:30:22 -07:00
// TODO: make this asnyc
2015-07-23 10:40:36 -07:00
//public abstract Task<LibraryProvider> GetProviderForCollectionAsync(PrintItemCollection collection);
2015-07-22 18:30:22 -07:00
public abstract LibraryProvider GetProviderForCollection ( PrintItemCollection collection ) ;
2015-06-22 18:21:56 -07:00
2015-07-22 18:30:22 -07:00
public abstract void RemoveCollection ( int collectionIndexToRemove ) ;
2015-06-11 16:25:12 -07:00
2015-07-27 19:03:54 -07:00
public abstract void RenameCollection ( int collectionIndexToRename , string newName ) ;
2015-07-22 18:30:22 -07:00
public abstract void RemoveItem ( int itemIndexToRemove ) ;
2015-06-12 09:48:20 -07:00
2015-07-27 19:03:54 -07:00
public abstract void RenameItem ( int itemIndexToRename , string newName ) ;
2015-06-15 18:31:43 -07:00
#endregion Abstract Methods
#region Static Methods
2015-06-11 12:06:40 -07:00
2015-07-27 10:27:22 -07:00
public void OnDataReloaded ( EventArgs eventArgs )
2015-06-10 17:53:17 -07:00
{
2015-07-27 10:27:22 -07:00
if ( DataReloaded ! = null )
{
DataReloaded ( null , eventArgs ) ;
}
2015-06-10 17:53:17 -07:00
}
2015-06-15 18:31:43 -07:00
#endregion Static Methods
2015-07-01 13:37:59 -07:00
2015-07-24 14:00:27 -07:00
public virtual int GetCollectionChildCollectionCount ( int collectionIndex )
2015-07-14 10:39:20 -07:00
{
2015-07-24 14:00:27 -07:00
return GetProviderForCollection ( GetCollectionItem ( collectionIndex ) ) . CollectionCount ;
2015-07-14 10:39:20 -07:00
}
2015-08-07 09:56:49 -07:00
protected Dictionary < int , ReportProgressRatio > itemReportProgressHandlers = new Dictionary < int , ReportProgressRatio > ( ) ;
public void RegisterForProgress ( int itemIndex , ReportProgressRatio reportProgress )
{
if ( ! itemReportProgressHandlers . ContainsKey ( itemIndex ) )
{
itemReportProgressHandlers . Add ( itemIndex , reportProgress ) ;
}
else
{
itemReportProgressHandlers [ itemIndex ] = reportProgress ;
}
}
protected ReportProgressRatio GetItemProgressHandler ( int itemIndex )
{
if ( ! itemReportProgressHandlers . ContainsKey ( itemIndex ) )
{
return null ;
}
return itemReportProgressHandlers [ itemIndex ] ;
}
public virtual int GetCollectionItemCount ( int collectionIndex )
2015-07-14 10:39:20 -07:00
{
2015-07-24 14:00:27 -07:00
return GetProviderForCollection ( GetCollectionItem ( collectionIndex ) ) . ItemCount ;
2015-07-14 10:39:20 -07:00
}
2015-07-24 14:00:27 -07:00
public virtual ImageBuffer GetCollectionFolderImage ( int collectionIndex )
2015-07-14 10:39:20 -07:00
{
2015-07-24 14:00:27 -07:00
return NormalFolderImage ;
2015-07-14 10:39:20 -07:00
}
2015-07-01 13:37:59 -07:00
public virtual GuiWidget GetItemThumbnail ( int printItemIndex )
{
2015-07-13 13:07:26 -07:00
var printItemWrapper = GetPrintItemWrapperAsync ( printItemIndex ) . Result ;
return new PartThumbnailWidget ( printItemWrapper , "part_icon_transparent_40x40.png" , "building_thumbnail_40x40.png" , PartThumbnailWidget . ImageSizes . Size50x50 ) ;
2015-07-01 13:37:59 -07:00
}
2015-07-23 10:40:36 -07:00
2015-07-24 14:00:27 -07:00
public virtual string GetPrintItemName ( int itemIndex )
2015-07-23 10:40:36 -07:00
{
2015-07-24 14:00:27 -07:00
return "" ;
2015-07-23 10:40:36 -07:00
}
2015-07-24 14:00:27 -07:00
public virtual bool IsItemProtected ( int itemIndex )
2015-07-23 10:40:36 -07:00
{
2015-07-24 14:00:27 -07:00
return false ;
}
public virtual bool IsItemReadOnly ( int itemIndex )
{
return false ;
2015-07-23 10:40:36 -07:00
}
2015-07-29 12:03:51 -07:00
public LibraryProvider GetRootProvider ( )
{
LibraryProvider parent = this ;
while ( parent ! = null )
{
parent = parent . ParentLibraryProvider ;
}
return parent ;
}
2015-06-10 17:53:17 -07:00
}
2015-06-22 18:21:56 -07:00
public class ProviderLocatorNode
{
public string Key ;
public string Name ;
2015-06-29 18:03:56 -07:00
public string ProviderData ;
2015-06-22 18:21:56 -07:00
2015-06-29 18:03:56 -07:00
public ProviderLocatorNode ( string key , string name , string providerData )
2015-06-22 18:21:56 -07:00
{
this . Key = key ;
this . Name = name ;
2015-06-29 18:03:56 -07:00
this . ProviderData = providerData ;
2015-06-22 18:21:56 -07:00
}
}
2015-06-10 17:53:17 -07:00
}