mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	started making editor components modular and generic...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									261a8690f4
								
							
						
					
					
						commit
						b5011ffaa5
					
				| @ -1168,6 +1168,31 @@ var FileSystemWriterUIActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 	// Export dialog...
 | 	// Export dialog...
 | ||||||
| 	//
 | 	//
 | ||||||
|  | 	// Export <mode> is set by:
 | ||||||
|  | 	// 		.config['export-mode']
 | ||||||
|  | 	//
 | ||||||
|  | 	// The fields used and their order is determined by:
 | ||||||
|  | 	// 		.config['export-modes'][<mode>].data	(list)
 | ||||||
|  | 	//
 | ||||||
|  | 	// The action used to export is determined by:
 | ||||||
|  | 	// 		.config['export-modes'][<mode>].action
 | ||||||
|  | 	//
 | ||||||
|  | 	//
 | ||||||
|  | 	// Dialog fields...
 | ||||||
|  | 	//
 | ||||||
|  | 	// Format:
 | ||||||
|  | 	// 	{
 | ||||||
|  | 	// 		// Arguments:
 | ||||||
|  | 	// 		//	actions		- the actions object
 | ||||||
|  | 	// 		//	make		- browse item constructor 
 | ||||||
|  | 	// 		//					(see: browse.Browser.update(..) for more info)
 | ||||||
|  | 	// 		//	overlay		- the containing overlay object
 | ||||||
|  | 	// 		<key>: function(actions, make, overlay){ ... },
 | ||||||
|  | 	// 		...
 | ||||||
|  | 	// 	}
 | ||||||
|  | 	//
 | ||||||
|  | 	// NOTE: .__export_dialog_fields__ can be defined both in the feature
 | ||||||
|  | 	// 		as well as in the instance.
 | ||||||
