mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
added save history dialog...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
8b9cdd8650
commit
7a5d694f94
@ -79,6 +79,17 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
loaded_paths: null,
|
loaded_paths: null,
|
||||||
|
|
||||||
|
|
||||||
|
// XXX should this be more general???
|
||||||
|
reloadState: ['File/Reload viewer state...',
|
||||||
|
function(){
|
||||||
|
if(this.location
|
||||||
|
&& this.location.method
|
||||||
|
&& this.location.path){
|
||||||
|
return this[this.location.method](this.location.path)
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
|
||||||
|
|
||||||
// XXX is this a hack???
|
// XXX is this a hack???
|
||||||
// XXX need a more generic form...
|
// XXX need a more generic form...
|
||||||
checkPath: ['- File/',
|
checkPath: ['- File/',
|
||||||
@ -161,11 +172,6 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
for(var i=0; i < paths.length; i++){
|
for(var i=0; i < paths.length; i++){
|
||||||
var k = paths[i]
|
var k = paths[i]
|
||||||
|
|
||||||
// XXX save dates...
|
|
||||||
// XXX not sure if this is the right way to go....
|
|
||||||
res[k].__dates && console.log('DATES:', res[k].__dates)
|
|
||||||
res[k].__date && console.log('LOADED:', res[k].__date)
|
|
||||||
|
|
||||||
// skip empty indexes...
|
// skip empty indexes...
|
||||||
// XXX should we rebuild or list here???
|
// XXX should we rebuild or list here???
|
||||||
if(res[k].data == null || res[k].images == null){
|
if(res[k].data == null || res[k].images == null){
|
||||||
@ -215,6 +221,7 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
that.__location = {
|
that.__location = {
|
||||||
path: loaded.length == 1 ? loaded[0] : path,
|
path: loaded.length == 1 ? loaded[0] : path,
|
||||||
method: 'loadIndex',
|
method: 'loadIndex',
|
||||||
|
from: from_date || 'all',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}],
|
}],
|
||||||
@ -538,6 +545,74 @@ var FileSystemLoaderUIActions = actions.Actions({
|
|||||||
// XXX should these be dialog objects???
|
// XXX should these be dialog objects???
|
||||||
browseIndex: ['File/Load index...', makeBrowseProxy('loadIndex')],
|
browseIndex: ['File/Load index...', makeBrowseProxy('loadIndex')],
|
||||||
browseImages: ['File/Load images...', makeBrowseProxy('loadImages')],
|
browseImages: ['File/Load images...', makeBrowseProxy('loadImages')],
|
||||||
|
|
||||||
|
// XXX add dialog to list sub-indexes...
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
// NOTE: this will show nothing if .location.method is not loadIndex..
|
||||||
|
//
|
||||||
|
// XXX handle named saves...
|
||||||
|
// XXX add ability to name a save...
|
||||||
|
// XXX need to handle saves when loaded a specific history position...
|
||||||
|
listSaveHistoryDialog: ['File/List save history...',
|
||||||
|
widgets.makeUIDialog(function(){
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
var o = browse.makeLister(null, function(path, make){
|
||||||
|
var dialog = this
|
||||||
|
|
||||||
|
// only search for history if we have an index loaded...
|
||||||
|
if(that.location.method != 'loadIndex'){
|
||||||
|
make('No history...', null, true)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var from = that.location.from
|
||||||
|
from = from && Date.fromTimeStamp(from).toShortDate()
|
||||||
|
|
||||||
|
make('Load all')
|
||||||
|
.on('open', function(){
|
||||||
|
that.reloadState()
|
||||||
|
})
|
||||||
|
|
||||||
|
make('---')
|
||||||
|
|
||||||
|
that.loadSaveHistoryList()
|
||||||
|
.catch(function(err){
|
||||||
|
// XXX
|
||||||
|
console.error(err)
|
||||||
|
})
|
||||||
|
.then(function(data){
|
||||||
|
var list = []
|
||||||
|
|
||||||
|
Object.keys(data).forEach(function(path){
|
||||||
|
Object.keys(data[path]).forEach(function(d){
|
||||||
|
list.push(d)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
list
|
||||||
|
.sort()
|
||||||
|
.reverse()
|
||||||
|
.forEach(function(d){
|
||||||
|
var txt = Date.fromTimeStamp(d).toShortDate()
|
||||||
|
|
||||||
|
// XXX get the save name...
|
||||||
|
make(txt)
|
||||||
|
.on('open', function(){
|
||||||
|
that.loadIndex(that.location.path, d)
|
||||||
|
})
|
||||||
|
// mark the current loaded position...
|
||||||
|
.addClass(txt == from ? 'highlighted selected' : '')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.on('open', function(){
|
||||||
|
o.parent.close()
|
||||||
|
})
|
||||||
|
|
||||||
|
return o
|
||||||
|
})],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@ -1442,14 +1517,11 @@ var FileSystemWriterUIActions = actions.Actions({
|
|||||||
that.config['export-path'] || that.location.path)
|
that.config['export-path'] || that.location.path)
|
||||||
dialog.parent.close()
|
dialog.parent.close()
|
||||||
})
|
})
|
||||||
|
.addClass('selected')
|
||||||
})
|
})
|
||||||
|
|
||||||
o.dom.addClass('metadata-view tail-action')
|
o.dom.addClass('metadata-view tail-action')
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
o.select(-1)
|
|
||||||
}, 0)
|
|
||||||
|
|
||||||
return o
|
return o
|
||||||
})],
|
})],
|
||||||
})
|
})
|
||||||
|
|||||||
@ -421,14 +421,21 @@ var URLHistoryUIActions = actions.Actions({
|
|||||||
|
|
||||||
var o = browse.makeLister(null,
|
var o = browse.makeLister(null,
|
||||||
function(path, make){
|
function(path, make){
|
||||||
Object.keys(that.url_history)
|
var l = Object.keys(that.url_history)
|
||||||
.reverse()
|
.reverse()
|
||||||
// NOTE: this might get a little slow for
|
// NOTE: this might get a little slow for
|
||||||
// very large sets...
|
// very large sets...
|
||||||
.forEach(function(p){
|
.map(function(p){
|
||||||
make(p, {disabled: !that.checkURLFromHistory(p) })
|
make(p, {disabled: !that.checkURLFromHistory(p) })
|
||||||
.addClass(p == cur ? 'highlighted selected': '')
|
.addClass(p == cur ? 'highlighted selected': '')
|
||||||
}) },
|
})
|
||||||
|
.length
|
||||||
|
|
||||||
|
if(l == 0){
|
||||||
|
make('No history...', null, true)
|
||||||
|
.find('.button').remove()
|
||||||
|
}
|
||||||
|
},
|
||||||
// add item buttons...
|
// add item buttons...
|
||||||
{ itemButtons: [
|
{ itemButtons: [
|
||||||
// move to top...
|
// move to top...
|
||||||
|
|||||||
@ -140,6 +140,7 @@ module.GLOBAL_KEYBOARD = {
|
|||||||
H: {
|
H: {
|
||||||
default: 'flipHorizontal',
|
default: 'flipHorizontal',
|
||||||
ctrl: 'listURLHistory',
|
ctrl: 'listURLHistory',
|
||||||
|
'ctrl+shift': 'listSaveHistoryDialog',
|
||||||
alt: 'browseActions: "/History/" -- Open history menu',
|
alt: 'browseActions: "/History/" -- Open history menu',
|
||||||
},
|
},
|
||||||
V: 'flipVertical',
|
V: 'flipVertical',
|
||||||
|
|||||||
@ -145,6 +145,7 @@ function loadJSON(path){
|
|||||||
// ]
|
// ]
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
// NOTE: this does not use the fs...
|
||||||
var groupByDate =
|
var groupByDate =
|
||||||
module.groupByDate =
|
module.groupByDate =
|
||||||
function(list){
|
function(list){
|
||||||
@ -170,6 +171,7 @@ function(list){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Group file list by keyword...
|
// Group file list by keyword...
|
||||||
//
|
//
|
||||||
// this will build a structure in the following format:
|
// this will build a structure in the following format:
|
||||||
@ -192,6 +194,7 @@ function(list){
|
|||||||
// the found JSON files.
|
// the found JSON files.
|
||||||
//
|
//
|
||||||
// NOTE: all files past the first non-diff are skipped.
|
// NOTE: all files past the first non-diff are skipped.
|
||||||
|
// NOTE: this does not use the fs...
|
||||||
var groupByKeyword =
|
var groupByKeyword =
|
||||||
module.groupByKeyword =
|
module.groupByKeyword =
|
||||||
function(list, from_date, logger){
|
function(list, from_date, logger){
|
||||||
@ -205,7 +208,7 @@ function(list, from_date, logger){
|
|||||||
.reverse()
|
.reverse()
|
||||||
// skip dates before from_date...
|
// skip dates before from_date...
|
||||||
// NOTE: from_date is included...
|
// NOTE: from_date is included...
|
||||||
.filter(function(d){ return from_date ? d <= from_date : true })
|
.filter(function(d){ return from_date ? d <= from_date || d == 'root' : true })
|
||||||
.forEach(function(d){
|
.forEach(function(d){
|
||||||
dates[d]
|
dates[d]
|
||||||
.sort()
|
.sort()
|
||||||
@ -262,10 +265,6 @@ function(list, from_date, logger){
|
|||||||
index[k] = index[k].map(function(e){ return e[1] })
|
index[k] = index[k].map(function(e){ return e[1] })
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX revise...
|
|
||||||
index.__dates = Object.keys(dates)
|
|
||||||
index.__date = Object.keys(date)[0]
|
|
||||||
|
|
||||||
logger && logger.emit('files-queued', queued, index)
|
logger && logger.emit('files-queued', queued, index)
|
||||||
|
|
||||||
return index
|
return index
|
||||||
@ -273,11 +272,19 @@ function(list, from_date, logger){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// XXX not yet working...
|
// Load index data listed by timestamp...
|
||||||
|
//
|
||||||
|
// NOTE: this returns data similar to groupByDate(..) but will replace
|
||||||
|
// the 'root' key with a timestamp...
|
||||||
|
// NOTE: this will include the full history. this is different to what
|
||||||
|
// groupByKeyword(..) does.
|
||||||
|
//
|
||||||
// XXX handle errors....
|
// XXX handle errors....
|
||||||
var loadSaveHistoryList =
|
var loadSaveHistoryList =
|
||||||
module.loadSaveHistoryList =
|
module.loadSaveHistoryList =
|
||||||
function(path){
|
function(path, index_dir){
|
||||||
|
index_dir = index_dir || INDEX_DIR
|
||||||
|
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
// direct index...
|
// direct index...
|
||||||
if(pathlib.basename(path) == index_dir){
|
if(pathlib.basename(path) == index_dir){
|
||||||
@ -287,9 +294,16 @@ function(path){
|
|||||||
logger && logger.emit('error', err)
|
logger && logger.emit('error', err)
|
||||||
})
|
})
|
||||||
.on('end', function(files){
|
.on('end', function(files){
|
||||||
var res = {}
|
var data = groupByDate(files)
|
||||||
|
|
||||||
resolve(Object.keys(groupByDate(files)))
|
// XXX should we mark the root timestamp in any way???
|
||||||
|
if('root' in data && data.root.length > 0){
|
||||||
|
// XXX handle stat error...
|
||||||
|
data[fse.statSync(data.root[0]).birthtime.getTimeStamp()] = data.root
|
||||||
|
delete data.root
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(data)
|
||||||
})
|
})
|
||||||
|
|
||||||
// need to locate indexes...
|
// need to locate indexes...
|
||||||
@ -313,7 +327,7 @@ function(path){
|
|||||||
// we do not need to include the index
|
// we do not need to include the index
|
||||||
// itself in the base path...
|
// itself in the base path...
|
||||||
var p = path.split(index_dir)[0]
|
var p = path.split(index_dir)[0]
|
||||||
res[p] = obj[path]
|
res[p] = obj
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
// done...
|
// done...
|
||||||
|
|||||||
@ -554,7 +554,15 @@ var BrowserPrototype = {
|
|||||||
.toArray()
|
.toArray()
|
||||||
},
|
},
|
||||||
set path(value){
|
set path(value){
|
||||||
this.update(value)
|
// XXX check if path has changed...
|
||||||
|
value = this.path2list(value)
|
||||||
|
var cur = this.path
|
||||||
|
|
||||||
|
// update only if path is different...
|
||||||
|
value.length == cur.length
|
||||||
|
&& cur
|
||||||
|
.filter(function(e, i){ return e == value[i] }).length != cur.length
|
||||||
|
&& this.update(value)
|
||||||
},
|
},
|
||||||
|
|
||||||
// String path...
|
// String path...
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user