mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-04 05:10:07 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			285 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
* 
 | 
						|
*
 | 
						|
*
 | 
						|
**********************************************************************/
 | 
						|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
 | 
						|
(function(require){ var module={} // make module AMD/node compatible...
 | 
						|
/*********************************************************************/
 | 
						|
 | 
						|
var actions = require('lib/actions')
 | 
						|
var features = require('lib/features')
 | 
						|
 | 
						|
var browse = require('lib/widget/browse')
 | 
						|
 | 
						|
var core = require('features/core')
 | 
						|
var widgets = require('features/ui-widgets')
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*********************************************************************/
 | 
						|
// XXX should collections be in the Crop menu????
 | 
						|
 | 
						|
// XXX things we need to do to collections:
 | 
						|
// 		- add images from current state
 | 
						|
// 		- remove images (from collection)
 | 
						|
var CollectionActions = actions.Actions({
 | 
						|
 | 
						|
	collections: null,
 | 
						|
 | 
						|
	get collection(){
 | 
						|
		return this.location.collection },
 | 
						|
	set collection(value){
 | 
						|
		this.loadCollection(value) },
 | 
						|
 | 
						|
 | 
						|
	// XXX might be a good idea to make collection loading part of the 
 | 
						|
	// 		.load(..) protocol...
 | 
						|
	// 		...this could be done via a url suffix, as a shorthand.
 | 
						|
	// 		something like:
 | 
						|
	// 			/path/to/index:collection
 | 
						|
	// 				-> /path/to/index/sub/path/.ImageGrid/collections/collection
 | 
						|
	// XXX loading collections by direct path would require us to look 
 | 
						|
	// 		in the containing index for missing parts (*images.json, ...)
 | 
						|
	// XXX saving a local collection would require us to save to two 
 | 
						|
	// 		locations:
 | 
						|
	// 			- collection specific stuff (data) to collection path
 | 
						|
	// 			- global stuff (images, tags, ...) to base index...
 | 
						|
	loadCollection: ['- Collections/',
 | 
						|
		function(collection){
 | 
						|
			if(collection == null 
 | 
						|
					|| this.collections == null 
 | 
						|
					|| !(collection in this.collections)){
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			this.crop(this.collections[collection].data)
 | 
						|
 | 
						|
			// XXX need to clear this when exiting crop...
 | 
						|
			this.location.collection = collection
 | 
						|
		}],
 | 
						|
	saveCollection: ['- Collections/Save collection',
 | 
						|
		core.doc`Save current state to collection`,
 | 
						|
		function(collection){
 | 
						|
			collection = collection || this.collection
 | 
						|
 | 
						|
			if(collection == null){
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			var collections = this.collections = this.collections || {}
 | 
						|
 | 
						|
			collections[collection] = {
 | 
						|
				title: collection,
 | 
						|
 | 
						|
				// XXX we need to trim .order to only the current images???
 | 
						|
				data: this.data
 | 
						|
					.clone()
 | 
						|
					.removeUnloadedGids(),
 | 
						|
			}
 | 
						|
		}],
 | 
						|
 | 
						|
	inCollections: ['- Image/',
 | 
						|
		core.doc`Get list of collections containing item`,
 | 
						|
		function(gid){
 | 
						|
			var that = this
 | 
						|
			return Object.keys(this.collections || {})
 | 
						|
				.filter(function(c){
 | 
						|
					return !gid 
 | 
						|
						|| that.collections[c].data.order.indexOf(gid) >= 0 })
 | 
						|
		}],
 | 
						|
 | 
						|
	collect: ['- Collections/',
 | 
						|
		core.doc`Add items to collection`,
 | 
						|
		function(gids, collection){
 | 
						|
			var that = this
 | 
						|
 | 
						|
			gids = gids instanceof Array ? gids : [gids]
 | 
						|
			gids = gids
 | 
						|
				.map(function(gid){ 
 | 
						|
					return gid in that.data.ribbons ? 
 | 
						|
						// when adding a ribbon gid expand to images...
 | 
						|
						that.data.ribbons[gid].compact()
 | 
						|
						: [gid] })
 | 
						|
				.reduce(function(a, b){ return a.concat(b) }, [])
 | 
						|
 | 
						|
			collection = collection || this.collection
 | 
						|
 | 
						|
			// XXX add to collection...
 | 
						|
			// XXX
 | 
						|
		}],
 | 
						|
	uncollect: ['- Collections/',
 | 
						|
		function(gids, collection){
 | 
						|
			// XXX
 | 
						|
		}],
 | 
						|
 | 
						|
	removeCollection: ['- Collections/',
 | 
						|
		function(collection){
 | 
						|
			// XXX
 | 
						|
			delete this.collections[collection]
 | 
						|
		}],
 | 
						|
})
 | 
						|
 | 
						|
var Collection = 
 | 
						|
module.Collection = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'collections',
 | 
						|
	depends: [
 | 
						|
		'base',
 | 
						|
		'crop',
 | 
						|
	],
 | 
						|
	suggested: [
 | 
						|
		'ui-collections',
 | 
						|
		'fs-collections',
 | 
						|
	],
 | 
						|
 | 
						|
	actions: CollectionActions, 
 | 
						|
 | 
						|
	handlers: [],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//---------------------------------------------------------------------
 | 
						|
 | 
						|
// XXX show collections in image metadata...
 | 
						|
var UICollectionActions = actions.Actions({
 | 
						|
	// XXX highlight current collections....
 | 
						|
	browseCollections: ['Collections|Crop/Collections...',
 | 
						|
		widgets.makeUIDialog(function(gid){
 | 
						|
			var that = this
 | 
						|
			gid = gid != null ? this.data.getImage(gid) : gid
 | 
						|
 | 
						|
			var to_remove = []
 | 
						|
 | 
						|
			return browse.makeLister(null, 
 | 
						|
				function(path, make){
 | 
						|
					var dialog = this
 | 
						|
 | 
						|
					//var collections = Object.keys(that.collections || {})
 | 
						|
					var collections = that.inCollections(gid || null)
 | 
						|
 | 
						|
					make.EditableList(collections, 
 | 
						|
						{
 | 
						|
							unique: true,
 | 
						|
							to_remove: to_remove,
 | 
						|
							itemopen: function(title){
 | 
						|
								that.loadCollection(title)
 | 
						|
								gid
 | 
						|
									&& that.focusImage(gid)
 | 
						|
								dialog.close()
 | 
						|
							},
 | 
						|
							normalize: function(title){ 
 | 
						|
								return title.trim() },
 | 
						|
							check: function(title){ 
 | 
						|
								return title.length > 0 },
 | 
						|
 | 
						|
							itemadded: function(title){
 | 
						|
								that.saveCollection(title) },
 | 
						|
						})
 | 
						|
				})
 | 
						|
				.close(function(){
 | 
						|
					to_remove.forEach(function(title){ 
 | 
						|
						that.removeCollection(title) 
 | 
						|
					}) 
 | 
						|
				})
 | 
						|
		})],
 | 
						|
	// XXX add kb handler???
 | 
						|
	// XXX highlight current collections....
 | 
						|
	// XXX this is very similar to .browseCollections(..), is this a problem???
 | 
						|
	browseImageCollections: ['Image/Collections...',
 | 
						|
		{dialogTitle: 'Image Collections...'},
 | 
						|
		widgets.makeUIDialog(function(gid){
 | 
						|
			var that = this
 | 
						|
			gid = this.data.getImage(gid)
 | 
						|
 | 
						|
			var to_remove = []
 | 
						|
 | 
						|
			return browse.makeLister(null, 
 | 
						|
				function(path, make){
 | 
						|
					var dialog = this
 | 
						|
 | 
						|
					var all = Object.keys(that.collections || {})
 | 
						|
					var collections = that.inCollections(gid || null)
 | 
						|
 | 
						|
					// build the disabled list...
 | 
						|
					all.forEach(function(title){
 | 
						|
						collections.indexOf(title) < 0
 | 
						|
							&& to_remove.push(title)
 | 
						|
					})
 | 
						|
 | 
						|
					all.length > 0 ?
 | 
						|
						make.EditableList(all, 
 | 
						|
							{
 | 
						|
								new_item: false,
 | 
						|
								to_remove: to_remove,
 | 
						|
								itemopen: function(title){
 | 
						|
									that.loadCollection(title)
 | 
						|
									gid
 | 
						|
										&& that.focusImage(gid)
 | 
						|
									dialog.close()
 | 
						|
								},
 | 
						|
							})
 | 
						|
						: make.Empty()
 | 
						|
				})
 | 
						|
				.close(function(){
 | 
						|
					to_remove.forEach(function(title){ 
 | 
						|
						that.uncollect(gid, title)
 | 
						|
					}) 
 | 
						|
				})
 | 
						|
		})],
 | 
						|
 | 
						|
	// XXX this is not used by metadata yet...
 | 
						|
	metadataSection: ['- Image/',
 | 
						|
		function(gid, make){
 | 
						|
		}],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
var UICollection = 
 | 
						|
module.UICollection = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'ui-collections',
 | 
						|
	depends: [
 | 
						|
		'ui',
 | 
						|
		'collections',
 | 
						|
	],
 | 
						|
 | 
						|
	actions: UICollectionActions, 
 | 
						|
 | 
						|
	handlers: [],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//---------------------------------------------------------------------
 | 
						|
// XXX
 | 
						|
var FileSystemCollection = 
 | 
						|
module.FileSystemCollection = core.ImageGridFeatures.Feature({
 | 
						|
	title: '',
 | 
						|
	doc: '',
 | 
						|
 | 
						|
	tag: 'fs-collections',
 | 
						|
	depends: [
 | 
						|
		'fs',
 | 
						|
		'collections',
 | 
						|
	],
 | 
						|
 | 
						|
	handlers: [],
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//---------------------------------------------------------------------
 | 
						|
// XXX localstorage-collections (???)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************************************************************
 | 
						|
* vim:set ts=4 sw=4 :                               */ return module })
 |