| 	__export_dialog_fields__: { | 	__export_dialog_fields__: { | ||||||
| 		'pattern': function(actions, make, overlay){ | 		'pattern': function(actions, make, overlay){ | ||||||
| 			return make(['Filename pattern: ',  | 			return make(['Filename pattern: ',  | ||||||
| @ -1201,7 +1226,7 @@ var FileSystemWriterUIActions = actions.Actions({ | |||||||
| 		// XXX make this editable on open and remove "new" from history...
 | 		// XXX make this editable on open and remove "new" from history...
 | ||||||
| 		// XXX add "history" button...
 | 		// XXX add "history" button...
 | ||||||
| 		'target_dir': function(actions, make, overlay){ | 		'target_dir': function(actions, make, overlay){ | ||||||
| 			return make(['To: ',  | 			var elem = make(['To: ',  | ||||||
| 				function(){ return actions.config['export-path'] || './' }],  | 				function(){ return actions.config['export-path'] || './' }],  | ||||||
| 				{ buttons: [ | 				{ buttons: [ | ||||||
| 					['browse', function(p){ | 					['browse', function(p){ | ||||||
| @ -1232,14 +1257,28 @@ var FileSystemWriterUIActions = actions.Actions({ | |||||||
| 						})], | 						})], | ||||||
| 				]}) | 				]}) | ||||||
| 				// XXX make this editable???
 | 				// XXX make this editable???
 | ||||||
| 				.on('open',  | 				.on('open', function(){ | ||||||
| 					widgets.makeNestedConfigListEditor(actions, overlay, | 					event.preventDefault() | ||||||
| 						'export-paths', | 
 | ||||||
| 						'export-path', | 					var path = elem.find('.text').last() | ||||||
| 						{ | 						.makeEditable({ | ||||||
| 							// XXX add 'edit' button...
 | 							clear_on_edit: false, | ||||||
| 							//itemButtons: []
 | 							abort_keys: [ | ||||||
| 						})) | 								'Esc', | ||||||
|  | 							], | ||||||
|  | 						}) | ||||||
|  | 						.on('edit-done', function(_, path){ | ||||||
|  | 							actions.config['export-path'] = path | ||||||
|  | 							actions.config['export-paths'].splice(0, 0, path) | ||||||
|  | 
 | ||||||
|  | 						}) | ||||||
|  | 						.on('edit-aborted edit-done', function(evt, path){ | ||||||
|  | 							overlay.client.update() | ||||||
|  | 								.then(function(){ | ||||||
|  | 									overlay.client.select(path) | ||||||
|  | 								}) | ||||||
|  | 						}) | ||||||
|  | 				}) | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 	// XXX indicate export state: index, crop, image...
 | 	// XXX indicate export state: index, crop, image...
 | ||||||
| @ -1280,9 +1319,10 @@ var FileSystemWriterUIActions = actions.Actions({ | |||||||
| 							// XXX indicate export state: index, crop, image...
 | 							// XXX indicate export state: index, crop, image...
 | ||||||
| 							return 'Export'}])  | 							return 'Export'}])  | ||||||
| 						.on('open', function(){ | 						.on('open', function(){ | ||||||
|  | 							var mode = that.config['export-dialog-modes'][that.config['export-dialog-mode']] | ||||||
| 							// XXX is this correct???
 | 							// XXX is this correct???
 | ||||||
| 							// XXX handle relative paths!!!
 | 							// XXX handle relative paths!!!
 | ||||||
| 							that[that.config['export-mode'].action]( | 							that[mode.action]( | ||||||
| 								that.config['export-path'] || that.location.path) | 								that.config['export-path'] || that.location.path) | ||||||
| 							o.close() | 							o.close() | ||||||
| 						}) | 						}) | ||||||
|  | |||||||
| @ -69,79 +69,67 @@ function(actions, list_key, options){ | |||||||
| 	new_button = new_button === true ? 'New...' : new_button | 	new_button = new_button === true ? 'New...' : new_button | ||||||
| 
 | 
 | ||||||
| 	var _makeEditable = function(elem){ | 	var _makeEditable = function(elem){ | ||||||
| 		$(elem).find('.text') | 		return $(elem).find('.text') | ||||||
| 			.prop('contenteditable', true) | 			.makeEditable() | ||||||
| 			.text('') | 			.on('edit-aborted', function(){ | ||||||
| 			.selectText() | 				list.update() | ||||||
| 			.keydown(function(){  | 			}) | ||||||
| 				event.stopPropagation()  | 			.on('edit-done', function(evt, text){ | ||||||
| 
 | 				var txt = $(this).text() | ||||||
| 				var n = keyboard.toKeyName(event.keyCode) | 
 | ||||||
| 
 | 				// invalid format...
 | ||||||
| 				// reset to original value...
 | 				if(options.check && !options.check(txt)){ | ||||||
| 				if(n == 'Esc'){ | 					list.update() | ||||||
| 					list.update() | 					return | ||||||
| 
 | 				} | ||||||
| 				// save value...
 | 
 | ||||||
| 				} else if(n == 'Enter'){ | 				// list length limit
 | ||||||
| 					event.preventDefault() | 				if(options.length_limit  | ||||||
| 					var txt = $(this).text() | 					&& (lst.length >= options.length_limit)){ | ||||||
| 
 | 
 | ||||||
| 					// invalid format...
 | 					options.callback && options.callback.call(list, txt) | ||||||
| 					if(options.check && !options.check(txt)){ | 
 | ||||||
| 						list.update() | 					return | ||||||
| 						return | 				} | ||||||
| 					} | 
 | ||||||
| 
 | 				// prevent editing non-arrays...
 | ||||||
| 					// list length limit
 | 				if(!(actions.config[list_key] instanceof Array)){ | ||||||
| 					if(options.length_limit  | 					return | ||||||
| 						&& (lst.length >= options.length_limit)){ | 				} | ||||||
| 
 | 
 | ||||||
| 						options.callback && options.callback.call(list, txt) | 				// save the new version...
 | ||||||
| 
 | 				actions.config[list_key] = actions.config[list_key].slice() | ||||||
| 						return | 				// add new value and sort list...
 | ||||||
| 					} | 				actions.config[list_key] | ||||||
| 
 | 					.push(txt) | ||||||
| 					// prevent editing non-arrays...
 | 
 | ||||||
| 					if(!(actions.config[list_key] instanceof Array)){ | 				// unique...
 | ||||||
| 						return | 				if(options.unique == null || options.unique){ | ||||||
| 					} | 					actions.config[list_key] = actions.config[list_key] | ||||||
| 
 | 						.unique(typeof(options.unique) == typeof(function(){}) ? | ||||||
| 					// save the new version...
 | 							options.unique  | ||||||
| 					actions.config[list_key] = actions.config[list_key].slice() | 							: undefined) | ||||||
| 					// add new value and sort list...
 | 				} | ||||||
| 					actions.config[list_key] | 
 | ||||||
| 						.push(txt) | 				// sort...
 | ||||||
| 
 | 				if(options.sort){ | ||||||
| 					// unique...
 | 					actions.config[list_key] = actions.config[list_key] | ||||||
| 					if(options.unique == null || options.unique){ | 						.sort(typeof(options.sort) == typeof(function(){}) ?  | ||||||
| 						actions.config[list_key] = actions.config[list_key] | 							options.sort  | ||||||
| 							.unique(typeof(options.unique) == typeof(function(){}) ? | 							: undefined) | ||||||
| 								options.unique  | 				} | ||||||
| 								: undefined) | 
 | ||||||
| 					} | 				// update the list data...
 | ||||||
| 
 | 				list.options.data  | ||||||
| 					// sort...
 | 					= actions.config[list_key] | ||||||
| 					if(options.sort){ | 						.concat(new_button ? [ new_button ] : []) | ||||||
| 						actions.config[list_key] = actions.config[list_key] | 
 | ||||||
| 							.sort(typeof(options.sort) == typeof(function(){}) ?  | 				// update list and select new value...
 | ||||||
| 								options.sort  | 				list.update() | ||||||
| 								: undefined) | 					.done(function(){ | ||||||
| 					} | 						list.select('"'+txt+'"') | ||||||
| 
 | 					}) | ||||||
| 					// update the list data...
 |  | ||||||
| 					list.options.data  |  | ||||||
| 						= actions.config[list_key] |  | ||||||
| 							.concat(new_button ? [ new_button ] : []) |  | ||||||
| 
 |  | ||||||
| 					// update list and select new value...
 |  | ||||||
| 					list.update() |  | ||||||
| 						.done(function(){ |  | ||||||
| 							list.select('"'+txt+'"') |  | ||||||
| 						}) |  | ||||||
| 				} |  | ||||||
| 			}) | 			}) | ||||||
| 		return $(elem) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var to_remove = [] | 	var to_remove = [] | ||||||
| @ -177,6 +165,13 @@ function(actions, list_key, options){ | |||||||
| 				_makeEditable(elem) | 				_makeEditable(elem) | ||||||
| 			} | 			} | ||||||
| 		}) | 		}) | ||||||
|  | 		// restore striked-out items...
 | ||||||
|  | 		.on('update', function(){ | ||||||
|  | 			to_remove.forEach(function(e){ | ||||||
|  | 				list.filter('"'+ e +'"') | ||||||
|  | 					.toggleClass('strike-out') | ||||||
|  | 			}) | ||||||
|  | 		}) | ||||||
| 		.open(function(evt, path){ | 		.open(function(evt, path){ | ||||||
| 			// we clicked the 'New' button -- select it...
 | 			// we clicked the 'New' button -- select it...
 | ||||||
| 			if(new_button && (path == new_button || path == '')){ | 			if(new_button && (path == new_button || path == '')){ | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ define(function(require){ var module = {} | |||||||
| //var DEBUG = DEBUG != null ? DEBUG : true
 | //var DEBUG = DEBUG != null ? DEBUG : true
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| 
 | 
 | ||||||
| String.prototype.capitalize = function(){ | String.prototype.capitalize = function(){ | ||||||
| @ -220,6 +221,7 @@ if(typeof(jQuery) != typeof(undefined)){ | |||||||
| 			}) | 			}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	jQuery.fn.selectText = function(){ | 	jQuery.fn.selectText = function(){ | ||||||
| 		var range = document.createRange() | 		var range = document.createRange() | ||||||
| 
 | 
 | ||||||
| @ -235,6 +237,84 @@ if(typeof(jQuery) != typeof(undefined)){ | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	var keyboard = require('lib/keyboard') | ||||||
|  | 
 | ||||||
|  | 	// Make element editable...
 | ||||||
|  | 	//
 | ||||||
|  | 	// Options format:
 | ||||||
|  | 	// 	{
 | ||||||
|  | 	// 		multiline: false,
 | ||||||
|  | 	//
 | ||||||
|  | 	// 		reset_on_abort: true,
 | ||||||
|  | 	// 		clear_on_edit: true,
 | ||||||
|  | 	//
 | ||||||
|  | 	// 		abort_keys: [
 | ||||||
|  | 	// 			'Esc',
 | ||||||
|  | 	// 			...
 | ||||||
|  | 	// 		],
 | ||||||
|  | 	// 	}
 | ||||||
|  | 	//
 | ||||||
|  | 	// XXX should we just use form elements???
 | ||||||
|  | 	// 		...it's a trade-off, here we add editing functionality and fight
 | ||||||
|  | 	// 		a bit the original function, in an input we'll need to fight part
 | ||||||
|  | 	// 		of the editing functionality and add our own navigation...
 | ||||||
|  | 	// XXX move this to a more generic spot...
 | ||||||
|  | 	jQuery.fn.makeEditable = function(options){ | ||||||
|  | 		options = options || {} | ||||||
|  | 		var that = this | ||||||
|  | 
 | ||||||
|  | 		var original = this.text() | ||||||
|  | 
 | ||||||
|  | 		if(options.clear_on_edit == null || options.clear_on_edit){ | ||||||
|  | 			this.text('') | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		this | ||||||
|  | 			.prop('contenteditable', true) | ||||||
|  | 			// make the element focusable and selectable...
 | ||||||
|  | 			.attr('tabindex', '0') | ||||||
|  | 			// NOTE: this will also focus the element...
 | ||||||
|  | 			.selectText() | ||||||
|  | 			.keydown(function(){  | ||||||
|  | 				if(!that.prop('contenteditable')){ | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				event.stopPropagation()  | ||||||
|  | 
 | ||||||
|  | 				var n = keyboard.toKeyName(event.keyCode) | ||||||
|  | 
 | ||||||
|  | 				// abort...
 | ||||||
|  | 				if((options.abort_keys || ['Esc']).indexOf(n) >= 0){ | ||||||
|  | 					// reset original value...
 | ||||||
|  | 					(options.reset_on_abort == null || options.reset_on_abort)  | ||||||
|  | 						&& that.text(original) | ||||||
|  | 
 | ||||||
|  | 					that | ||||||
|  | 						.trigger('edit-aborted', original) | ||||||
|  | 
 | ||||||
|  | 				// done -- single line...
 | ||||||
|  | 				} else if(n == 'Enter'  | ||||||
|  | 						&& !options.multiline){ | ||||||
|  | 					event.preventDefault() | ||||||
|  | 
 | ||||||
|  | 					that.trigger('edit-done', that.text()) | ||||||
|  | 
 | ||||||
|  | 				// done -- multiline...
 | ||||||
|  | 				} else if(n == 'Enter'  | ||||||
|  | 						&& (event.ctrlKey || event.metaKey)  | ||||||
|  | 						&& options.multiline){ | ||||||
|  | 					event.preventDefault() | ||||||
|  | 
 | ||||||
|  | 					that.trigger('edit-done', that.text()) | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
|  | 
 | ||||||
|  | 		return this | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user