mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-04 13:20:10 +00:00 
			
		
		
		
	revised focus handling + long path scrolling...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									4501fb7835
								
							
						
					
					
						commit
						ea3c497b69
					
				@ -40,7 +40,19 @@
 | 
				
			|||||||
	white-space: nowrap;
 | 
						white-space: nowrap;
 | 
				
			||||||
	padding-right: 30px;
 | 
						padding-right: 30px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opacity: 0.8;
 | 
					
 | 
				
			||||||
 | 
						/* XXX need a way to make this automatic and depend on .browser 
 | 
				
			||||||
 | 
							setup to avoid multiple scrollbars and the need to manually
 | 
				
			||||||
 | 
						 	dive into the configuration to change the container size 
 | 
				
			||||||
 | 
							limits
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						max-width: 50vh;
 | 
				
			||||||
 | 
						overflow: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/* XXX not sure about this... */
 | 
				
			||||||
 | 
					.browse .path::-webkit-scrollbar {
 | 
				
			||||||
 | 
						width: 5px;
 | 
				
			||||||
 | 
						height: 5px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.browse .path:hover {
 | 
					.browse .path:hover {
 | 
				
			||||||
	opacity: 1;
 | 
						opacity: 1;
 | 
				
			||||||
@ -48,12 +60,14 @@
 | 
				
			|||||||
.browse .path:empty {
 | 
					.browse .path:empty {
 | 
				
			||||||
	display: block;
 | 
						display: block;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.browse:not(.flat) .path:before {
 | 
					.browse:not(.flat) .path:not([contenteditable]):before {
 | 
				
			||||||
	content: "/";
 | 
						content: "/";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.browse .path .dir {
 | 
					.browse .path .dir {
 | 
				
			||||||
	display: inline-block;
 | 
						display: inline-block;
 | 
				
			||||||
	cursor: pointer;
 | 
						cursor: pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						opacity: 0.8;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.browse .path .dir:after {
 | 
					.browse .path .dir:after {
 | 
				
			||||||
	content: "/";
 | 
						content: "/";
 | 
				
			||||||
@ -97,9 +111,9 @@
 | 
				
			|||||||
/* XXX need to make this resizable up but only to a certain size (~80vh) */
 | 
					/* XXX need to make this resizable up but only to a certain size (~80vh) */
 | 
				
			||||||
.browse .list {
 | 
					.browse .list {
 | 
				
			||||||
	/* XXX need a way to make this automatic and depend on .browser 
 | 
						/* XXX need a way to make this automatic and depend on .browser 
 | 
				
			||||||
			setup to avoid multiple scrollbars and the need to manually
 | 
							setup to avoid multiple scrollbars and the need to manually
 | 
				
			||||||
	 		dive into the configuration to change the container size 
 | 
						 	dive into the configuration to change the container size 
 | 
				
			||||||
			limits
 | 
							limits
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
	max-height: 50vh;
 | 
						max-height: 50vh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,6 +132,15 @@
 | 
				
			|||||||
	cursor: pointer;
 | 
						cursor: pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opacity: 0.7;
 | 
						opacity: 0.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* XXX need a way to make this automatic and depend on .browser 
 | 
				
			||||||
 | 
							setup to avoid multiple scrollbars and the need to manually
 | 
				
			||||||
 | 
						 	dive into the configuration to change the container size 
 | 
				
			||||||
 | 
							limits
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						max-width: 50vh;
 | 
				
			||||||
 | 
						overflow: hidden;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.browse:not(.flat) .list div:not(.not-traversable):after {
 | 
					.browse:not(.flat) .list div:not(.not-traversable):after {
 | 
				
			||||||
	content: "/";
 | 
						content: "/";
 | 
				
			||||||
 | 
				
			|||||||
@ -100,6 +100,7 @@ var BrowserPrototype = {
 | 
				
			|||||||
		filter: true,
 | 
							filter: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Enable/disable full path editing...
 | 
							// Enable/disable full path editing...
 | 
				
			||||||
 | 
							// NOTE: as with .filter above, this only affects .startFullPathEdit(..)
 | 
				
			||||||
		fullpathedit: true,
 | 
							fullpathedit: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// If false will disable traversal...
 | 
							// If false will disable traversal...
 | 
				
			||||||
@ -145,7 +146,6 @@ var BrowserPrototype = {
 | 
				
			|||||||
			Esc: 'abortFullPathEdit!',
 | 
								Esc: 'abortFullPathEdit!',
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// filter mappings...
 | 
					 | 
				
			||||||
		Filter: {
 | 
							Filter: {
 | 
				
			||||||
			pattern: '.browse .path div.cur[contenteditable]',
 | 
								pattern: '.browse .path div.cur[contenteditable]',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -336,6 +336,8 @@ var BrowserPrototype = {
 | 
				
			|||||||
	// 		value to the html attr will not affect the actual path.
 | 
						// 		value to the html attr will not affect the actual path.
 | 
				
			||||||
	// NOTE: .path = <some-path> is equivalent to .update(<some-path>)
 | 
						// NOTE: .path = <some-path> is equivalent to .update(<some-path>)
 | 
				
			||||||
	// 		both exist at the same time to enable chaining...
 | 
						// 		both exist at the same time to enable chaining...
 | 
				
			||||||
 | 
						// NOTE: this will scroll the path to show the last element for paths
 | 
				
			||||||
 | 
						// 		that do not fit in view...
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// XXX need a way to handle path errors in the extension API...
 | 
						// XXX need a way to handle path errors in the extension API...
 | 
				
			||||||
	// 		...for example, if .list(..) can't list or lists a different
 | 
						// 		...for example, if .list(..) can't list or lists a different
 | 
				
			||||||
@ -346,6 +348,7 @@ var BrowserPrototype = {
 | 
				
			|||||||
		path = path || this.path
 | 
							path = path || this.path
 | 
				
			||||||
		var browser = this.dom
 | 
							var browser = this.dom
 | 
				
			||||||
		var that = this
 | 
							var that = this
 | 
				
			||||||
 | 
							var focus = browser.find(':focus').length > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// normalize path...
 | 
							// normalize path...
 | 
				
			||||||
		path = this.path2lst(path)
 | 
							path = this.path2lst(path)
 | 
				
			||||||
@ -410,14 +413,27 @@ var BrowserPrototype = {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}))
 | 
								}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// handle path scroll..
 | 
				
			||||||
 | 
							var e = p.children().last()
 | 
				
			||||||
 | 
							// scroll to the end when wider than view...
 | 
				
			||||||
 | 
							if(e.length > 0 && p.width() < p[0].scrollWidth){
 | 
				
			||||||
 | 
								// scroll all the way to the right...
 | 
				
			||||||
 | 
								p.scrollLeft(p[0].scrollWidth)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// keep left aligned...
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								p.scrollLeft(0)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// fill the children list...
 | 
							// fill the children list...
 | 
				
			||||||
		var interactive = false
 | 
							var interactive = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var make = function(p){
 | 
							var make = function(p){
 | 
				
			||||||
			interactive = true
 | 
								interactive = true
 | 
				
			||||||
			return $('<div>')
 | 
								return $('<div>')
 | 
				
			||||||
 | 
									// handle clicks ONLY when not disabled...
 | 
				
			||||||
				.click(function(){
 | 
									.click(function(){
 | 
				
			||||||
					// handle clicks ONLY when not disabled...
 | 
					 | 
				
			||||||
					if(!$(this).hasClass('disabled')){
 | 
										if(!$(this).hasClass('disabled')){
 | 
				
			||||||
						that.push($(this).text()) 
 | 
											that.push($(this).text()) 
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@ -435,6 +451,11 @@ var BrowserPrototype = {
 | 
				
			|||||||
		this.dom.attr('path', '/' + this.path.join('/'))
 | 
							this.dom.attr('path', '/' + this.path.join('/'))
 | 
				
			||||||
		this.trigger('update')
 | 
							this.trigger('update')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// maintain focus within the widget...
 | 
				
			||||||
 | 
							if(focus && browser.find(':focus').length == 0){
 | 
				
			||||||
 | 
								this.focus()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return this
 | 
							return this
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -587,15 +608,19 @@ var BrowserPrototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// internal actions...
 | 
						// internal actions...
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// XXX full path editing...
 | 
						// full path editing...
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// NOTE: the event handlers for this are set in .__init__()...
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
	// XXX should these be a toggle???
 | 
						// XXX should these be a toggle???
 | 
				
			||||||
	startFullPathEdit: function(){
 | 
						startFullPathEdit: function(){
 | 
				
			||||||
		if(this.options.fullpathedit){
 | 
							if(this.options.fullpathedit){
 | 
				
			||||||
			var browser = this.dom
 | 
								var browser = this.dom
 | 
				
			||||||
			var path = this.path.join('/')
 | 
								var path = '/' + this.path.join('/')
 | 
				
			||||||
 | 
								var orig = this.select('!').text()
 | 
				
			||||||
			browser
 | 
								browser
 | 
				
			||||||
				.attr('orig-path', path)
 | 
									.attr('orig-path', path)
 | 
				
			||||||
				.attr('orig-selection', this.select('!').text())
 | 
									.attr('orig-selection', orig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			var range = document.createRange()
 | 
								var range = document.createRange()
 | 
				
			||||||
			var selection = window.getSelection()
 | 
								var selection = window.getSelection()
 | 
				
			||||||
@ -634,12 +659,17 @@ var BrowserPrototype = {
 | 
				
			|||||||
		var e = browser.find('.path')
 | 
							var e = browser.find('.path')
 | 
				
			||||||
			.removeAttr('contenteditable')
 | 
								.removeAttr('contenteditable')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this.path = path || '/' + e.text()
 | 
							this.path = path || e.text()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return this.focus()
 | 
							return this
 | 
				
			||||||
 | 
								.focus()
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						// path filtering...
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
	// NOTE: this uses .filter(..) for actual filtering...
 | 
						// NOTE: this uses .filter(..) for actual filtering...
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// XXX add support for '/' in filter...
 | 
				
			||||||
	// XXX revise API -- seems a bit overcomplicated...
 | 
						// XXX revise API -- seems a bit overcomplicated...
 | 
				
			||||||
	showFiltered: function(pattern){
 | 
						showFiltered: function(pattern){
 | 
				
			||||||
		var that = this
 | 
							var that = this
 | 
				
			||||||
@ -708,8 +738,6 @@ var BrowserPrototype = {
 | 
				
			|||||||
		this.dom.find('.path .dir.cur')
 | 
							this.dom.find('.path .dir.cur')
 | 
				
			||||||
			.text('')
 | 
								.text('')
 | 
				
			||||||
			.removeAttr('contenteditable')
 | 
								.removeAttr('contenteditable')
 | 
				
			||||||
		this
 | 
					 | 
				
			||||||
			.focus()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// NOTE: we might select an item outside of the current visible
 | 
							// NOTE: we might select an item outside of the current visible
 | 
				
			||||||
		// 		area, thus re-selecting it after we remove the filter 
 | 
							// 		area, thus re-selecting it after we remove the filter 
 | 
				
			||||||
@ -717,6 +745,7 @@ var BrowserPrototype = {
 | 
				
			|||||||
		this.select(this.select('!'))
 | 
							this.select(this.select('!'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return this
 | 
							return this
 | 
				
			||||||
 | 
								.focus()
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	get filtering(){
 | 
						get filtering(){
 | 
				
			||||||
		return this.dom.find('.path .dir.cur[contenteditable]').length > 0 
 | 
							return this.dom.find('.path .dir.cur[contenteditable]').length > 0 
 | 
				
			||||||
@ -990,6 +1019,8 @@ var BrowserPrototype = {
 | 
				
			|||||||
	action: function(){
 | 
						action: function(){
 | 
				
			||||||
		var elem = this.select('!')
 | 
							var elem = this.select('!')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//this.focus()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// nothing selected, select first and exit...
 | 
							// nothing selected, select first and exit...
 | 
				
			||||||
		if(elem.length == 0){
 | 
							if(elem.length == 0){
 | 
				
			||||||
			this.select()
 | 
								this.select()
 | 
				
			||||||
@ -1102,6 +1133,7 @@ var BrowserPrototype = {
 | 
				
			|||||||
	// 		an element is not traversable/listable and will trigger the
 | 
						// 		an element is not traversable/listable and will trigger the
 | 
				
			||||||
	// 		.open(..) on push...
 | 
						// 		.open(..) on push...
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
 | 
						// XXX need a way to constructively communicate errors up...
 | 
				
			||||||
	list: function(path, make){
 | 
						list: function(path, make){
 | 
				
			||||||
		path = path || this.path
 | 
							path = path || this.path
 | 
				
			||||||
		var m = this.options.list
 | 
							var m = this.options.list
 | 
				
			||||||
@ -1124,9 +1156,19 @@ var BrowserPrototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// basic permanent interactions...
 | 
							// basic permanent interactions...
 | 
				
			||||||
		dom.find('.path')
 | 
							dom.find('.path')
 | 
				
			||||||
 | 
								// NOTE: these are used for full-path editing and are defined
 | 
				
			||||||
 | 
								// 		here in contrast to other feature handlers as the
 | 
				
			||||||
 | 
								// 		'.path' element is long-lived and not rewritten 
 | 
				
			||||||
 | 
								// 		on .update(..)
 | 
				
			||||||
			.dblclick(function(){
 | 
								.dblclick(function(){
 | 
				
			||||||
				that.startFullPathEdit()
 | 
									that.startFullPathEdit()
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
								.keyup(function(){
 | 
				
			||||||
 | 
									var e = $(this)
 | 
				
			||||||
 | 
									if(e.attr('contenteditable') && e.text() != dom.attr('orig-path')){
 | 
				
			||||||
 | 
										dom.find('.list').empty()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// add keyboard handler...
 | 
							// add keyboard handler...
 | 
				
			||||||
		dom.keydown(
 | 
							dom.keydown(
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user