ImageGrid/ui (gen4)/features/collections.js
Alex A. Naanou 3e8d0a6bba minor tweaks...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2017-08-16 14:23:34 +03:00

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 })