mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-12-18 17:21:39 +00:00
added relative paths and some refactoring and revision...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
8dbd4b2f27
commit
92d0d3d806
@ -85,10 +85,6 @@ var BrowserClassPrototype = {
|
|||||||
// XXX Q: should we make a base list dialog and build this on that or
|
// XXX Q: should we make a base list dialog and build this on that or
|
||||||
// simplify this to implement a list (removing the path and disabling
|
// simplify this to implement a list (removing the path and disabling
|
||||||
// traversal)??
|
// traversal)??
|
||||||
// XXX need base events:
|
|
||||||
// - open
|
|
||||||
// - update
|
|
||||||
// - select (???)
|
|
||||||
var BrowserPrototype = {
|
var BrowserPrototype = {
|
||||||
dom: null,
|
dom: null,
|
||||||
|
|
||||||
@ -168,6 +164,47 @@ var BrowserPrototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// Normalize path...
|
||||||
|
//
|
||||||
|
// This converts the path into a universal absolute array
|
||||||
|
// representation, taking care of relative path constructs including
|
||||||
|
// '.' (current path) and '..' (up one level)
|
||||||
|
//
|
||||||
|
// XXX is this the correct name???
|
||||||
|
path2lst: function(path){
|
||||||
|
var splitter = /[\\\/]+/
|
||||||
|
|
||||||
|
if(typeof(path) == typeof('str')){
|
||||||
|
path = path
|
||||||
|
.split(splitter)
|
||||||
|
.filter(function(e){ return e != '' })
|
||||||
|
}
|
||||||
|
|
||||||
|
// we've got a relative path...
|
||||||
|
if(path[0] == '.' || path[0] == '..'){
|
||||||
|
path = this.path.concat(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
path = path
|
||||||
|
// clear the '..'...
|
||||||
|
// NOTE: we reverse to avoid setting elements with negative
|
||||||
|
// indexes if we have a leading '..'
|
||||||
|
.reverse()
|
||||||
|
.map(function(e, i){
|
||||||
|
if(e == '..'){
|
||||||
|
e = '.'
|
||||||
|
path[i] = '.'
|
||||||
|
path[i+1] = '.'
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
})
|
||||||
|
.reverse()
|
||||||
|
// filter out '.'...
|
||||||
|
.filter(function(e){ return e != '.' })
|
||||||
|
|
||||||
|
return path
|
||||||
|
},
|
||||||
|
|
||||||
// Trigger jQuery events on Browser...
|
// Trigger jQuery events on Browser...
|
||||||
//
|
//
|
||||||
// This will pass the browser instance to .source attribute of the
|
// This will pass the browser instance to .source attribute of the
|
||||||
@ -257,7 +294,6 @@ var BrowserPrototype = {
|
|||||||
// overwrite the attr but setting a new value to the html attr
|
// overwrite the attr but setting a new value to the html attr
|
||||||
// will not affect the actual path.
|
// will not affect the actual path.
|
||||||
//
|
//
|
||||||
// XXX do we normalize path here???
|
|
||||||
// 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
|
||||||
// path due to an error, we need to be able to render the new
|
// path due to an error, we need to be able to render the new
|
||||||
@ -269,13 +305,7 @@ var BrowserPrototype = {
|
|||||||
var that = this
|
var that = this
|
||||||
|
|
||||||
// normalize path...
|
// normalize path...
|
||||||
// XXX is it correct to ignore empty path elements, e.g. 'aa//cc'?
|
path = this.path2lst(path)
|
||||||
var splitter = /[\\\/]/
|
|
||||||
if(typeof(path) == typeof('str') && splitter.test(path)){
|
|
||||||
path = path
|
|
||||||
.split(splitter)
|
|
||||||
.filter(function(e){ return e != '' })
|
|
||||||
}
|
|
||||||
|
|
||||||
var p = browser.find('.path').empty()
|
var p = browser.find('.path').empty()
|
||||||
var l = browser.find('.list').empty()
|
var l = browser.find('.list').empty()
|
||||||
@ -675,9 +705,6 @@ var BrowserPrototype = {
|
|||||||
// NOTE: 'none' will always return an empty jQuery object, to get
|
// NOTE: 'none' will always return an empty jQuery object, to get
|
||||||
// the selection state before deselecting use .select('!')
|
// the selection state before deselecting use .select('!')
|
||||||
// NOTE: this uses .filter(..) for string and regexp matching...
|
// NOTE: this uses .filter(..) for string and regexp matching...
|
||||||
//
|
|
||||||
// XXX should the select event also contain path info???
|
|
||||||
// (also see: event api proxy)
|
|
||||||
select: function(elem, filtering){
|
select: function(elem, filtering){
|
||||||
var pattern = '.list div:not(.disabled):not(.filtered-out)'
|
var pattern = '.list div:not(.disabled):not(.filtered-out)'
|
||||||
var browser = this.dom
|
var browser = this.dom
|
||||||
@ -805,6 +832,7 @@ var BrowserPrototype = {
|
|||||||
|
|
||||||
// Push an element to path / go down one level...
|
// Push an element to path / go down one level...
|
||||||
// XXX trigger a "push" event... (???)
|
// XXX trigger a "push" event... (???)
|
||||||
|
// XXX might be a good idea to add a live traversable check...
|
||||||
push: function(elem){
|
push: function(elem){
|
||||||
var browser = this.dom
|
var browser = this.dom
|
||||||
var elem = this.select(elem || '!')
|
var elem = this.select(elem || '!')
|
||||||
@ -815,14 +843,15 @@ var BrowserPrototype = {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if not traversable call the action...
|
||||||
|
if(!this.traversable || elem.hasClass('not-traversable')){
|
||||||
|
return this.action()
|
||||||
|
}
|
||||||
|
|
||||||
var path = this.path
|
var path = this.path
|
||||||
path.push(elem.text())
|
path.push(elem.text())
|
||||||
|
|
||||||
// if not traversable call the action...
|
// do the actual traverse...
|
||||||
if(!this.traversable || elem.hasClass('not-traversable')){
|
|
||||||
return this.action(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.path = path
|
this.path = path
|
||||||
|
|
||||||
this.select()
|
this.select()
|
||||||
@ -848,9 +877,12 @@ var BrowserPrototype = {
|
|||||||
return this
|
return this
|
||||||
},
|
},
|
||||||
|
|
||||||
// XXX think about the API...
|
// Pre-open action...
|
||||||
|
//
|
||||||
|
// This opens (.open(..)) the selected item and if none are selected
|
||||||
|
// selects the default (.select()) and exits.
|
||||||
|
//
|
||||||
// XXX need to check if openable i.e. when to use open and when push...
|
// XXX need to check if openable i.e. when to use open and when push...
|
||||||
// XXX might be a good idea to add a live traversable check...
|
|
||||||
action: function(){
|
action: function(){
|
||||||
var elem = this.select('!')
|
var elem = this.select('!')
|
||||||
|
|
||||||
@ -874,19 +906,57 @@ var BrowserPrototype = {
|
|||||||
|
|
||||||
// Open action...
|
// Open action...
|
||||||
//
|
//
|
||||||
// XXX do we need to pass this to the event???
|
// This is called when an element is selected and opened.
|
||||||
|
//
|
||||||
|
// By default this happens in the following situations:
|
||||||
|
// - an element is selected and Enter is pressed.
|
||||||
|
// - an element is not traversable and push (Left, click) is called.
|
||||||
|
//
|
||||||
|
// By default this only triggers the 'open' event on both the browser
|
||||||
|
// and the selected element if one exists.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// NOTE: if nothing is selected this will do nothing...
|
||||||
|
// NOTE: internally this is never called directly, instead a pre-open
|
||||||
|
// stage is used to execute default behavior not directly
|
||||||
|
// related to opening an item (see: .action()).
|
||||||
|
// NOTE: unlike .list(..) this can be used directly if an item is
|
||||||
|
// selected and an actual open action is defined, either in an
|
||||||
|
// instance or in .options
|
||||||
open: function(path){
|
open: function(path){
|
||||||
path = path || this.path
|
|
||||||
var m = this.options.open
|
|
||||||
var res = m ? m.apply(this, arguments) : path
|
|
||||||
var elem = this.select('!')
|
var elem = this.select('!')
|
||||||
|
|
||||||
// XXX do we need to pass this to the event???
|
// get path + selection...
|
||||||
this.trigger('open', path)
|
if(!path){
|
||||||
|
// nothing selected, select first and exit...
|
||||||
|
if(elem.length == 0){
|
||||||
|
//this.select()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
// load the current path + selection...
|
||||||
|
path = this.path
|
||||||
|
path.push(elem.text())
|
||||||
|
|
||||||
|
// normalize and load path...
|
||||||
|
} else {
|
||||||
|
path = this.path2lst(path)
|
||||||
|
var elem = path.slice(-1)[0]
|
||||||
|
this.path = path.slice(0, -1)
|
||||||
|
elem = this.select(elem)
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the options method and call it if it exists...
|
||||||
|
var m = this.options.open
|
||||||
|
var args = args2array(arguments)
|
||||||
|
args[0] = path
|
||||||
|
var res = m ? m.apply(this, args) : path
|
||||||
|
|
||||||
|
// trigger the 'open' events...
|
||||||
if(elem.length > 0){
|
if(elem.length > 0){
|
||||||
// XXX do we need to pass this to the event???
|
|
||||||
elem.trigger('open', path)
|
elem.trigger('open', path)
|
||||||
}
|
}
|
||||||
|
this.trigger('open', path)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
},
|
},
|
||||||
@ -896,6 +966,12 @@ var BrowserPrototype = {
|
|||||||
// This will get passed a path and an item constructor and should
|
// This will get passed a path and an item constructor and should
|
||||||
// return a list.
|
// return a list.
|
||||||
//
|
//
|
||||||
|
// NOTE: This is not intended for direct client use, rather it is
|
||||||
|
// designed to either be overloaded by the user in an instance
|
||||||
|
// or in the .options
|
||||||
|
// To re-list/re-load the view use .update()
|
||||||
|
//
|
||||||
|
//
|
||||||
// There are two mods of operation:
|
// There are two mods of operation:
|
||||||
//
|
//
|
||||||
// 1) interactive:
|
// 1) interactive:
|
||||||
@ -920,7 +996,8 @@ var BrowserPrototype = {
|
|||||||
//
|
//
|
||||||
// .non-traversable
|
// .non-traversable
|
||||||
// an element is not traversable/listable and will trigger the
|
// an element is not traversable/listable and will trigger the
|
||||||
// .action(..) on push...
|
// .open(..) on push...
|
||||||
|
//
|
||||||
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user