mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
ff5d1c4655
commit
d5ef01b144
@ -1048,12 +1048,6 @@ var KeyboardActions = actions.Actions({
|
|||||||
return dialog
|
return dialog
|
||||||
})],
|
})],
|
||||||
|
|
||||||
// XXX key editor:
|
|
||||||
// [ mode ]
|
|
||||||
// [ action (text with dataset) ] [ args (text field) ] no default: [_]
|
|
||||||
// ---
|
|
||||||
// <list of keys>
|
|
||||||
// new key
|
|
||||||
// XXX need a way to abort edits...
|
// XXX need a way to abort edits...
|
||||||
editKeyBinding: ['- Interface/Key mapping...',
|
editKeyBinding: ['- Interface/Key mapping...',
|
||||||
widgets.makeUIDialog(function(mode, code){
|
widgets.makeUIDialog(function(mode, code){
|
||||||
@ -1071,7 +1065,7 @@ var KeyboardActions = actions.Actions({
|
|||||||
// list the keys...
|
// list the keys...
|
||||||
var keys = that.keyboard.keys(code)
|
var keys = that.keyboard.keys(code)
|
||||||
keys = mode in keys ?
|
keys = mode in keys ?
|
||||||
keys[mode][code]
|
(keys[mode][code] || [])
|
||||||
: []
|
: []
|
||||||
|
|
||||||
var to_remove = []
|
var to_remove = []
|
||||||
@ -1083,7 +1077,7 @@ var KeyboardActions = actions.Actions({
|
|||||||
], })
|
], })
|
||||||
})
|
})
|
||||||
|
|
||||||
var new_button = make.Action('New key')
|
var new_button = make.Action('New key...')
|
||||||
.on('open', function(){
|
.on('open', function(){
|
||||||
widgets.editItem(dialog, new_button)
|
widgets.editItem(dialog, new_button)
|
||||||
})
|
})
|
||||||
@ -1142,7 +1136,7 @@ var KeyboardActions = actions.Actions({
|
|||||||
var that = this
|
var that = this
|
||||||
|
|
||||||
// XXX need a way to set a special '*' key...
|
// XXX need a way to set a special '*' key...
|
||||||
var dialog = widgets.makeListEditor(function(keys){
|
var dialog = browse.makeListEditor(function(keys){
|
||||||
// get...
|
// get...
|
||||||
if(keys === undefined){
|
if(keys === undefined){
|
||||||
return that.keybindings[mode].drop || []
|
return that.keybindings[mode].drop || []
|
||||||
|
|||||||
@ -166,193 +166,6 @@ function(list, elem, callback, options){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Options format:
|
|
||||||
// {
|
|
||||||
// new_button: <text>|<bool>,
|
|
||||||
//
|
|
||||||
// length_limit: <number>,
|
|
||||||
//
|
|
||||||
// // check input value...
|
|
||||||
// check: function(value){ ... },
|
|
||||||
//
|
|
||||||
// // if true only unique values will be stored...
|
|
||||||
// // if a function this will be used to normalize the values before
|
|
||||||
// // uniqueness check is performed...
|
|
||||||
// unique: <bool>|function(value){ ... },
|
|
||||||
//
|
|
||||||
// // if true sort values...
|
|
||||||
// // if function will be used as cmp for sorting...
|
|
||||||
// sort: <bool> || function(a, b){ ... },
|
|
||||||
//
|
|
||||||
// // this is called when a new value is added via new_button but
|
|
||||||
// // list length limit is reached...
|
|
||||||
// callback: function(selected){ ... },
|
|
||||||
//
|
|
||||||
// // see: itemButtons doc in browse.js for more info...
|
|
||||||
// itemButtons: [..]
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// XXX add sort buttons: up/down/top/bottom...
|
|
||||||
// XXX currently using this also requires the use of makeUIDialog(..),
|
|
||||||
// can this be simpler???
|
|
||||||
// XXX this is generic, move to browse...
|
|
||||||
var makeListEditor =
|
|
||||||
module.makeListEditor =
|
|
||||||
function(list, options){
|
|
||||||
options = options || {}
|
|
||||||
|
|
||||||
var new_button = options.new_button || true
|
|
||||||
new_button = new_button === true ? 'New...' : new_button
|
|
||||||
|
|
||||||
var _makeEditable = function(elem){
|
|
||||||
return $(elem).find('.text')
|
|
||||||
.makeEditable({
|
|
||||||
activate: true,
|
|
||||||
clear_on_edit: true,
|
|
||||||
blur_on_abort: false,
|
|
||||||
blur_on_commit: false,
|
|
||||||
})
|
|
||||||
.on('edit-aborted', function(){
|
|
||||||
dialog.select(null)
|
|
||||||
dialog.update()
|
|
||||||
})
|
|
||||||
.on('edit-done', function(evt, text){
|
|
||||||
var txt = $(this).text()
|
|
||||||
|
|
||||||
// invalid format...
|
|
||||||
if(options.check && !options.check(txt)){
|
|
||||||
dialog.update()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// list length limit
|
|
||||||
if(options.length_limit
|
|
||||||
&& (lst.length >= options.length_limit)){
|
|
||||||
|
|
||||||
options.callback && options.callback.call(dialog, txt)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent editing non-arrays...
|
|
||||||
if(!editable || !lst){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// add new value and sort list...
|
|
||||||
lst.push(txt)
|
|
||||||
|
|
||||||
// unique...
|
|
||||||
if(options.unique == null || options.unique === true){
|
|
||||||
lst = lst.unique()
|
|
||||||
|
|
||||||
// unique normalized...
|
|
||||||
} else if(typeof(options.unique) == typeof(function(){})){
|
|
||||||
lst = lst.unique(options.unique)
|
|
||||||
}
|
|
||||||
|
|
||||||
// sort...
|
|
||||||
if(options.sort){
|
|
||||||
lst = lst
|
|
||||||
.sort(typeof(options.sort) == typeof(function(){}) ?
|
|
||||||
options.sort
|
|
||||||
: undefined)
|
|
||||||
}
|
|
||||||
|
|
||||||
_write(lst)
|
|
||||||
|
|
||||||
// update the list data...
|
|
||||||
dialog.options.data = lst.concat(new_button ? [ new_button ] : [])
|
|
||||||
|
|
||||||
// update list and select new value...
|
|
||||||
dialog.update()
|
|
||||||
.done(function(){
|
|
||||||
dialog.select('"'+txt+'"')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
var _write = function(lst){
|
|
||||||
// write back the list...
|
|
||||||
return list instanceof Function ?
|
|
||||||
// call the writer...
|
|
||||||
list(lst)
|
|
||||||
// in-place replace list elements...
|
|
||||||
// NOTE: this is necessary as not everything we do with lst
|
|
||||||
// is in-place...
|
|
||||||
: list.splice.apply(list, [0, list.length].concat(lst))
|
|
||||||
}
|
|
||||||
|
|
||||||
var to_remove = []
|
|
||||||
|
|
||||||
var lst = list instanceof Function ?
|
|
||||||
list()
|
|
||||||
: list
|
|
||||||
var editable = lst instanceof Array
|
|
||||||
|
|
||||||
// view objects...
|
|
||||||
lst = !editable ? Object.keys(lst) : lst.slice()
|
|
||||||
|
|
||||||
var dialog = browse.makeList(null,
|
|
||||||
lst.concat(new_button ? [ new_button ] : []),
|
|
||||||
{
|
|
||||||
path: options.path,
|
|
||||||
itemButtons: options.itemButtons || [
|
|
||||||
// mark for removal...
|
|
||||||
browse.buttons.markForRemoval(to_remove)
|
|
||||||
// XXX add shift up/down/top/bottom and other buttons (optional)...
|
|
||||||
]
|
|
||||||
})
|
|
||||||
// select the new_button item...
|
|
||||||
.on('select', function(evt, elem){
|
|
||||||
if(new_button && $(elem).find('.text').text() == new_button){
|
|
||||||
_makeEditable(elem)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// restore striked-out items...
|
|
||||||
.on('update', function(){
|
|
||||||
to_remove.forEach(function(e){
|
|
||||||
dialog.filter('"'+ e +'"')
|
|
||||||
.toggleClass('strike-out')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.open(function(evt, path){
|
|
||||||
// we clicked the 'New' button -- select it...
|
|
||||||
if(new_button && (path == new_button || path == '')){
|
|
||||||
dialog.select(new_button)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
options.callback && options.callback.call(dialog, path)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.on('close', function(){
|
|
||||||
// prevent editing non-arrays...
|
|
||||||
if(!editable){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove striked items...
|
|
||||||
to_remove.forEach(function(e){
|
|
||||||
lst.splice(lst.indexOf(e), 1)
|
|
||||||
|
|
||||||
_write(lst)
|
|
||||||
})
|
|
||||||
|
|
||||||
// sort...
|
|
||||||
if(options.sort){
|
|
||||||
lst.sort(options.sort !== true ? options.sort : undefined)
|
|
||||||
|
|
||||||
_write(lst)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// XXX
|
|
||||||
new_button && dialog.dom.addClass('tail-action')
|
|
||||||
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
@ -362,7 +175,7 @@ function(actions, path, options){
|
|||||||
path = path.split('.')
|
path = path.split('.')
|
||||||
var key = path.pop()
|
var key = path.pop()
|
||||||
|
|
||||||
return makeListEditor(function(lst){
|
return browse.makeListEditor(function(lst){
|
||||||
var target = actions.config
|
var target = actions.config
|
||||||
path.forEach(function(p){
|
path.forEach(function(p){
|
||||||
target = target[p] = target[p] || {}
|
target = target[p] = target[p] || {}
|
||||||
|
|||||||
@ -2944,5 +2944,195 @@ module.makePathList = makeBrowserMaker(PathList)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
// Make an list/Array editor...
|
||||||
|
//
|
||||||
|
// Options format:
|
||||||
|
// {
|
||||||
|
// new_button: <text>|<bool>,
|
||||||
|
//
|
||||||
|
// length_limit: <number>,
|
||||||
|
//
|
||||||
|
// // check input value...
|
||||||
|
// check: function(value){ ... },
|
||||||
|
//
|
||||||
|
// // if true only unique values will be stored...
|
||||||
|
// // if a function this will be used to normalize the values before
|
||||||
|
// // uniqueness check is performed...
|
||||||
|
// unique: <bool>|function(value){ ... },
|
||||||
|
//
|
||||||
|
// // if true sort values...
|
||||||
|
// // if function will be used as cmp for sorting...
|
||||||
|
// sort: <bool> || function(a, b){ ... },
|
||||||
|
//
|
||||||
|
// // this is called when a new value is added via new_button but
|
||||||
|
// // list length limit is reached...
|
||||||
|
// callback: function(selected){ ... },
|
||||||
|
//
|
||||||
|
// // see: itemButtons doc in browse.js for more info...
|
||||||
|
// itemButtons: [..]
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// XXX add sort buttons: up/down/top/bottom...
|
||||||
|
// XXX this is generic, move to browse...
|
||||||
|
var makeListEditor =
|
||||||
|
module.makeListEditor =
|
||||||
|
function(list, options){
|
||||||
|
options = options || {}
|
||||||
|
|
||||||
|
var new_button = options.new_button || true
|
||||||
|
new_button = new_button === true ? 'New...' : new_button
|
||||||
|
|
||||||
|
var _makeEditable = function(elem){
|
||||||
|
return $(elem).find('.text')
|
||||||
|
.makeEditable({
|
||||||
|
activate: true,
|
||||||
|
clear_on_edit: true,
|
||||||
|
blur_on_abort: false,
|
||||||
|
blur_on_commit: false,
|
||||||
|
})
|
||||||
|
.on('edit-aborted', function(){
|
||||||
|
dialog.select(null)
|
||||||
|
dialog.update()
|
||||||
|
})
|
||||||
|
.on('edit-done', function(evt, text){
|
||||||
|
var txt = $(this).text()
|
||||||
|
|
||||||
|
// invalid format...
|
||||||
|
if(options.check && !options.check(txt)){
|
||||||
|
dialog.update()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// list length limit
|
||||||
|
if(options.length_limit
|
||||||
|
&& (lst.length >= options.length_limit)){
|
||||||
|
|
||||||
|
options.callback && options.callback.call(dialog, txt)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent editing non-arrays...
|
||||||
|
if(!editable || !lst){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// add new value and sort list...
|
||||||
|
lst.push(txt)
|
||||||
|
|
||||||
|
// unique...
|
||||||
|
if(options.unique == null || options.unique === true){
|
||||||
|
lst = lst.unique()
|
||||||
|
|
||||||
|
// unique normalized...
|
||||||
|
} else if(typeof(options.unique) == typeof(function(){})){
|
||||||
|
lst = lst.unique(options.unique)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort...
|
||||||
|
if(options.sort){
|
||||||
|
lst = lst
|
||||||
|
.sort(typeof(options.sort) == typeof(function(){}) ?
|
||||||
|
options.sort
|
||||||
|
: undefined)
|
||||||
|
}
|
||||||
|
|
||||||
|
_write(lst)
|
||||||
|
|
||||||
|
// update the list data...
|
||||||
|
dialog.options.data = lst.concat(new_button ? [ new_button ] : [])
|
||||||
|
|
||||||
|
// update list and select new value...
|
||||||
|
dialog.update()
|
||||||
|
.done(function(){
|
||||||
|
dialog.select('"'+txt+'"')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
var _write = function(lst){
|
||||||
|
// write back the list...
|
||||||
|
return list instanceof Function ?
|
||||||
|
// call the writer...
|
||||||
|
list(lst)
|
||||||
|
// in-place replace list elements...
|
||||||
|
// NOTE: this is necessary as not everything we do with lst
|
||||||
|
// is in-place...
|
||||||
|
: list.splice.apply(list, [0, list.length].concat(lst))
|
||||||
|
}
|
||||||
|
|
||||||
|
var to_remove = []
|
||||||
|
|
||||||
|
var lst = list instanceof Function ?
|
||||||
|
list()
|
||||||
|
: list
|
||||||
|
var editable = lst instanceof Array
|
||||||
|
|
||||||
|
// view objects...
|
||||||
|
lst = !editable ? Object.keys(lst) : lst.slice()
|
||||||
|
|
||||||
|
var dialog = makeList(null,
|
||||||
|
lst.concat(new_button ? [ new_button ] : []),
|
||||||
|
{
|
||||||
|
path: options.path,
|
||||||
|
itemButtons: options.itemButtons || [
|
||||||
|
// mark for removal...
|
||||||
|
Buttons.markForRemoval(to_remove)
|
||||||
|
// XXX add shift up/down/top/bottom and other buttons (optional)...
|
||||||
|
]
|
||||||
|
})
|
||||||
|
// select the new_button item...
|
||||||
|
.on('select', function(evt, elem){
|
||||||
|
if(new_button && $(elem).find('.text').text() == new_button){
|
||||||
|
_makeEditable(elem)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// restore striked-out items...
|
||||||
|
.on('update', function(){
|
||||||
|
to_remove.forEach(function(e){
|
||||||
|
dialog.filter('"'+ e +'"')
|
||||||
|
.toggleClass('strike-out')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.open(function(evt, path){
|
||||||
|
// we clicked the 'New' button -- select it...
|
||||||
|
if(new_button && (path == new_button || path == '')){
|
||||||
|
dialog.select(new_button)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
options.callback && options.callback.call(dialog, path)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('close', function(){
|
||||||
|
// prevent editing non-arrays...
|
||||||
|
if(!editable){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove striked items...
|
||||||
|
to_remove.forEach(function(e){
|
||||||
|
lst.splice(lst.indexOf(e), 1)
|
||||||
|
|
||||||
|
_write(lst)
|
||||||
|
})
|
||||||
|
|
||||||
|
// sort...
|
||||||
|
if(options.sort){
|
||||||
|
lst.sort(options.sort !== true ? options.sort : undefined)
|
||||||
|
|
||||||
|
_write(lst)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
new_button && dialog.dom.addClass('tail-action')
|
||||||
|
|
||||||
|
return dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* vim:set ts=4 sw=4 : */ return module })
|
* vim:set ts=4 sw=4 : */ return module })
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user