mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-12-26 13:01:58 +00:00
added loader selection sub-list + moved feature config to feature actions (closer to where they are used)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
b34eff200b
commit
6b8b4d2801
@ -105,7 +105,7 @@ module.FeatureProto = {
|
|||||||
if(this.config != null
|
if(this.config != null
|
||||||
|| (this.actions != null
|
|| (this.actions != null
|
||||||
&& this.actions.config != null)){
|
&& this.actions.config != null)){
|
||||||
var config = this.config || this.actions.config
|
var config = this.config = this.config || this.actions.config
|
||||||
|
|
||||||
if(actions.config == null){
|
if(actions.config == null){
|
||||||
actions.config = {}
|
actions.config = {}
|
||||||
|
|||||||
@ -599,6 +599,18 @@ var BrowserPrototype = {
|
|||||||
// 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
|
||||||
// path both in the path and list sections...
|
// path both in the path and list sections...
|
||||||
// NOTE: current behaviour is not wrong, it just not too flexible...
|
// NOTE: current behaviour is not wrong, it just not too flexible...
|
||||||
|
//
|
||||||
|
// XXX one use-case here would be to pass this a custom lister or a full
|
||||||
|
// browser, need to make this work correctly for full set of
|
||||||
|
// events...
|
||||||
|
// - custom lister -- handle all sub-paths in some way...
|
||||||
|
// - full browser -- handle all sub-paths by the nested
|
||||||
|
// browser...
|
||||||
|
// one way to handle nested browsers is to implement a browser
|
||||||
|
// stack which if not empty the top browser handles all the
|
||||||
|
// sub-paths
|
||||||
|
// ...this will also need to indicate a way to split the path
|
||||||
|
// and when to 'pop' the sub browser...
|
||||||
update: function(path, list){
|
update: function(path, list){
|
||||||
path = path || this.path
|
path = path || this.path
|
||||||
var browser = this.dom
|
var browser = this.dom
|
||||||
@ -743,7 +755,7 @@ var BrowserPrototype = {
|
|||||||
that.action()
|
that.action()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
// push action...
|
// push...
|
||||||
if(traversable && that.options.pushButton){
|
if(traversable && that.options.pushButton){
|
||||||
res.append($('<div>')
|
res.append($('<div>')
|
||||||
.addClass('button')
|
.addClass('button')
|
||||||
|
|||||||
@ -794,11 +794,6 @@ module.Base = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
tag: 'base',
|
tag: 'base',
|
||||||
|
|
||||||
config: {
|
|
||||||
// see .direction for details...
|
|
||||||
'steps-to-change-direction': 3,
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: BaseActions,
|
actions: BaseActions,
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -809,6 +804,28 @@ module.Base = ImageGridFeatures.Feature({
|
|||||||
var ViewerActions =
|
var ViewerActions =
|
||||||
module.ViewerActions =
|
module.ViewerActions =
|
||||||
actions.Actions({
|
actions.Actions({
|
||||||
|
config: {
|
||||||
|
// The maximum screen width allowed when zooming...
|
||||||
|
'max-screen-images': 30,
|
||||||
|
|
||||||
|
// A step (multiplier) used by .zoomIn()/.zoomOut() actions.
|
||||||
|
// NOTE: this is rounded to the nearest whole screen width in images
|
||||||
|
// and current fit-overflow added.
|
||||||
|
'zoom-step': 1.2,
|
||||||
|
|
||||||
|
// added to odd number of images to fit to indicate scroll ability...
|
||||||
|
// ...this effectively sets the closest distance an image can be from
|
||||||
|
// the viewer edge...
|
||||||
|
'fit-overflow': 0.2,
|
||||||
|
|
||||||
|
|
||||||
|
// limit key repeat to one per N milliseconds.
|
||||||
|
//
|
||||||
|
// Set this to -1 or null to run keys without any limitations.
|
||||||
|
// XXX at this point the keyboard is setup in ui.js, need to
|
||||||
|
// move to a more logical spot...
|
||||||
|
'max-key-repeat-rate': 0,
|
||||||
|
},
|
||||||
|
|
||||||
// Images...
|
// Images...
|
||||||
// XXX this seems like a hack...
|
// XXX this seems like a hack...
|
||||||
@ -1316,29 +1333,6 @@ module.Viewer = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
depends: ['base'],
|
depends: ['base'],
|
||||||
|
|
||||||
config: {
|
|
||||||
// The maximum screen width allowed when zooming...
|
|
||||||
'max-screen-images': 30,
|
|
||||||
|
|
||||||
// A step (multiplier) used by .zoomIn()/.zoomOut() actions.
|
|
||||||
// NOTE: this is rounded to the nearest whole screen width in images
|
|
||||||
// and current fit-overflow added.
|
|
||||||
'zoom-step': 1.2,
|
|
||||||
|
|
||||||
// added to odd number of images to fit to indicate scroll ability...
|
|
||||||
// ...this effectively sets the closest distance an image can be from
|
|
||||||
// the viewer edge...
|
|
||||||
'fit-overflow': 0.2,
|
|
||||||
|
|
||||||
|
|
||||||
// limit key repeat to one per N milliseconds.
|
|
||||||
//
|
|
||||||
// Set this to -1 or null to run keys without any limitations.
|
|
||||||
// XXX at this point the keyboard is setup in ui.js, need to
|
|
||||||
// move to a more logical spot...
|
|
||||||
'max-key-repeat-rate': 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: ViewerActions,
|
actions: ViewerActions,
|
||||||
|
|
||||||
// check if we are running in a UI context...
|
// check if we are running in a UI context...
|
||||||
@ -1465,6 +1459,25 @@ module.Journal = ImageGridFeatures.Feature({
|
|||||||
// XXX try a strategy: load more in the direction of movement by an offset...
|
// XXX try a strategy: load more in the direction of movement by an offset...
|
||||||
// XXX updateRibbon(..) is not signature compatible with data.updateRibbon(..)
|
// XXX updateRibbon(..) is not signature compatible with data.updateRibbon(..)
|
||||||
var PartialRibbonsActions = actions.Actions({
|
var PartialRibbonsActions = actions.Actions({
|
||||||
|
config: {
|
||||||
|
// number of screen widths to load...
|
||||||
|
'ribbon-size-screens': 7,
|
||||||
|
|
||||||
|
// number of screen widths to edge to trigger reload...
|
||||||
|
'ribbon-resize-threshold': 1.5,
|
||||||
|
|
||||||
|
// timeout before a non-forced ribbon size update happens after
|
||||||
|
// the action...
|
||||||
|
// NOTE: if set to null, the update will be sync...
|
||||||
|
'ribbon-update-timeout': 120,
|
||||||
|
|
||||||
|
// how many non-adjacent images to preload...
|
||||||
|
'preload-radius': 5,
|
||||||
|
|
||||||
|
// sources to preload...
|
||||||
|
'preload-sources': ['bookmark', 'selected'],
|
||||||
|
},
|
||||||
|
|
||||||
// NOTE: this will not work from chrome when loading from a local fs...
|
// NOTE: this will not work from chrome when loading from a local fs...
|
||||||
// XXX experimental...
|
// XXX experimental...
|
||||||
startCacheWorker: ['Interface/',
|
startCacheWorker: ['Interface/',
|
||||||
@ -1794,25 +1807,6 @@ module.PartialRibbons = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
actions: PartialRibbonsActions,
|
actions: PartialRibbonsActions,
|
||||||
|
|
||||||
config: {
|
|
||||||
// number of screen widths to load...
|
|
||||||
'ribbon-size-screens': 7,
|
|
||||||
|
|
||||||
// number of screen widths to edge to trigger reload...
|
|
||||||
'ribbon-resize-threshold': 1.5,
|
|
||||||
|
|
||||||
// timeout before a non-forced ribbon size update happens after
|
|
||||||
// the action...
|
|
||||||
// NOTE: if set to null, the update will be sync...
|
|
||||||
'ribbon-update-timeout': 120,
|
|
||||||
|
|
||||||
// how many non-adjacent images to preload...
|
|
||||||
'preload-radius': 5,
|
|
||||||
|
|
||||||
// sources to preload...
|
|
||||||
'preload-sources': ['bookmark', 'selected'],
|
|
||||||
},
|
|
||||||
|
|
||||||
handlers: [
|
handlers: [
|
||||||
['focusImage.pre centerImage.pre',
|
['focusImage.pre centerImage.pre',
|
||||||
function(target, list){
|
function(target, list){
|
||||||
@ -1857,6 +1851,11 @@ module.PartialRibbons = ImageGridFeatures.Feature({
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
var SingleImageActions = actions.Actions({
|
var SingleImageActions = actions.Actions({
|
||||||
|
config: {
|
||||||
|
'single-image-scale': null,
|
||||||
|
'ribbon-scale': null,
|
||||||
|
},
|
||||||
|
|
||||||
toggleSingleImage: ['Interface/Toggle single image view',
|
toggleSingleImage: ['Interface/Toggle single image view',
|
||||||
// XXX this is wrong!!!
|
// XXX this is wrong!!!
|
||||||
CSSClassToggler(
|
CSSClassToggler(
|
||||||
@ -1944,11 +1943,6 @@ module.SingleImageView = ImageGridFeatures.Feature({
|
|||||||
tag: 'ui-single-image-view',
|
tag: 'ui-single-image-view',
|
||||||
depends: ['ui'],
|
depends: ['ui'],
|
||||||
|
|
||||||
config: {
|
|
||||||
'single-image-scale': null,
|
|
||||||
'ribbon-scale': null,
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: SingleImageActions,
|
actions: SingleImageActions,
|
||||||
|
|
||||||
handlers:[
|
handlers:[
|
||||||
@ -2193,6 +2187,25 @@ module.BoundsIndicators = ImageGridFeatures.Feature({
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
var CurrentImageIndicatorActions = actions.Actions({
|
var CurrentImageIndicatorActions = actions.Actions({
|
||||||
|
config: {
|
||||||
|
'current-image-border': 3,
|
||||||
|
'current-image-min-border': 2,
|
||||||
|
|
||||||
|
'current-image-border-timeout': 200,
|
||||||
|
'current-image-shift-timeout': 200,
|
||||||
|
|
||||||
|
'current-image-indicator-fadein': 500,
|
||||||
|
|
||||||
|
'current-image-indicator-hide-timeout': 250,
|
||||||
|
|
||||||
|
// this can be:
|
||||||
|
// 'hide' - simply hide on next/prev screen action
|
||||||
|
// and show on focus image.
|
||||||
|
// 'hide-show' - hide on fast scroll through screens and
|
||||||
|
// show when slowing down.
|
||||||
|
'current-image-indicator-screen-nav-mode': 'hide',
|
||||||
|
},
|
||||||
|
|
||||||
updateCurrentImageIndicator: ['Interface/Update current image indicator',
|
updateCurrentImageIndicator: ['Interface/Update current image indicator',
|
||||||
function(target, update_border){
|
function(target, update_border){
|
||||||
var ribbon_set = this.ribbons.getRibbonSet()
|
var ribbon_set = this.ribbons.getRibbonSet()
|
||||||
@ -2282,25 +2295,6 @@ module.CurrentImageIndicator = ImageGridFeatures.Feature({
|
|||||||
tag: 'ui-current-image-indicator',
|
tag: 'ui-current-image-indicator',
|
||||||
depends: ['ui'],
|
depends: ['ui'],
|
||||||
|
|
||||||
config: {
|
|
||||||
'current-image-border': 3,
|
|
||||||
'current-image-min-border': 2,
|
|
||||||
|
|
||||||
'current-image-border-timeout': 200,
|
|
||||||
'current-image-shift-timeout': 200,
|
|
||||||
|
|
||||||
'current-image-indicator-fadein': 500,
|
|
||||||
|
|
||||||
'current-image-indicator-hide-timeout': 250,
|
|
||||||
|
|
||||||
// this can be:
|
|
||||||
// 'hide' - simply hide on next/prev screen action
|
|
||||||
// and show on focus image.
|
|
||||||
// 'hide-show' - hide on fast scroll through screens and
|
|
||||||
// show when slowing down.
|
|
||||||
'current-image-indicator-screen-nav-mode': 'hide',
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: CurrentImageIndicatorActions,
|
actions: CurrentImageIndicatorActions,
|
||||||
|
|
||||||
handlers: [
|
handlers: [
|
||||||
@ -2651,6 +2645,14 @@ var makeActionLister = function(list, filter, pre_order){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var ActionTreeActions = actions.Actions({
|
var ActionTreeActions = actions.Actions({
|
||||||
|
config: {
|
||||||
|
'action-category-order': [
|
||||||
|
'File',
|
||||||
|
'Edit',
|
||||||
|
'Navigate',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
// XXX move this to a generic modal overlay feature...
|
// XXX move this to a generic modal overlay feature...
|
||||||
getOverlay: ['Interface/Get overlay object',
|
getOverlay: ['Interface/Get overlay object',
|
||||||
function(o){
|
function(o){
|
||||||
@ -2869,14 +2871,6 @@ module.ActionTree = ImageGridFeatures.Feature({
|
|||||||
tag: 'ui-action-tree',
|
tag: 'ui-action-tree',
|
||||||
depends: ['ui'],
|
depends: ['ui'],
|
||||||
|
|
||||||
config: {
|
|
||||||
'action-category-order': [
|
|
||||||
'File',
|
|
||||||
'Edit',
|
|
||||||
'Navigate',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: ActionTreeActions,
|
actions: ActionTreeActions,
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -3193,6 +3187,7 @@ module.AppControl = ImageGridFeatures.Feature({
|
|||||||
// XXX at this point this is a stub...
|
// XXX at this point this is a stub...
|
||||||
if(window.nodejs != null){
|
if(window.nodejs != null){
|
||||||
var file = requirejs('./file')
|
var file = requirejs('./file')
|
||||||
|
var glob = requirejs('glob')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3202,7 +3197,7 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
// ...and how should this be handled when merging indexes or
|
// ...and how should this be handled when merging indexes or
|
||||||
// viewing multiple/clustered indexes???
|
// viewing multiple/clustered indexes???
|
||||||
// XXX look inside...
|
// XXX look inside...
|
||||||
loadPath: ['File/Load path',
|
loadIndex: ['File/Load index',
|
||||||
function(path, logger){
|
function(path, logger){
|
||||||
var that = this
|
var that = this
|
||||||
|
|
||||||
@ -3290,6 +3285,27 @@ var FileSystemLoaderActions = actions.Actions({
|
|||||||
that.load(index)
|
that.load(index)
|
||||||
})
|
})
|
||||||
}],
|
}],
|
||||||
|
// XXX use the logger...
|
||||||
|
// XXX add a recursive option...
|
||||||
|
// ...might also be nice to add sub-dirs to ribbons...
|
||||||
|
loadImages: ['File/Load images',
|
||||||
|
function(path, logger){
|
||||||
|
if(path == null){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
return glob(path + '/*+(jpg|png)')
|
||||||
|
.on('end', function(lst){
|
||||||
|
that.loadURLs(lst)
|
||||||
|
})
|
||||||
|
}],
|
||||||
|
|
||||||
|
// XXX auto-detect format or let the user chose...
|
||||||
|
loadPath: ['File/Load path',
|
||||||
|
function(){
|
||||||
|
}],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@ -3312,28 +3328,44 @@ module.FileSystemLoader = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
var FileSystemLoaderUIActions = actions.Actions({
|
var makeProwseProxy = function(action){
|
||||||
// NOTE: if no path is passed (null) this behaves just like .browsePath(..)
|
return function(path, logger){
|
||||||
// otherwise it will just load the given path (no UI) while
|
|
||||||
// .browsePath(..) will load the UI in all cases but will treat
|
|
||||||
// the given path as a base path to start from.
|
|
||||||
// XXX should passing no path to this start browsing from the current
|
|
||||||
// path or from the root?
|
|
||||||
loadPath: ['File/Load path...',
|
|
||||||
function(path, logger){
|
|
||||||
var that = this
|
var that = this
|
||||||
if(path == null){
|
if(path == null){
|
||||||
// XXX should we set a start path here to current???
|
// XXX should we set a start path here to current???
|
||||||
return this.browsePath(path,
|
return this.browsePath(path,
|
||||||
function(path){
|
function(path){
|
||||||
return that.loadPath(path, logger)
|
return that[action](path, logger)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}],
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var FileSystemLoaderUIActions = actions.Actions({
|
||||||
|
config: {
|
||||||
|
'path-loaders': [
|
||||||
|
'loadIndex',
|
||||||
|
'loadImages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// NOTE: if no path is passed (null) these behave just like .browsePath(..)
|
||||||
|
// with the appropriate callback otherwise it will just load
|
||||||
|
// the given path (no UI) while .browsePath(..) will load the
|
||||||
|
// UI in all cases but will treat the given path as a base path
|
||||||
|
// to start from.
|
||||||
|
// XXX should passing no path to this start browsing from the current
|
||||||
|
// path or from the root?
|
||||||
|
loadIndex: ['File/Load index...',
|
||||||
|
makeProwseProxy('loadIndex')],
|
||||||
|
loadImages: ['File/Load images...',
|
||||||
|
makeProwseProxy('loadImages')],
|
||||||
|
|
||||||
// XXX BUG: for some reason this when run from .browseActions(..) or
|
// XXX BUG: for some reason this when run from .browseActions(..) or
|
||||||
// any other Browse, loads incorrectly while when called
|
// any other Browse, loads incorrectly while when called
|
||||||
// directly is OK...
|
// directly is OK...
|
||||||
|
// XXX should the loader list be nested or open in overlay (as-is now)???
|
||||||
browsePath: ['File/Browse file system...',
|
browsePath: ['File/Browse file system...',
|
||||||
function(base, callback){
|
function(base, callback){
|
||||||
var that = this
|
var that = this
|
||||||
@ -3344,18 +3376,46 @@ var FileSystemLoaderUIActions = actions.Actions({
|
|||||||
require('./lib/widget/browse-walk').makeWalk(null, base, false, false)
|
require('./lib/widget/browse-walk').makeWalk(null, base, false, false)
|
||||||
// path selected...
|
// path selected...
|
||||||
.open(function(evt, path){
|
.open(function(evt, path){
|
||||||
|
|
||||||
|
// single loader...
|
||||||
|
if(callback && callback.constructor === Function){
|
||||||
// close self and parent...
|
// close self and parent...
|
||||||
o.close()
|
o.close()
|
||||||
parent
|
parent
|
||||||
&& parent.close
|
&& parent.close
|
||||||
&& parent.close()
|
&& parent.close()
|
||||||
|
|
||||||
// pass the selected path on...
|
|
||||||
if(callback){
|
|
||||||
callback(path)
|
callback(path)
|
||||||
|
|
||||||
|
// list of loaders...
|
||||||
} else {
|
} else {
|
||||||
that.loadPath(path)
|
// user-provided list...
|
||||||
|
if(callback){
|
||||||
|
var loaders = callback
|
||||||
|
|
||||||
|
// build the loaders list from .config...
|
||||||
|
} else {
|
||||||
|
var loaders = {}
|
||||||
|
that.config['path-loaders'].forEach(function(m){
|
||||||
|
loaders[that[m].doc.split('/').pop()] = function(){
|
||||||
|
return that[m](path)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// show user the list...
|
||||||
|
var so = overlay.Overlay(that.ribbons.viewer,
|
||||||
|
browse.makeList(null, loaders)
|
||||||
|
// close self and parent...
|
||||||
|
.open(function(){
|
||||||
|
so.close()
|
||||||
|
o.close()
|
||||||
|
}))
|
||||||
|
// closed menu...
|
||||||
|
.close(function(){
|
||||||
|
o.focus()
|
||||||
|
})
|
||||||
|
so.client.select(0)
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
// we closed the browser...
|
// we closed the browser...
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user