mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	now .browseActions(..) supports toggler state lists + fixed a couple of bugs...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									e957b10437
								
							
						
					
					
						commit
						eb58b33093
					
				| @ -215,8 +215,8 @@ function Action(name, doc, ldoc, func){ | |||||||
| 		var args = args2array(arguments) | 		var args = args2array(arguments) | ||||||
| 		var that = this | 		var that = this | ||||||
| 
 | 
 | ||||||
| 		var getHandlers = this.getHandlers | 		var getHandlers = this.getHandlers || MetaActions.getHandlers | ||||||
| 		getHandlers = getHandlers == null ? MetaActions.getHandlers : getHandlers | 		var isToggler = this.isToggler || MetaActions.isToggler | ||||||
| 
 | 
 | ||||||
| 		// get handlers...
 | 		// get handlers...
 | ||||||
| 		//
 | 		//
 | ||||||
| @ -232,7 +232,7 @@ function Action(name, doc, ldoc, func){ | |||||||
| 		// special case: if the root handler is a toggler and we call 
 | 		// special case: if the root handler is a toggler and we call 
 | ||||||
| 		// it with '?'/'??' then do not call the handlers...
 | 		// it with '?'/'??' then do not call the handlers...
 | ||||||
| 		// XXX might be good to make this modular/configurable...
 | 		// XXX might be good to make this modular/configurable...
 | ||||||
| 		if(handlers.slice(-1)[0] instanceof Toggler  | 		if(isToggler.call(this, name)//handlers.slice(-1)[0] instanceof Toggler 
 | ||||||
| 				&& args.length == 1  | 				&& args.length == 1  | ||||||
| 				&& (args[0] == '?' || args[0] == '??')){ | 				&& (args[0] == '?' || args[0] == '??')){ | ||||||
| 			return handlers.slice(-1)[0].apply(this, args) | 			return handlers.slice(-1)[0].apply(this, args) | ||||||
| @ -289,6 +289,7 @@ function Action(name, doc, ldoc, func){ | |||||||
| Action.prototype.__proto__ = Function | Action.prototype.__proto__ = Function | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| // A base action-set object...
 | // A base action-set object...
 | ||||||
| //
 | //
 | ||||||
| // This will define a set of action-set specific methods and helpers.
 | // This will define a set of action-set specific methods and helpers.
 | ||||||
| @ -405,6 +406,26 @@ module.MetaActions = { | |||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	// Test if the action is a Toggler...
 | ||||||
|  | 	//
 | ||||||
|  | 	// NOTE: an action is considered a toggler only if it's base action
 | ||||||
|  | 	// 		is a toggler (instance of Toggler), thus, the same "top"
 | ||||||
|  | 	// 		action can be or not be a toggler in different contexts.
 | ||||||
|  | 	//
 | ||||||
|  | 	// For more info on togglers see: lib/toggler.js
 | ||||||
|  | 	isToggler: function(name){ | ||||||
|  | 		var handlers = (this.getHandlers  | ||||||
|  | 				|| MetaActions.getHandlers) | ||||||
|  | 			.call(this, name) | ||||||
|  | 
 | ||||||
|  | 		if(handlers.slice(-1)[0] instanceof Toggler){ | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return false | ||||||
|  | 	}, | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	// Register an action callback...
 | 	// Register an action callback...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	//	Register a post action callback
 | 	//	Register a post action callback
 | ||||||
|  | |||||||
| @ -770,7 +770,7 @@ var BrowserPrototype = { | |||||||
| 				.click(function(){ | 				.click(function(){ | ||||||
| 					if(!$(this).hasClass('disabled')){ | 					if(!$(this).hasClass('disabled')){ | ||||||
| 						//that.push(quoteWS($(this).find('.text').text())) 
 | 						//that.push(quoteWS($(this).find('.text').text())) 
 | ||||||
| 						that.push($(this).find('.text').text()) | 						that.push('"'+ $(this).find('.text').text() +'"') | ||||||
| 					} | 					} | ||||||
| 				}) | 				}) | ||||||
| 				//.text(p)
 | 				//.text(p)
 | ||||||
| @ -795,7 +795,7 @@ var BrowserPrototype = { | |||||||
| 						: that.options.actionButton) | 						: that.options.actionButton) | ||||||
| 					.click(function(evt){ | 					.click(function(evt){ | ||||||
| 						evt.stopPropagation() | 						evt.stopPropagation() | ||||||
| 						that.select(p) | 						that.select('"'+ p +'"') | ||||||
| 						that.action() | 						that.action() | ||||||
| 					})) | 					})) | ||||||
| 			} | 			} | ||||||
| @ -808,7 +808,7 @@ var BrowserPrototype = { | |||||||
| 						: that.options.pushButton) | 						: that.options.pushButton) | ||||||
| 					.click(function(evt){ | 					.click(function(evt){ | ||||||
| 						evt.stopPropagation() | 						evt.stopPropagation() | ||||||
| 						that.push(p) | 						that.push('"'+ p +'"') | ||||||
| 					})) | 					})) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -1650,7 +1650,7 @@ var BrowserPrototype = { | |||||||
| 
 | 
 | ||||||
| 		var path = this.path | 		var path = this.path | ||||||
| 		//var txt = quoteWS(elem.find('.text').text())
 | 		//var txt = quoteWS(elem.find('.text').text())
 | ||||||
| 		var txt = elem.find('.text').text() | 		var txt = '"'+ elem.find('.text').text() +'"' | ||||||
| 		path.push(elem.find('.text').text()) | 		path.push(elem.find('.text').text()) | ||||||
| 
 | 
 | ||||||
| 		// XXX should this be before or after the actual path update???
 | 		// XXX should this be before or after the actual path update???
 | ||||||
| @ -1709,7 +1709,7 @@ var BrowserPrototype = { | |||||||
| 		var path = this.path | 		var path = this.path | ||||||
| 
 | 
 | ||||||
| 		//path.push(quoteWS(elem.find('.text').text()))
 | 		//path.push(quoteWS(elem.find('.text').text()))
 | ||||||
| 		path.push(elem.find('.text').text()) | 		path.push('"'+ elem.find('.text').text() +'"') | ||||||
| 
 | 
 | ||||||
| 		var res = this.open(path) | 		var res = this.open(path) | ||||||
| 
 | 
 | ||||||
| @ -1824,7 +1824,7 @@ var BrowserPrototype = { | |||||||
| 
 | 
 | ||||||
| 			// load the current path + selection...
 | 			// load the current path + selection...
 | ||||||
| 			path = this.path | 			path = this.path | ||||||
| 			path.push(elem.find('.text').text()) | 			path.push('"'+ elem.find('.text').text() +'"') | ||||||
| 
 | 
 | ||||||
| 		// normalize and load path...
 | 		// normalize and load path...
 | ||||||
| 		//} else {
 | 		//} else {
 | ||||||
| @ -1845,7 +1845,7 @@ var BrowserPrototype = { | |||||||
| 
 | 
 | ||||||
| 			path = this.path | 			path = this.path | ||||||
| 			//path.push(quoteWS(elem.find('.text').text()))
 | 			//path.push(quoteWS(elem.find('.text').text()))
 | ||||||
| 			path.push(elem.find('.text').text()) | 			path.push('"'+ elem.find('.text').text() +'"') | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// get the options method and call it if it exists...
 | 		// get the options method and call it if it exists...
 | ||||||
| @ -2248,7 +2248,8 @@ PathListPrototype.options = { | |||||||
| 
 | 
 | ||||||
| 		// get the '*' listers...
 | 		// get the '*' listers...
 | ||||||
| 		var lister = keys | 		var lister = keys | ||||||
| 			.filter(function(k){ return k.trim().slice(-1) == '*' }) | 			.filter(function(k){  | ||||||
|  | 				return k.trim().split(/[\\\/]+/g).pop() == '*' }) | ||||||
| 			.filter(function(k){ | 			.filter(function(k){ | ||||||
| 				k = k.split(/[\\\/]+/) | 				k = k.split(/[\\\/]+/) | ||||||
| 					// remove the trailing '*'...
 | 					// remove the trailing '*'...
 | ||||||
|  | |||||||
| @ -140,6 +140,25 @@ function makeTagWalker(direction, dfl_tag){ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | // NOTE: if not state is set this assumes that the first state is the 
 | ||||||
|  | // 		default...
 | ||||||
|  | var makeConfigToggler = function(attr, states){ | ||||||
|  | 	return Toggler(null, | ||||||
|  | 		function(_, action){ | ||||||
|  | 			var lst = states.constructor === Array ? states : states.call(this) | ||||||
|  | 
 | ||||||
|  | 			if(action == null){ | ||||||
|  | 				return this.config[attr] || lst[0] | ||||||
|  | 
 | ||||||
|  | 			} else { | ||||||
|  | 				this.config[attr] = action | ||||||
|  | 				this.focusImage() | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		states) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| 
 | 
 | ||||||
| @ -276,14 +295,16 @@ actions.Actions({ | |||||||
| 		// see .direction for details...
 | 		// see .direction for details...
 | ||||||
| 		'steps-to-change-direction': 3, | 		'steps-to-change-direction': 3, | ||||||
| 
 | 
 | ||||||
| 		// determines the image selection mode when focusing ribbons...
 | 		// Determines the image selection mode when focusing or moving 
 | ||||||
|  | 		// between ribbons...
 | ||||||
| 		//
 | 		//
 | ||||||
| 		// supported modes:
 | 		// supported modes:
 | ||||||
| 		// 	'order'		- select image closest to current in order
 | 		'ribbon-focus-modes': [ | ||||||
| 		// 	'first'		- select first image
 | 			'visual',	// select image closest visually
 | ||||||
| 		// 	'last'		- select last image
 | 			'order',	// select image closest to current in order
 | ||||||
| 		// 	'visual'	- select image closest visually
 | 			'first',	// select first image
 | ||||||
| 		//'ribbon-focus-mode': 'order',
 | 			'last',		// select last image
 | ||||||
|  | 		], | ||||||
| 		'ribbon-focus-mode': 'visual', | 		'ribbon-focus-mode': 'visual', | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| @ -363,6 +384,11 @@ actions.Actions({ | |||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | 	toggleRibbonFocusMode : ['Interface/Toggle ribbon focus mode', | ||||||
|  | 		makeConfigToggler('ribbon-focus-mode',  | ||||||
|  | 			function(){ return this.config['ribbon-focus-modes'] })], | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	// basic life-cycle actions...
 | 	// basic life-cycle actions...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX do we need to call .syncTags(..) here???
 | 	// XXX do we need to call .syncTags(..) here???
 | ||||||
| @ -1600,9 +1626,34 @@ module.Viewer = ImageGridFeatures.Feature({ | |||||||
| 	handlers: [ | 	handlers: [ | ||||||
| 		['start', | 		['start', | ||||||
| 			function(){ | 			function(){ | ||||||
|  | 				var that = this | ||||||
|  | 
 | ||||||
| 				if(this.config.theme){ | 				if(this.config.theme){ | ||||||
| 					this.toggleTheme(this.config.theme) | 					this.toggleTheme(this.config.theme) | ||||||
| 				} | 				} | ||||||
|  | 
 | ||||||
|  | 				if(!this.__viewer_resize){ | ||||||
|  | 					this.__viewer_resize = function(){ | ||||||
|  | 						if(that.__centering_on_resize){ | ||||||
|  | 							return | ||||||
|  | 						} | ||||||
|  | 						// this will prevent centering calls from overlapping...
 | ||||||
|  | 						that.__centering_on_resize = true | ||||||
|  | 
 | ||||||
|  | 						that.centerViewer() | ||||||
|  | 
 | ||||||
|  | 						delete that.__centering_on_resize | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					$(window).resize(this.__viewer_resize) | ||||||
|  | 				} | ||||||
|  | 			}], | ||||||
|  | 		['stop',  | ||||||
|  | 			function(){ | ||||||
|  | 				if(that.__viewer_resize){ | ||||||
|  | 					$(window).off('resize', that.__viewer_resize)  | ||||||
|  | 					delete that.__viewer_resize | ||||||
|  | 				} | ||||||
| 			}], | 			}], | ||||||
| 	], | 	], | ||||||
| }) | }) | ||||||
| @ -2604,6 +2655,7 @@ module.SingleImageViewLocalStorage = ImageGridFeatures.Feature({ | |||||||
| //---------------------------------------------------------------------
 | //---------------------------------------------------------------------
 | ||||||
| // These feature glue traverse and ribbon alignment...
 | // These feature glue traverse and ribbon alignment...
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| // XXX manual align needs more work...
 | // XXX manual align needs more work...
 | ||||||
| var AutoAlignRibbons =  | var AutoAlignRibbons =  | ||||||
| module.AutoAlignRibbons = ImageGridFeatures.Feature({ | module.AutoAlignRibbons = ImageGridFeatures.Feature({ | ||||||
| @ -2615,25 +2667,27 @@ module.AutoAlignRibbons = ImageGridFeatures.Feature({ | |||||||
| 	exclusive: ['ui-ribbon-align'], | 	exclusive: ['ui-ribbon-align'], | ||||||
| 
 | 
 | ||||||
| 	config: { | 	config: { | ||||||
| 		// Control image selection and optionally ribbon alignment...
 |  | ||||||
| 		//
 |  | ||||||
| 		// NOTE: this only supports the following modes:
 |  | ||||||
| 		// 		- 'visual'
 |  | ||||||
| 		// 		- 'order'
 |  | ||||||
| 		// 		- 'fisrt'
 |  | ||||||
| 		// 		- 'manual'
 |  | ||||||
| 		// NOTE: if 'ribbon-align-mode' is not null this can be set to 
 |  | ||||||
| 		// 		any mode without restriction.
 |  | ||||||
| 		//'ribbon-focus-mode': 'order',
 |  | ||||||
| 		'ribbon-focus-mode': 'visual', |  | ||||||
| 		 |  | ||||||
| 		// control ribbon alignment...
 | 		// control ribbon alignment...
 | ||||||
| 		//
 | 		//
 | ||||||
| 		// NOTE: when this is null then 'ribbon-focus-mode' will be used...
 | 		// NOTE: when this is null then 'ribbon-focus-mode' will be used...
 | ||||||
| 		// NOTE: this supports the same modes as 'ribbon-focus-mode'...
 | 		// NOTE: this supports the same modes as 'ribbon-focus-mode'...
 | ||||||
|  | 		'ribbon-align-modes': [ | ||||||
|  | 			'none',		// use .config['ribbon-focus-mode']'s value
 | ||||||
|  | 			'visual', | ||||||
|  | 			'order', | ||||||
|  | 			'first', | ||||||
|  | 			//'last',
 | ||||||
|  | 			'manual', | ||||||
|  | 		], | ||||||
| 		'ribbon-align-mode': null, | 		'ribbon-align-mode': null, | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | 	actions: actions.Actions({ | ||||||
|  | 		toggleRibbonAlignMode : ['Interface/Toggle ribbon align mode', | ||||||
|  | 			makeConfigToggler('ribbon-align-mode',  | ||||||
|  | 				function(){ return this.config['ribbon-align-modes'] })], | ||||||
|  | 	}), | ||||||
|  | 
 | ||||||
| 	handlers: [ | 	handlers: [ | ||||||
| 		['focusImage.post',  | 		['focusImage.post',  | ||||||
| 			function(){  | 			function(){  | ||||||
| @ -3334,6 +3388,24 @@ var makeActionLister = function(list, filter, pre_order){ | |||||||
| 					return res | 					return res | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			// toggler -- add state list...
 | ||||||
|  | 			if(that.isToggler && that.isToggler(n)){ | ||||||
|  | 				var states = that[n]('??') | ||||||
|  | 				var cur = that[n]('?') | ||||||
|  | 
 | ||||||
|  | 				// bool toggler...
 | ||||||
|  | 				if(cur == 'on' || cur == 'off'){ | ||||||
|  | 					states = ['off', 'on'] | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				states.forEach(function(state){ | ||||||
|  | 					actions[k +'/'+ state + (cur == state ? ' *': '')] = | ||||||
|  | 						function(){  | ||||||
|  | 							that[n](state)  | ||||||
|  | 						} | ||||||
|  | 				}) | ||||||
|  | 			} | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
| 		var config = Object.create(that.config['browse-actions-settings'] || {}) | 		var config = Object.create(that.config['browse-actions-settings'] || {}) | ||||||
| @ -3400,13 +3472,13 @@ var ActionTreeActions = actions.Actions({ | |||||||
| 			})], | 			})], | ||||||
| 
 | 
 | ||||||
| 	// XXX this is just a test...
 | 	// XXX this is just a test...
 | ||||||
| 	embededListerTest: ['Interface|Test/Lister test (embeded)/*', | 	embededListerTest: ['Test/Lister test (embeded)/*', | ||||||
| 		function(path, make){ | 		function(path, make){ | ||||||
| 			make('a/') | 			make('a/') | ||||||
| 			make('b/') | 			make('b/') | ||||||
| 			make('c/') | 			make('c/') | ||||||
| 		}], | 		}], | ||||||
| 	floatingListerTest: ['Interface|Test/Lister test (floating)...', | 	floatingListerTest: ['Test/Lister test (floating)...', | ||||||
| 		function(path){ | 		function(path){ | ||||||
| 			var parent = this.preventClosing ? this.preventClosing() : null | 			var parent = this.preventClosing ? this.preventClosing() : null | ||||||
| 
 | 
 | ||||||
| @ -3448,7 +3520,7 @@ var ActionTreeActions = actions.Actions({ | |||||||
| 					}) | 					}) | ||||||
| 		}], | 		}], | ||||||
| 	// XXX use this.ribbons.viewer as base...
 | 	// XXX use this.ribbons.viewer as base...
 | ||||||
| 	drawerTest: ['Interface|Test/Drawer widget test', | 	drawerTest: ['Test/Drawer widget test', | ||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX use this.ribbons.viewer as base...
 | 			// XXX use this.ribbons.viewer as base...
 | ||||||
| 			drawer.Drawer($('body'),  | 			drawer.Drawer($('body'),  | ||||||
| @ -3472,7 +3544,7 @@ var ActionTreeActions = actions.Actions({ | |||||||
| 	// XXX use this.ribbons.viewer as base...
 | 	// XXX use this.ribbons.viewer as base...
 | ||||||
| 	// XXX BUG: when using this.ribbons.viewer as base some actions leak
 | 	// XXX BUG: when using this.ribbons.viewer as base some actions leak
 | ||||||
| 	// 		between the two viewers...
 | 	// 		between the two viewers...
 | ||||||
| 	showTaggedInDrawer: ['Interface|Test/Show tagged in drawer', | 	showTaggedInDrawer: ['- Test/Show tagged in drawer', | ||||||
| 		function(tag){ | 		function(tag){ | ||||||
| 			tag = tag || 'bookmark' | 			tag = tag || 'bookmark' | ||||||
| 			var that = this | 			var that = this | ||||||
| @ -3584,9 +3656,9 @@ var ActionTreeActions = actions.Actions({ | |||||||
| 
 | 
 | ||||||
| 			return b | 			return b | ||||||
| 		}], | 		}], | ||||||
| 	showBookmarkedInDrawer: ['Interface|Test/Show bookmarked in drawer', | 	showBookmarkedInDrawer: ['Test/Show bookmarked in drawer', | ||||||
| 		function(){ this.showTaggedInDrawer('bookmark') }], | 		function(){ this.showTaggedInDrawer('bookmark') }], | ||||||
| 	showSelectedInDrawer: ['Interface|Test/Show selected in drawer', | 	showSelectedInDrawer: ['Test/Show selected in drawer', | ||||||
| 		function(){ this.showTaggedInDrawer('selected') }], | 		function(){ this.showTaggedInDrawer('selected') }], | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| @ -3886,6 +3958,8 @@ var AppControlActions = actions.Actions({ | |||||||
| 		function(){ | 		function(){ | ||||||
| 			// XXX where should toggleFullscreenMode(..) be defined...
 | 			// XXX where should toggleFullscreenMode(..) be defined...
 | ||||||
| 			toggleFullscreenMode()  | 			toggleFullscreenMode()  | ||||||
|  | 
 | ||||||
|  | 			this.centerViewer() | ||||||
| 		}], | 		}], | ||||||
| 	showDevTools: ['Interface|Development/Show Dev Tools', | 	showDevTools: ['Interface|Development/Show Dev Tools', | ||||||
| 		function(){ | 		function(){ | ||||||
| @ -3933,20 +4007,6 @@ module.AppControl = ImageGridFeatures.Feature({ | |||||||
| 				// XXX
 | 				// XXX
 | ||||||
| 
 | 
 | ||||||
| 				win.show() | 				win.show() | ||||||
| 
 |  | ||||||
| 				// XXX not sure if this should be here...
 |  | ||||||
| 				var that = this |  | ||||||
| 				$(window).resize(function(){ |  | ||||||
| 					if(that.__centering_on_resize){ |  | ||||||
| 						return |  | ||||||
| 					} |  | ||||||
| 					// this will prevent centering calls from overlapping...
 |  | ||||||
| 					that.__centering_on_resize = true |  | ||||||
| 
 |  | ||||||
| 					that.centerViewer() |  | ||||||
| 
 |  | ||||||
| 					delete that.__centering_on_resize |  | ||||||
| 				}) |  | ||||||
| 			}], | 			}], | ||||||
| 		['focusImage', | 		['focusImage', | ||||||
| 			function(){ | 			function(){ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user