From d5ef01b1444b46a10a7fbef5e11ac04aefc077cb Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sun, 15 Jan 2017 05:02:38 +0300 Subject: [PATCH] refactoring... Signed-off-by: Alex A. Naanou --- ui (gen4)/features/keyboard.js | 12 +- ui (gen4)/features/ui-widgets.js | 189 +----------------------------- ui (gen4)/lib/widget/browse.js | 190 +++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 197 deletions(-) diff --git a/ui (gen4)/features/keyboard.js b/ui (gen4)/features/keyboard.js index 13fc862d..634a16d3 100755 --- a/ui (gen4)/features/keyboard.js +++ b/ui (gen4)/features/keyboard.js @@ -1048,12 +1048,6 @@ var KeyboardActions = actions.Actions({ return dialog })], - // XXX key editor: - // [ mode ] - // [ action (text with dataset) ] [ args (text field) ] no default: [_] - // --- - // - // new key // XXX need a way to abort edits... editKeyBinding: ['- Interface/Key mapping...', widgets.makeUIDialog(function(mode, code){ @@ -1071,7 +1065,7 @@ var KeyboardActions = actions.Actions({ // list the keys... var keys = that.keyboard.keys(code) keys = mode in keys ? - keys[mode][code] + (keys[mode][code] || []) : [] 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(){ widgets.editItem(dialog, new_button) }) @@ -1142,7 +1136,7 @@ var KeyboardActions = actions.Actions({ var that = this // XXX need a way to set a special '*' key... - var dialog = widgets.makeListEditor(function(keys){ + var dialog = browse.makeListEditor(function(keys){ // get... if(keys === undefined){ return that.keybindings[mode].drop || [] diff --git a/ui (gen4)/features/ui-widgets.js b/ui (gen4)/features/ui-widgets.js index c29a0a51..5ab63192 100755 --- a/ui (gen4)/features/ui-widgets.js +++ b/ui (gen4)/features/ui-widgets.js @@ -166,193 +166,6 @@ function(list, elem, callback, options){ } -// -// Options format: -// { -// new_button: |, -// -// length_limit: , -// -// // 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: |function(value){ ... }, -// -// // if true sort values... -// // if function will be used as cmp for sorting... -// sort: || 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('.') var key = path.pop() - return makeListEditor(function(lst){ + return browse.makeListEditor(function(lst){ var target = actions.config path.forEach(function(p){ target = target[p] = target[p] || {} diff --git a/ui (gen4)/lib/widget/browse.js b/ui (gen4)/lib/widget/browse.js index 9bf5a216..5c3d5eff 100755 --- a/ui (gen4)/lib/widget/browse.js +++ b/ui (gen4)/lib/widget/browse.js @@ -2944,5 +2944,195 @@ module.makePathList = makeBrowserMaker(PathList) +/*********************************************************************/ + +// Make an list/Array editor... +// +// Options format: +// { +// new_button: |, +// +// length_limit: , +// +// // 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: |function(value){ ... }, +// +// // if true sort values... +// // if function will be used as cmp for sorting... +// sort: || 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 })