mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	reworking file API...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									851cbb8cc2
								
							
						
					
					
						commit
						6cce53277b
					
				| @ -161,6 +161,7 @@ Roadmap | ||||
| 		| 	ribbon length: ~42 | ||||
| 		| 	screen width: 4 | ||||
| 		| 	jumping to end from start of ribbon | ||||
| 		[_] side-by side view... | ||||
| 		[_] ASAP: test on Android... | ||||
| 		[_] single image mode transition (alpha-blend/fade/none) | ||||
| 		[_] 75% image sorting (date/name/...) | ||||
|  | ||||
							
								
								
									
										225
									
								
								ui/data.js
									
									
									
									
									
								
							
							
						
						
									
										225
									
								
								ui/data.js
									
									
									
									
									
								
							| @ -1188,18 +1188,18 @@ function saveLocalStorage(attr){ | ||||
| * XXX need to cleanup this section... | ||||
| */ | ||||
| 
 | ||||
| // XXX needs testing...
 | ||||
| // XXX use a config object instead of positional arguments...
 | ||||
| function loadLatestFile(path, dfl, pattern, diff_pattern, report){ | ||||
| function loadLatestFile(path, dfl, pattern, diff_pattern){ | ||||
| 	dfl = dfl == null ? path.split(/[\/\\]/).pop() : dfl | ||||
| 	path = path == dfl ? '.' : path | ||||
| 
 | ||||
| 	var error | ||||
| 
 | ||||
| 	var res = $.Deferred() | ||||
| 	 | ||||
| 	// can't find diffs if can't list dirs...
 | ||||
| 	if(window.listDir == null && (pattern != null || diff_pattern != null)){ | ||||
| 		report && showErrorStatus(report, 'no directory listing support.') | ||||
| 		return res.reject() | ||||
| 		res.notify('unsupported', 'directory listing.') | ||||
| 		return res.reject('listDir unsupported.') | ||||
| 	} | ||||
| 
 | ||||
| 	// find the latest...
 | ||||
| @ -1209,17 +1209,12 @@ function loadLatestFile(path, dfl, pattern, diff_pattern, report){ | ||||
| 			return pattern.test(e) ? e : null | ||||
| 		}).sort().reverse()[0] | ||||
| 	} | ||||
| 	file = file == null ? dfl : file | ||||
| 
 | ||||
| 	report && showStatus(report, 'Loading:', file) | ||||
| 
 | ||||
| 	file = path +'/'+ file | ||||
| 	var file = file == null ? dfl : file | ||||
| 	 | ||||
| 	var diff_data = {} | ||||
| 	var diff = true | ||||
| 
 | ||||
| 	// collect and merge diffs...
 | ||||
| 	// XXX no error handling if one of the diff loads fail...
 | ||||
| 	if(diff_pattern != null){ | ||||
| 		diff_pattern = RegExp(diff_pattern) | ||||
| 		var diff_data = [diff_data] | ||||
| @ -1228,14 +1223,16 @@ function loadLatestFile(path, dfl, pattern, diff_pattern, report){ | ||||
| 		}).sort() | ||||
| 		diff = $.when.apply(null, $.map(diffs_names, function(e, i){ | ||||
| 					return $.getJSON(path +'/'+ e) | ||||
| 						// XXX this is ugly, had to do it this way as .then(...)
 | ||||
| 						// 		handlers get different argument sets depending on 
 | ||||
| 						// 		whether we have one or more deffereds here...
 | ||||
| 						.done(function(data){ | ||||
| 							diff_data[i+1] = data | ||||
| 							report && showStatus(report, 'Loaded:', e) | ||||
| 							res.notify('loaded', e) | ||||
| 						}) | ||||
| 						.fail(function(){ | ||||
| 							res.notify('load_error', e) | ||||
| 						}) | ||||
| 				})) | ||||
| 			// NOTE: .then(...) handlers get different signature args 
 | ||||
| 			// 		depending on the number of arguments to .when(...)...
 | ||||
| 			.then(function(){ | ||||
| 				$.extend.apply(null, diff_data) | ||||
| 				diff_data = diff_data[0] | ||||
| @ -1243,28 +1240,57 @@ function loadLatestFile(path, dfl, pattern, diff_pattern, report){ | ||||
| 	}  | ||||
| 
 | ||||
| 	// load the main file and merge the diff with it...
 | ||||
| 	$.when(diff, $.getJSON(file)) | ||||
| 	$.when(diff, $.getJSON(path +'/'+ file)) | ||||
| 		.done(function(_, json){ | ||||
| 			json = json[0] | ||||
| 
 | ||||
| 			res.notify('loaded', file) | ||||
| 
 | ||||
| 			// merge diffs...
 | ||||
| 			if(Object.keys(diff_data).length != 0){ | ||||
| 				$.extend(json, diff_data) | ||||
| 				report && showStatus(report, 'Merged diffs...') | ||||
| 				res.notify('merged') | ||||
| 			} | ||||
| 
 | ||||
| 			res.resolve(json) | ||||
| 
 | ||||
| 			report && showStatus(report, 'Done.') | ||||
| 		}) | ||||
| 		.fail(function(){ | ||||
| 			report && showErrorStatus(report, 'Loading: ' + file) | ||||
| 			return res.reject() | ||||
| 			res.notify('load_error', file) | ||||
| 
 | ||||
| 			return res.reject(file) | ||||
| 		}) | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function statusNotify(prefix, loader){ | ||||
| 	return loader | ||||
| 		.progress(function(action, data){ | ||||
| 			({ | ||||
| 				load: function(data){  | ||||
| 					showStatus(prefix, 'Loading:', data)  | ||||
| 				}, | ||||
| 				loaded: function(data){  | ||||
| 					showStatus(prefix, 'Loaded:', data)  | ||||
| 				}, | ||||
| 				merged: function(data){  | ||||
| 					showStatus(prefix, 'Merging:', 'Done.')  | ||||
| 				}, | ||||
| 				load_error: function(data){  | ||||
| 					showErrorStatus(prefix, 'Loading:', data)  | ||||
| 				}, | ||||
| 				unsupported: function(data){  | ||||
| 					showErrorStatus(prefix, 'Unsupported:', data)  | ||||
| 				}, | ||||
| 			})[action](data) | ||||
| 		}) | ||||
| 		.done(function(){ | ||||
| 			showStatus(prefix, 'Done.') | ||||
| 		}) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // load the target-specific handlers...
 | ||||
| // CEF
 | ||||
| if(window.CEF_dumpJSON != null){ | ||||
| @ -1284,7 +1310,11 @@ function loadFileImages(path, no_load_diffs, callback){ | ||||
| 	// default locations...
 | ||||
| 	if(path == null){ | ||||
| 		var base = normalizePath(CACHE_DIR) | ||||
| 		var res = loadLatestFile(base, IMAGES_FILE_DEFAULT, IMAGES_FILE_PATTERN, IMAGES_DIFF_FILE_PATTERN, 'Images:') | ||||
| 		var res = statusNotify('Images:',  | ||||
| 			loadLatestFile(base,  | ||||
| 				IMAGES_FILE_DEFAULT,  | ||||
| 				IMAGES_FILE_PATTERN,  | ||||
| 				IMAGES_DIFF_FILE_PATTERN)) | ||||
| 	 | ||||
| 	// explicit path...
 | ||||
| 	// XXX need to account for paths without a CACHE_DIR
 | ||||
| @ -1294,7 +1324,10 @@ function loadFileImages(path, no_load_diffs, callback){ | ||||
| 		base += '/'+ CACHE_DIR | ||||
| 
 | ||||
| 		// XXX is this correct???
 | ||||
| 		var res = loadLatestFile(base, path.split(base)[0], RegExp(path.split(base)[0]), null, 'Images:') | ||||
| 		var res = statusNotify('Images:',  | ||||
| 			loadLatestFile(base,  | ||||
| 				path.split(base)[0],  | ||||
| 				RegExp(path.split(base)[0]))) | ||||
| 	} | ||||
| 
 | ||||
| 	res.done(function(images){ | ||||
| @ -1304,8 +1337,6 @@ function loadFileImages(path, no_load_diffs, callback){ | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Save current images list...
 | ||||
| //
 | ||||
| // NOTE: this will save the merged images and remove the diff files...
 | ||||
| @ -1342,7 +1373,10 @@ function loadFileMarks(path, callback){ | ||||
| 	// default locations...
 | ||||
| 	if(path == null){ | ||||
| 		var base = normalizePath(CACHE_DIR) | ||||
| 		var res = loadLatestFile(base, MARKED_FILE_DEFAULT, MARKED_FILE_PATTERN, null, 'Marks:') | ||||
| 		var res = statusNotify('Marks:', | ||||
| 			loadLatestFile(base,  | ||||
| 				MARKED_FILE_DEFAULT,  | ||||
| 				MARKED_FILE_PATTERN)) | ||||
| 	 | ||||
| 	// explicit path...
 | ||||
| 	// XXX need to account for paths without a CACHE_DIR
 | ||||
| @ -1352,7 +1386,10 @@ function loadFileMarks(path, callback){ | ||||
| 		base += '/'+ CACHE_DIR | ||||
| 
 | ||||
| 		// XXX is this correct???
 | ||||
| 		var res = loadLatestFile(base, path.split(base)[0], RegExp(path.split(base)[0]), 'Marks:') | ||||
| 		var res = statusNotify('Marks:', | ||||
| 			loadLatestFile(base,  | ||||
| 				path.split(base)[0],  | ||||
| 				RegExp(path.split(base)[0]))) | ||||
| 	} | ||||
| 
 | ||||
| 	res.done(function(images){ | ||||
| @ -1362,15 +1399,31 @@ function loadFileMarks(path, callback){ | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| // XXX save marks...
 | ||||
| function saveFileMarks(name){ | ||||
| 	name = name == null ? normalizePath(CACHE_DIR +'/'+ Date.timeStamp()) : name | ||||
| 
 | ||||
| 	dumpJSON(name + '-marked.json', MARKED) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function loadFileState(data_path, callback){ | ||||
| 	var base = data_path.split(CACHE_DIR)[0] | ||||
| 	base = base == data_path ? '.' : base | ||||
| // XXX add support for explicit filenames...
 | ||||
| function loadFileState(path){ | ||||
| 	// XXX explicit data file path...
 | ||||
| 	if(/\.json$/i.test(path)){ | ||||
| 		// XXX at this 
 | ||||
| 		var base = path.split(CACHE_DIR)[0] | ||||
| 		base = base == path ? '.' : base | ||||
| 	} else { | ||||
| 		var base = path.split(CACHE_DIR)[0] | ||||
| 		base = base == path ? '.' : base | ||||
| 	} | ||||
| 
 | ||||
| 	var res = $.Deferred() | ||||
| 
 | ||||
| 	$.getJSON(data_path) | ||||
| 	statusNotify('Data:',  | ||||
| 			loadLatestFile(path,  | ||||
| 				DATA_FILE_DEFAULT,  | ||||
| 				DATA_FILE_PATTERN)) | ||||
| 		.done(function(json){ | ||||
| 			BASE_URL = base | ||||
| 
 | ||||
| @ -1381,38 +1434,36 @@ function loadFileState(data_path, callback){ | ||||
| 				IMAGES = json.images | ||||
| 				MARKED = [] | ||||
| 				reloadViewer() | ||||
| 				res.resolve() | ||||
| 
 | ||||
| 			// version 2.0
 | ||||
| 			} else if(json.version == '2.0') { | ||||
| 				DATA = json | ||||
| 				$.when( | ||||
| 						// XXX load config...
 | ||||
| 						// load images...
 | ||||
| 						loadFileImages(DATA.image_file == null ? | ||||
| 								normalizePath(DATA.image_file, base)  | ||||
| 								: null), | ||||
| 						// load marks if available...
 | ||||
| 					// XXX do we need to do this???
 | ||||
| 						loadFileMarks()) | ||||
| 					.done(function(){ | ||||
| 						reloadViewer() | ||||
| 							callback != null && callback() | ||||
| 						res.resolve() | ||||
| 					}) | ||||
| 
 | ||||
| 			// unknown format...
 | ||||
| 			} else { | ||||
| 				showStatus('Unknown format.') | ||||
| 				return | ||||
| 				res.reject('unknown format.') | ||||
| 			} | ||||
| 
 | ||||
| 		}) | ||||
| 		.fail(function(){ | ||||
| 			showErrorStatus('Loading:', data_path) | ||||
| 			res.reject('load_error', path) | ||||
| 		}) | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| function saveFileState(name, no_normalize_path){ | ||||
| 	name = name == null ? Date.timeStamp() : name | ||||
| 
 | ||||
| @ -1429,7 +1480,7 @@ function saveFileState(name, no_normalize_path){ | ||||
| 
 | ||||
| 	dumpJSON(name + '-data.json', DATA) | ||||
| 	// XXX do we need to do this???
 | ||||
| 	dumpJSON(name + '-marked.json', MARKED) | ||||
| 	saveFileMarks(name) | ||||
| 
 | ||||
| 	// save the updated images...
 | ||||
| 	if(IMAGES_UPDATED.length > 0){ | ||||
| @ -1456,78 +1507,84 @@ function saveFileState(name, no_normalize_path){ | ||||
| //
 | ||||
| // XXX this will not load the marks file...
 | ||||
| // XXX make sure that save works...
 | ||||
| // XXX might be good to split this into loadFileData and loadDir...
 | ||||
| // XXX use loadLatestFile(...)...
 | ||||
| function loadDir(path, raw_load){ | ||||
| function loadDir(path){ | ||||
| 	path = normalizePath(path) | ||||
| 	var orig_path = path | ||||
| 	var data | ||||
| 
 | ||||
| 	var res = $.Deferred() | ||||
| 
 | ||||
| 	showStatus('Loading:', path) | ||||
| 	res.notify('load', path) | ||||
| 
 | ||||
| 	var files = listDir(path) | ||||
| 
 | ||||
| 	if(files == null){ | ||||
| 		showErrorStatus('No files in path: ' + path) | ||||
| 		return | ||||
| 		//showErrorStatus('No files in path: ' + path)
 | ||||
| 		res.notify('load_error', path) | ||||
| 		return res.reject() | ||||
| 	} | ||||
| 
 | ||||
| 	if(!raw_load){ | ||||
| 		data = $.map(files, function(e){  | ||||
| 			return DATA_FILE_PATTERN.test(e) ? e : null | ||||
| 		}).sort().reverse()[0] | ||||
| 		data = (data == null && files.indexOf(DATA_FILE_DEFAULT) >= 0) ? DATA_FILE_DEFAULT : data | ||||
| 
 | ||||
| 		// look in the cache dir...
 | ||||
| 		if(data == null){ | ||||
| 			path += '/' + CACHE_DIR | ||||
| 
 | ||||
| 			files = listDir(path) | ||||
| 			if(files != null){ | ||||
| 				data = $.map(listDir(path), function(e){  | ||||
| 					return DATA_FILE_PATTERN.test(e) ? e : null | ||||
| 				}).sort().reverse()[0] | ||||
| 				data = (data == null && files.indexOf(DATA_FILE_DEFAULT) >= 0) ? DATA_FILE_DEFAULT : data | ||||
| 			} | ||||
| 		} | ||||
| 	if(files.indexOf(CACHE_DIR) >= 0){ | ||||
| 		path = path +'/'+ CACHE_DIR | ||||
| 	} | ||||
| 
 | ||||
| 	// load the found data file...
 | ||||
| 	if(data != null){ | ||||
| 		showStatus('Loading:', data) | ||||
| 
 | ||||
| 		data = path + '/' + data | ||||
| 
 | ||||
| 		// marks...
 | ||||
| 		// XXX see if there's a marks file...
 | ||||
| 		MARKED = [] | ||||
| 
 | ||||
| 		return loadFileState(data) | ||||
| 			.always(function(){ | ||||
| 				showStatus('Done.') | ||||
| 	statusNotify('Dir:', loadFileState(path)) | ||||
| 		//.progress(function(action, data){
 | ||||
| 		//	res.notify(action, data)
 | ||||
| 		//})
 | ||||
| 		.done(function(){ | ||||
| 			res.resolve() | ||||
| 		}) | ||||
| 		.fail(function(){ | ||||
| 			statusNotify('Raw dir:', loadRawDir(orig_path)) | ||||
| 				.done(function(){ | ||||
| 					res.resolve() | ||||
| 				}) | ||||
| 				.fail(function(){ | ||||
| 					res.reject() | ||||
| 				}) | ||||
| 				 | ||||
| 	// load the dir as-is...
 | ||||
| 	} else { | ||||
| 		files = listDir(orig_path) | ||||
| 		}) | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // XXX check if we need to pass down sorting settings to the generators...
 | ||||
| function loadRawDir(path){ | ||||
| 	var files = listDir(path) | ||||
| 
 | ||||
| 	var res = $.Deferred() | ||||
| 
 | ||||
| 	var image_paths = $.map(files, function(e){ | ||||
| 		return IMAGE_PATTERN.test(e) ? e : null | ||||
| 	}) | ||||
| 
 | ||||
| 	if(image_paths.length == 0){ | ||||
| 			showErrorStatus('No images in:', orig_path) | ||||
| 			return  | ||||
| 		//showErrorStatus('No images in:', path)
 | ||||
| 		res.notify('load_error', path) | ||||
| 		return res.reject() | ||||
| 	} | ||||
| 
 | ||||
| 	BASE_URL = path | ||||
| 
 | ||||
| 	IMAGES = imagesFromUrls(image_paths) | ||||
| 	res.notify('loaded', 'images.') | ||||
| 
 | ||||
| 	DATA = dataFromImages(IMAGES) | ||||
| 		BASE_URL = orig_path | ||||
| 	res.notify('loaded', 'data.') | ||||
| 
 | ||||
| 	DATA.ribbons = ribbonsFromFavDirs() | ||||
| 	res.notify('loaded', 'fav dirs.') | ||||
| 
 | ||||
| 	MARKED = [] | ||||
| 
 | ||||
| 	sortImagesByDate() | ||||
| 
 | ||||
| 	reloadViewer() | ||||
| 		showStatus('Done.') | ||||
| 	} | ||||
| 
 | ||||
| 	return res.resolve() | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user