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:
Alex A. Naanou 2015-12-14 00:00:17 +03:00
parent e957b10437
commit eb58b33093
3 changed files with 131 additions and 49 deletions

View File

@ -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

View File

@ -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 '*'...

View File

@ -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(){