mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-12-17 00:31:40 +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