mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-11-04 05:10:07 +00:00
lots of work on file loading and saving, now almost up to spec, still needs refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
2999d4bcab
commit
8d446609fd
@ -23,8 +23,11 @@
|
|||||||
[_] BUG: changing window size in single image modes messes things up...
|
[_] BUG: changing window size in single image modes messes things up...
|
||||||
| until we cycle to ribbon mode and back...
|
| until we cycle to ribbon mode and back...
|
||||||
[_] ASAP: load/view un-cached directories...
|
[_] ASAP: load/view un-cached directories...
|
||||||
|
[_] show only one ribbon mode
|
||||||
|
| should this have up/down navigation?
|
||||||
[_] slideshow mode...
|
[_] slideshow mode...
|
||||||
[_] import fav dirs (wo. index)...
|
[_] import fav dirs (wo. index)...
|
||||||
|
[_] image sorting (reverse/date/name/...)
|
||||||
[_] add ability to save/load ranges of images and the structures around them
|
[_] add ability to save/load ranges of images and the structures around them
|
||||||
| e.g.load image 100 to current ribbon -> will load 100 images
|
| e.g.load image 100 to current ribbon -> will load 100 images
|
||||||
| for current ribbon and all the in between images from other
|
| for current ribbon and all the in between images from other
|
||||||
|
|||||||
689
ui/data.js
689
ui/data.js
@ -57,10 +57,8 @@ var DATA = {
|
|||||||
|
|
||||||
// the images object, this is indexed by image GID and contains all
|
// the images object, this is indexed by image GID and contains all
|
||||||
// the needed data...
|
// the needed data...
|
||||||
// XXX should we split this out?
|
|
||||||
var IMAGES = {}
|
var IMAGES = {}
|
||||||
// True if images is modified and needs saving...
|
var IMAGES_UPDATED = []
|
||||||
var IMAGES_DIRTY = false
|
|
||||||
|
|
||||||
var DATA_ATTR = 'DATA'
|
var DATA_ATTR = 'DATA'
|
||||||
|
|
||||||
@ -252,15 +250,17 @@ function getGIDBefore(gid, ribbon, search){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get a "count" of GIDs starting with a given gid ("from")
|
||||||
|
//
|
||||||
|
// NOTE: this will not include the 'from' GID in the resulting list,
|
||||||
|
// unless inclusive is set to true.
|
||||||
// NOTE: count can be either negative or positive, this will indicate
|
// NOTE: count can be either negative or positive, this will indicate
|
||||||
// load direction...
|
// load direction...
|
||||||
// NOTE: this will not include the 'from' GID in the resulting list...
|
// NOTE: this can calculate the ribbon number where the image is located.
|
||||||
// NOTE: this can calculate the ribbon number if an image can be only
|
|
||||||
// in one ribbon...
|
|
||||||
// NOTE: if an image can be in more than one ribbon, one MUST suply the
|
// NOTE: if an image can be in more than one ribbon, one MUST suply the
|
||||||
// correct ribbon number...
|
// correct ribbon number...
|
||||||
|
//
|
||||||
// XXX do we need more checking???
|
// XXX do we need more checking???
|
||||||
// XXX inclusive can not be false, only null or true...
|
|
||||||
function getImageGIDs(from, count, ribbon, inclusive){
|
function getImageGIDs(from, count, ribbon, inclusive){
|
||||||
if(count == 0){
|
if(count == 0){
|
||||||
return []
|
return []
|
||||||
@ -292,8 +292,6 @@ function getImageGIDs(from, count, ribbon, inclusive){
|
|||||||
// Select best preview by size...
|
// Select best preview by size...
|
||||||
//
|
//
|
||||||
// NOTE: this will use the original if everything else is smaller...
|
// NOTE: this will use the original if everything else is smaller...
|
||||||
//
|
|
||||||
// XXX make this both relative and absolute URL compatible...
|
|
||||||
function getBestPreview(gid, size){
|
function getBestPreview(gid, size){
|
||||||
size = size == null ? getVisibleImageSize('max') : size
|
size = size == null ? getVisibleImageSize('max') : size
|
||||||
var s
|
var s
|
||||||
@ -311,7 +309,6 @@ function getBestPreview(gid, size){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
//url: url,
|
|
||||||
url: normalizePath(url),
|
url: normalizePath(url),
|
||||||
size: preview_size
|
size: preview_size
|
||||||
}
|
}
|
||||||
@ -320,7 +317,7 @@ function getBestPreview(gid, size){
|
|||||||
|
|
||||||
// Normalize the path...
|
// Normalize the path...
|
||||||
//
|
//
|
||||||
// This will do:
|
// This will:
|
||||||
// - convert windows absolute paths 'X:\...' -> 'file:///X:/...'
|
// - convert windows absolute paths 'X:\...' -> 'file:///X:/...'
|
||||||
// - if mode is 'absolute':
|
// - if mode is 'absolute':
|
||||||
// - return absolute paths as-is
|
// - return absolute paths as-is
|
||||||
@ -333,8 +330,6 @@ function getBestPreview(gid, size){
|
|||||||
// - return relative paths as-is
|
// - return relative paths as-is
|
||||||
//
|
//
|
||||||
// NOTE: mode can be either 'absolute' (default) or 'relative'...
|
// NOTE: mode can be either 'absolute' (default) or 'relative'...
|
||||||
//
|
|
||||||
// XXX need to account for '.' base
|
|
||||||
function normalizePath(url, base, mode){
|
function normalizePath(url, base, mode){
|
||||||
mode = mode == null ? 'absolute' : mode
|
mode = mode == null ? 'absolute' : mode
|
||||||
base = base == null ? BASE_URL : base
|
base = base == null ? BASE_URL : base
|
||||||
@ -347,7 +342,7 @@ function normalizePath(url, base, mode){
|
|||||||
url = 'file:///' + url
|
url = 'file:///' + url
|
||||||
}
|
}
|
||||||
|
|
||||||
// absolute path...
|
// we got absolute path...
|
||||||
if(/^(file|http|https):\/\/.*$/.test(url)){
|
if(/^(file|http|https):\/\/.*$/.test(url)){
|
||||||
// check if we start with base, and remove it if so...
|
// check if we start with base, and remove it if so...
|
||||||
if(mode == 'relative' && url.substring(0, base.length) == base){
|
if(mode == 'relative' && url.substring(0, base.length) == base){
|
||||||
@ -375,6 +370,56 @@ function normalizePath(url, base, mode){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* Format conversion
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Convert legacy Gen1 data format to current Gen3 (v2.0)
|
||||||
|
function convertDataGen1(data, cmp){
|
||||||
|
var res = {
|
||||||
|
data: {
|
||||||
|
version: '2.0',
|
||||||
|
current: null,
|
||||||
|
ribbons: [],
|
||||||
|
order: [],
|
||||||
|
},
|
||||||
|
images: {}
|
||||||
|
}
|
||||||
|
cmp = cmp == null ?
|
||||||
|
function(a, b){
|
||||||
|
return imageDateCmp(a, b, res.images)
|
||||||
|
}
|
||||||
|
: cmp
|
||||||
|
var ribbons = res.data.ribbons
|
||||||
|
var order = res.data.order
|
||||||
|
var images = res.images
|
||||||
|
|
||||||
|
// position...
|
||||||
|
res.data.current = data.position
|
||||||
|
|
||||||
|
// ribbons and images...
|
||||||
|
$.each(data.ribbons, function(i, input_images){
|
||||||
|
var ribbon = []
|
||||||
|
ribbons.push(ribbon)
|
||||||
|
for(var id in input_images){
|
||||||
|
var image = input_images[id]
|
||||||
|
ribbon.push(id)
|
||||||
|
order.push(id)
|
||||||
|
images[id] = image
|
||||||
|
}
|
||||||
|
ribbon.sort(cmp)
|
||||||
|
})
|
||||||
|
|
||||||
|
order.sort(cmp)
|
||||||
|
|
||||||
|
// XXX STUB
|
||||||
|
res.data.current = order[0]
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Loaders
|
* Loaders
|
||||||
*/
|
*/
|
||||||
@ -535,6 +580,8 @@ function loadImagesAround(ref_gid, count, ribbon){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Roll ribbon and load new images in the updated section.
|
||||||
|
//
|
||||||
// NOTE: this is signature-compatible with rollRibbon...
|
// NOTE: this is signature-compatible with rollRibbon...
|
||||||
// NOTE: this will load data ONLY if it is available, otherwise this
|
// NOTE: this will load data ONLY if it is available, otherwise this
|
||||||
// will have no effect...
|
// will have no effect...
|
||||||
@ -604,50 +651,6 @@ function loadData(images_per_screen){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function convertDataGen1(data, cmp){
|
|
||||||
var res = {
|
|
||||||
data: {
|
|
||||||
version: '2.0',
|
|
||||||
current: null,
|
|
||||||
ribbons: [],
|
|
||||||
order: [],
|
|
||||||
},
|
|
||||||
images: {}
|
|
||||||
}
|
|
||||||
cmp = cmp == null ?
|
|
||||||
function(a, b){
|
|
||||||
return imageDateCmp(a, b, res.images)
|
|
||||||
}
|
|
||||||
: cmp
|
|
||||||
var ribbons = res.data.ribbons
|
|
||||||
var order = res.data.order
|
|
||||||
var images = res.images
|
|
||||||
|
|
||||||
// position...
|
|
||||||
res.data.current = data.position
|
|
||||||
|
|
||||||
// ribbons and images...
|
|
||||||
$.each(data.ribbons, function(i, input_images){
|
|
||||||
var ribbon = []
|
|
||||||
ribbons.push(ribbon)
|
|
||||||
for(var id in input_images){
|
|
||||||
var image = input_images[id]
|
|
||||||
ribbon.push(id)
|
|
||||||
order.push(id)
|
|
||||||
images[id] = image
|
|
||||||
}
|
|
||||||
ribbon.sort(cmp)
|
|
||||||
})
|
|
||||||
|
|
||||||
order.sort(cmp)
|
|
||||||
|
|
||||||
// XXX STUB
|
|
||||||
res.data.current = order[0]
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadSettings(){
|
function loadSettings(){
|
||||||
toggleTheme(SETTINGS['theme'])
|
toggleTheme(SETTINGS['theme'])
|
||||||
|
|
||||||
@ -663,218 +666,6 @@ function loadSettings(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* localStorage
|
|
||||||
*
|
|
||||||
* XXX should we use jStorage here?
|
|
||||||
*/
|
|
||||||
|
|
||||||
function loadLocalStorageData(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
var data = localStorage[attr]
|
|
||||||
if(data == null){
|
|
||||||
data = '{}'
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
data: JSON.parse(data),
|
|
||||||
base_url: localStorage[attr + '_BASE_URL'],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveLocalStorageData(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
localStorage[attr] = JSON.stringify(DATA)
|
|
||||||
localStorage[attr + '_BASE_URL'] = BASE_URL
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadLocalStorageImages(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_IMAGES'
|
|
||||||
var images = localStorage[attr]
|
|
||||||
if(images == null){
|
|
||||||
images = '{}'
|
|
||||||
}
|
|
||||||
return JSON.parse(images)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveLocalStorageImages(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_IMAGES'
|
|
||||||
localStorage[attr] = JSON.stringify(IMAGES)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// generic save/load...
|
|
||||||
function loadLocalStorage(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
var d = loadLocalStorageData(attr)
|
|
||||||
BASE_URL = d.base_url
|
|
||||||
DATA = d.data
|
|
||||||
IMAGES = loadLocalStorageImages(attr)
|
|
||||||
return loadData()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveLocalStorage(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
saveLocalStorageData(attr)
|
|
||||||
saveLocalStorageImages(attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadLocalStorageMarks(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_MARKED'
|
|
||||||
var marked = localStorage[attr]
|
|
||||||
if(marked == null){
|
|
||||||
marked = '[]'
|
|
||||||
}
|
|
||||||
MARKED = JSON.parse(marked)
|
|
||||||
return loadData()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveLocalStorageMarks(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_MARKED'
|
|
||||||
localStorage[attr] = JSON.stringify(MARKED)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadLocalStorageSettings(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_SETTINGS'
|
|
||||||
SETTINGS = JSON.parse(localStorage[attr])
|
|
||||||
|
|
||||||
loadSettings()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveLocalStorageSettings(attr){
|
|
||||||
attr = attr == null ? DATA_ATTR : attr
|
|
||||||
attr += '_SETTINGS'
|
|
||||||
localStorage[attr] = JSON.stringify(SETTINGS)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* Extension API (CEF/PhoneGap/...)
|
|
||||||
*/
|
|
||||||
|
|
||||||
function loadFileImages(path, callback){
|
|
||||||
return $.getJSON(path)
|
|
||||||
.done(function(json){
|
|
||||||
IMAGES = json
|
|
||||||
localStorage[DATA_ATTR + '_IMAGES_FILE'] = path
|
|
||||||
console.log('Loaded IMAGES...')
|
|
||||||
|
|
||||||
callback != null && callback()
|
|
||||||
})
|
|
||||||
.fail(function(){
|
|
||||||
console.error('ERROR LOADING:', path)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadFile(data_path, image_path, callback){
|
|
||||||
var base = data_path.split(CACHE_DIR)[0]
|
|
||||||
base = base == data_path ? '.' : base
|
|
||||||
// CEF
|
|
||||||
return $.getJSON(data_path)
|
|
||||||
.done(function(json){
|
|
||||||
BASE_URL = base
|
|
||||||
// legacy format...
|
|
||||||
if(json.version == null){
|
|
||||||
json = convertDataGen1(json)
|
|
||||||
DATA = json.data
|
|
||||||
IMAGES = json.images
|
|
||||||
// XXX load marked data...
|
|
||||||
MARKED = []
|
|
||||||
loadData()
|
|
||||||
|
|
||||||
// version 2.0
|
|
||||||
// XXX needs a more flexible protocol...
|
|
||||||
} else if(json.version == '2.0') {
|
|
||||||
DATA = json
|
|
||||||
if(image_path != null){
|
|
||||||
loadFileImages(normalizePath(image_path, base))
|
|
||||||
.done(function(){
|
|
||||||
loadData()
|
|
||||||
|
|
||||||
callback != null && callback()
|
|
||||||
})
|
|
||||||
} else if(DATA.image_file != null) {
|
|
||||||
loadFileImages(normalizePath(DATA.image_file, base))
|
|
||||||
.done(function(){
|
|
||||||
loadData()
|
|
||||||
|
|
||||||
callback != null && callback()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// unknown format...
|
|
||||||
} else {
|
|
||||||
console.error('unknown format.')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.fail(function(){
|
|
||||||
console.error('ERROR LOADING:', data_path)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function saveFile(name){
|
|
||||||
// CEF
|
|
||||||
if(window.CEF_dumpJSON != null){
|
|
||||||
if(DATA.image_file == null){
|
|
||||||
DATA.image_file = name + '-images.json'
|
|
||||||
}
|
|
||||||
//CEF_dumpJSON(DATA.image_file, IMAGES)
|
|
||||||
// XXX this will overwrite the images...
|
|
||||||
//CEF_dumpJSON(name + '-images.json', IMAGES)
|
|
||||||
//DATA.image_file = name + '-images.json'
|
|
||||||
CEF_dumpJSON(name + '-data.json', DATA)
|
|
||||||
CEF_dumpJSON(name + '-marked.json', MARKED)
|
|
||||||
|
|
||||||
// PhoneGap
|
|
||||||
} else if(false) {
|
|
||||||
// XXX
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function openImage(){
|
|
||||||
// CEF
|
|
||||||
if(window.CEF_runSystem != null){
|
|
||||||
// XXX if path is not present try and open the biggest preview...
|
|
||||||
return CEF_runSystem(normalizePath(IMAGES[getImageGID()].path, BASE_URL))
|
|
||||||
|
|
||||||
// PhoneGap
|
|
||||||
} else if(false) {
|
|
||||||
// XXX
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// XXX need revision...
|
|
||||||
function loadDir(path){
|
|
||||||
return loadFile(BASE_URL +'/data.json')
|
|
||||||
.fail(function(){
|
|
||||||
loadFile(BASE_URL +'/'+ CACHE_DIR +'/data.json')
|
|
||||||
.fail(function(){
|
|
||||||
// XXX load plain images...
|
|
||||||
// XXX
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Image caching...
|
* Image caching...
|
||||||
*/
|
*/
|
||||||
@ -913,6 +704,358 @@ function preCacheAllRibbons(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* localStorage
|
||||||
|
*
|
||||||
|
* XXX should we use jStorage here?
|
||||||
|
*/
|
||||||
|
|
||||||
|
function loadLocalStorageData(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
var data = localStorage[attr]
|
||||||
|
if(data == null){
|
||||||
|
data = '{}'
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
data: JSON.parse(data),
|
||||||
|
base_url: localStorage[attr + '_BASE_URL'],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function saveLocalStorageData(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
localStorage[attr] = JSON.stringify(DATA)
|
||||||
|
localStorage[attr + '_BASE_URL'] = BASE_URL
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function loadLocalStorageImages(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_IMAGES'
|
||||||
|
var images = localStorage[attr]
|
||||||
|
if(images == null){
|
||||||
|
images = '{}'
|
||||||
|
}
|
||||||
|
return JSON.parse(images)
|
||||||
|
}
|
||||||
|
function saveLocalStorageImages(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_IMAGES'
|
||||||
|
localStorage[attr] = JSON.stringify(IMAGES)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function loadLocalStorageMarks(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_MARKED'
|
||||||
|
var marked = localStorage[attr]
|
||||||
|
if(marked == null){
|
||||||
|
marked = '[]'
|
||||||
|
}
|
||||||
|
MARKED = JSON.parse(marked)
|
||||||
|
return loadData()
|
||||||
|
}
|
||||||
|
function saveLocalStorageMarks(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_MARKED'
|
||||||
|
localStorage[attr] = JSON.stringify(MARKED)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function loadLocalStorageSettings(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_SETTINGS'
|
||||||
|
SETTINGS = JSON.parse(localStorage[attr])
|
||||||
|
|
||||||
|
loadSettings()
|
||||||
|
}
|
||||||
|
function saveLocalStorageSettings(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
attr += '_SETTINGS'
|
||||||
|
localStorage[attr] = JSON.stringify(SETTINGS)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// generic save/load...
|
||||||
|
function loadLocalStorage(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
var d = loadLocalStorageData(attr)
|
||||||
|
BASE_URL = d.base_url
|
||||||
|
DATA = d.data
|
||||||
|
IMAGES = loadLocalStorageImages(attr)
|
||||||
|
return loadData()
|
||||||
|
}
|
||||||
|
function saveLocalStorage(attr){
|
||||||
|
attr = attr == null ? DATA_ATTR : attr
|
||||||
|
saveLocalStorageData(attr)
|
||||||
|
saveLocalStorageImages(attr)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* File storage (Extension API -- CEF/PhoneGap/...)
|
||||||
|
*
|
||||||
|
* XXX need to cleanup this section...
|
||||||
|
*/
|
||||||
|
|
||||||
|
// CEF
|
||||||
|
if(window.CEF_dumpJSON != null){
|
||||||
|
var dumpJSON = CEF_dumpJSON
|
||||||
|
var listDir = CEF_listDir
|
||||||
|
var removeFile = CEF_removeFile
|
||||||
|
var runSystem = CEF_runSystem
|
||||||
|
|
||||||
|
// PhoneGap
|
||||||
|
} else if(false) {
|
||||||
|
// XXX
|
||||||
|
var dumpJSON = null
|
||||||
|
var listDir = null
|
||||||
|
var removeFile = null
|
||||||
|
var runSystem = null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function loadFileImages(path, no_load_diffs, callback){
|
||||||
|
|
||||||
|
if(window.listDir == null){
|
||||||
|
no_load_diffs = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if(path == null){
|
||||||
|
var base = normalizePath(CACHE_DIR)
|
||||||
|
var path = $.map(listDir(base), function(e){
|
||||||
|
return /.*-images.json$/.test(e) ? e : null
|
||||||
|
}).sort().reverse()[0]
|
||||||
|
path = path == null ? 'images.json' : path
|
||||||
|
|
||||||
|
console.log('Loading:', path)
|
||||||
|
|
||||||
|
path = base +'/'+ path
|
||||||
|
|
||||||
|
} else {
|
||||||
|
path = normalizePath(path)
|
||||||
|
// XXX need to account for paths without a CACHE_DIR
|
||||||
|
var base = path.split(CACHE_DIR)[0]
|
||||||
|
base += '/'+ CACHE_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
var diff_data = {}
|
||||||
|
var diff = true
|
||||||
|
|
||||||
|
// XXX what are we going to do if base == path, i.e. no cache dir???
|
||||||
|
|
||||||
|
|
||||||
|
// XXX no error handling if one of the diff loads fail...
|
||||||
|
if(!no_load_diffs){
|
||||||
|
var diffs = [diff_data]
|
||||||
|
var diffs_names = $.map(listDir(base), function(e){
|
||||||
|
return /.*-images-diff.json$/.test(e) ? e : null
|
||||||
|
}).sort()
|
||||||
|
diff = $.when.apply(null, $.map(diffs_names, function(e, i){
|
||||||
|
return $.getJSON(normalizePath(base +'/'+ e))
|
||||||
|
.done(function(data){
|
||||||
|
diffs[i+1] = data
|
||||||
|
console.log('Loaded:', e)
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
.then(function(){
|
||||||
|
$.extend.apply(null, diffs)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return $.when(diff, $.getJSON(path))
|
||||||
|
.done(function(_, json){
|
||||||
|
json = json[0]
|
||||||
|
$.extend(json, diff_data)
|
||||||
|
IMAGES = json
|
||||||
|
|
||||||
|
//localStorage[DATA_ATTR + '_IMAGES_FILE'] = path
|
||||||
|
|
||||||
|
console.log('Loaded IMAGES...')
|
||||||
|
|
||||||
|
callback != null && callback()
|
||||||
|
})
|
||||||
|
.fail(function(){
|
||||||
|
console.error('ERROR LOADING:', path)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// XXX make this load a default data filename...
|
||||||
|
// XXX look into the CACHE_DIR if not explicitly given...
|
||||||
|
function loadFileState(data_path, image_path, callback){
|
||||||
|
var base = data_path.split(CACHE_DIR)[0]
|
||||||
|
base = base == data_path ? '.' : base
|
||||||
|
|
||||||
|
return $.getJSON(data_path)
|
||||||
|
.done(function(json){
|
||||||
|
BASE_URL = base
|
||||||
|
// legacy format...
|
||||||
|
if(json.version == null){
|
||||||
|
json = convertDataGen1(json)
|
||||||
|
DATA = json.data
|
||||||
|
IMAGES = json.images
|
||||||
|
// XXX load marked data...
|
||||||
|
MARKED = []
|
||||||
|
loadData()
|
||||||
|
|
||||||
|
// version 2.0
|
||||||
|
// XXX needs a more flexible protocol...
|
||||||
|
} else if(json.version == '2.0') {
|
||||||
|
DATA = json
|
||||||
|
if(image_path != null){
|
||||||
|
loadFileImages(normalizePath(image_path, base))
|
||||||
|
.done(function(){
|
||||||
|
loadData()
|
||||||
|
|
||||||
|
callback != null && callback()
|
||||||
|
})
|
||||||
|
} else if(DATA.image_file != null) {
|
||||||
|
loadFileImages(normalizePath(DATA.image_file, base))
|
||||||
|
.done(function(){
|
||||||
|
loadData()
|
||||||
|
|
||||||
|
callback != null && callback()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
loadFileImages(null)
|
||||||
|
.done(function(){
|
||||||
|
loadData()
|
||||||
|
|
||||||
|
callback != null && callback()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// unknown format...
|
||||||
|
} else {
|
||||||
|
console.error('unknown format.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function(){
|
||||||
|
console.error('ERROR LOADING:', data_path)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Save current images list...
|
||||||
|
//
|
||||||
|
// NOTE: this will save the merged images and remove the diff files...
|
||||||
|
// NOTE: if an explicit name is given then this will not remove anything.
|
||||||
|
// NOTE: if not explicit name is given this will save to the current
|
||||||
|
// cache dir.
|
||||||
|
function saveFileImages(name){
|
||||||
|
var remove_diffs = (name == null)
|
||||||
|
name = name == null ? normalizePath(CACHE_DIR +'/'+ Date.timeStamp()) : name
|
||||||
|
|
||||||
|
// CEF
|
||||||
|
if(window.dumpJSON == null){
|
||||||
|
console.error('Can\'t save to file.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the diffs...
|
||||||
|
if(remove_diffs){
|
||||||
|
$.each($.map(listDir(normalizePath(CACHE_DIR)), function(e){
|
||||||
|
return /.*-images-diff.json$/.test(e) ? e : null
|
||||||
|
}), function(i, e){
|
||||||
|
console.log('removeing:', e)
|
||||||
|
removeFile(normalizePath(CACHE_DIR +'/'+ e))
|
||||||
|
})
|
||||||
|
IMAGES_UPDATED = []
|
||||||
|
}
|
||||||
|
|
||||||
|
dumpJSON(name + '-images.json', IMAGES)
|
||||||
|
//DATA.image_file = normalizePath(name + '-images.json', null, 'relative')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function saveFileState(name, no_normalize_path){
|
||||||
|
name = name == null ? Date.timeStamp() : name
|
||||||
|
|
||||||
|
if(!no_normalize_path){
|
||||||
|
name = normalizePath(CACHE_DIR +'/'+ name)
|
||||||
|
|
||||||
|
// write .image_file only if saving data to a non-cache dir...
|
||||||
|
// XXX check if this is correct...
|
||||||
|
} else {
|
||||||
|
if(DATA.image_file == null){
|
||||||
|
DATA.image_file = name + '-images.json'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dumpJSON(name + '-data.json', DATA)
|
||||||
|
dumpJSON(name + '-marked.json', MARKED)
|
||||||
|
|
||||||
|
// save the updated images...
|
||||||
|
if(IMAGES_UPDATED.length > 0){
|
||||||
|
var updated = {}
|
||||||
|
$.each(IMAGES_UPDATED, function(i, e){
|
||||||
|
updated[e] = IMAGES[e]
|
||||||
|
})
|
||||||
|
dumpJSON(name + '-images-diff.json', updated)
|
||||||
|
IMAGES_UPDATED = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Open image in an external editor/viewer
|
||||||
|
//
|
||||||
|
// NOTE: this will open the default editor/viewer.
|
||||||
|
function openImage(){
|
||||||
|
// CEF
|
||||||
|
if(window.runSystem == null){
|
||||||
|
console.error('Can\'t run external programs.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX if path is not present try and open the biggest preview...
|
||||||
|
return runSystem(normalizePath(IMAGES[getImageGID()].path, BASE_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// XXX need revision...
|
||||||
|
function loadDir(path){
|
||||||
|
|
||||||
|
if(window.CEF_listDir != null){
|
||||||
|
var listDir = CEF_listDir
|
||||||
|
|
||||||
|
// PhoneGap
|
||||||
|
} else if(false) {
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
} else {
|
||||||
|
no_load_diffs = true
|
||||||
|
}
|
||||||
|
|
||||||
|
path = normalizePath(path)
|
||||||
|
|
||||||
|
var files = listDir(path)
|
||||||
|
var data = $.map(files, function(e){
|
||||||
|
return /.*-data.json$/.test(e) ? e : null
|
||||||
|
}).sort().reverse()[0]
|
||||||
|
data = (data == null && files.indexOf('data.json') >= 0) ? 'data.json' : data
|
||||||
|
|
||||||
|
// look in the cache dir...
|
||||||
|
if(data == null){
|
||||||
|
path += '/' + CACHE_DIR
|
||||||
|
|
||||||
|
files = listDir(path)
|
||||||
|
data = $.map(listDir(path), function(e){
|
||||||
|
return /.*-data.json$/.test(e) ? e : null
|
||||||
|
}).sort().reverse()[0]
|
||||||
|
data = (data == null && files.indexOf('data.json') >= 0) ? 'data.json' : data
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Loading:', data)
|
||||||
|
|
||||||
|
data = path + '/' + data
|
||||||
|
|
||||||
|
return loadFileState(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Setup
|
* Setup
|
||||||
*/
|
*/
|
||||||
@ -1070,7 +1213,9 @@ function setupDataBindings(viewer){
|
|||||||
var orientation = img.attr('orientation')
|
var orientation = img.attr('orientation')
|
||||||
|
|
||||||
IMAGES[gid].orientation = orientation
|
IMAGES[gid].orientation = orientation
|
||||||
IMAGES_DIRTY = true
|
if(IMAGES_UPDATED.indexOf(gid) == -1){
|
||||||
|
IMAGES_UPDATED.push(gid)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1137,4 +1282,4 @@ function setupDataBindings(viewer){
|
|||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* vim:set ts=4 sw=4 : */
|
* vim:set ts=4 sw=4 spell : */
|
||||||
|
|||||||
@ -458,8 +458,9 @@ $(function(){
|
|||||||
//setElementOrigin($('.ribbon-set'), 'top', 'left')
|
//setElementOrigin($('.ribbon-set'), 'top', 'left')
|
||||||
|
|
||||||
// we have an image file...
|
// we have an image file...
|
||||||
if((DATA_ATTR + '_IMAGES_FILE') in localStorage){
|
if((DATA_ATTR + '_BASE_URL') in localStorage){
|
||||||
var loading = loadFileImages(localStorage[DATA_ATTR + '_IMAGES_FILE'])
|
BASE_URL = localStorage[DATA_ATTR + '_BASE_URL']
|
||||||
|
var loading = loadFileImages()
|
||||||
.done(function(){
|
.done(function(){
|
||||||
var d = loadLocalStorageData()
|
var d = loadLocalStorageData()
|
||||||
DATA = d.data
|
DATA = d.data
|
||||||
|
|||||||
@ -212,6 +212,8 @@ var KEYBOARD_CONFIG = {
|
|||||||
saveLocalStorageMarks()
|
saveLocalStorageMarks()
|
||||||
|
|
||||||
saveLocalStorageSettings()
|
saveLocalStorageSettings()
|
||||||
|
|
||||||
|
saveFileState()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
Z: {
|
Z: {
|
||||||
|
|||||||
@ -597,6 +597,34 @@ var cancelAnimationFrame = (window.cancelRequestAnimationFrame
|
|||||||
|| clearTimeout)
|
|| clearTimeout)
|
||||||
|
|
||||||
|
|
||||||
|
Date.prototype.getTimeStamp = function(){
|
||||||
|
var y = this.getFullYear()
|
||||||
|
var M = this.getMonth()+1
|
||||||
|
M = M < 10 ? '0'+M : M
|
||||||
|
var D = this.getDate()
|
||||||
|
D = D < 10 ? '0'+D : D
|
||||||
|
var H = this.getHours()
|
||||||
|
H = H < 10 ? '0'+H : H
|
||||||
|
var m = this.getMinutes()
|
||||||
|
m = m < 10 ? '0'+m : m
|
||||||
|
|
||||||
|
return ''+y+M+D+H+m
|
||||||
|
}
|
||||||
|
Date.prototype.setTimeStamp = function(ts){
|
||||||
|
this.setFullYear(ts.slice(0, 4))
|
||||||
|
this.setMonth(ts.slice(4, 6)*1-1)
|
||||||
|
this.setDate(ts.slice(6, 8))
|
||||||
|
this.setHours(ts.slice(8, 10))
|
||||||
|
this.setMinutes(ts.slice(10, 12))
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
Date.timeStamp = function(){
|
||||||
|
return (new Date()).getTimeStamp()
|
||||||
|
}
|
||||||
|
Date.fromTimeStamp = function(ts){
|
||||||
|
return (new Date()).setTimeStamp(ts)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user