more refactoring...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-06-15 18:43:26 +03:00
parent f200d24f56
commit 538216cfb9

View File

@ -328,9 +328,7 @@ function(item, event, evt, ...args){
// Generate item event method...
//
// makeItemEventMethod(event_name)
// makeItemEventMethod(event_name, handler[, options])
// makeItemEventMethod(event_name, handler, default_getter[, options])
// makeItemEventMethod(event_name, handler, default_getter, filter[, options])
// makeItemEventMethod(event_name, {handler, default_getter, filter, options, get_mode})
// -> event_method
//
//
@ -372,16 +370,10 @@ function(item, event, evt, ...args){
// NOTE: item events do not directly trigger the original caller's handlers
// those will get celled recursively when the events are propagated
// up the tree.
// XXX use destructuring (a-la makeItemOptionOnEventMethod(..) / makeItemOptionOffEventMethod(..))...
// XXX destructuring: move the defaults to the arguments...
var makeItemEventMethod =
module.makeItemEventMethod =
function(event, handler, action, default_item, filter, options){
// parse args...
var args = [...arguments].slice(3)
default_item = args[0] instanceof Function
&& args.shift()
filter = args[0] instanceof Function
&& args.shift()
function(event, {handler, action, default_item, filter, options, get_mode}={}){
var filterItems = function(items){
items = items instanceof Array ?
items
@ -391,14 +383,14 @@ function(event, handler, action, default_item, filter, options){
return filter ?
items.filter(filter)
: items }
options = args.shift()
//options = args.shift()
options = Object.assign(
// NOTE: we need to be able to pass item objects, so we can not
// use queries at the same time as there is not way to
// distinguish one from the other...
{ noQueryCheck: true },
options || {})
var getter = options.getMode || 'search'
var getter = get_mode || 'search'
// base event method...
// NOTE: this is not returned directly as we need to query the items
// and pass those on to the handlers rather than the arguments
@ -443,47 +435,50 @@ function(event, handler, action, default_item, filter, options){
base) }
// XXX should these .update()
var makeItemOptionOnEventMethod =
module.makeItemOptionOnEventMethod =
function(event, option, {handler, default_item, filter, options, update=true}={}){
return makeItemEventMethod(event,
function(evt, items){
// Make event method edit item...
//
// XXX should this .update()
// XXX destructuring: move the defaults to the arguments...
var makeItemOptionEventMethod =
module.makeItemOptionEventMethod =
function(event, action, {handler, default_item, filter, options, update=true}={}){
return makeItemEventMethod(event, {
handler: function(evt, items){
var that = this
var change = false
items.forEach(function(item){
change = item[option] = true
change = action(item)
handler
&& handler.call(that, item) })
// need to update for changes to show up...
change
&& update
&& this.update() },
null,
default_item:
default_item
|| function(){ return this.focused },
filter,
options) }
options, }) }
// Make event method to toggle item attr on/off...
//
// XXX destructuring: move the defaults to the arguments...
var makeItemOptionOnEventMethod =
module.makeItemOptionOnEventMethod =
function(event, attr, {handler, default_item, filter, options, update=true}={}){
return makeItemOptionEventMethod(event,
function(item){
return item[attr] = true },
{ handler, default_item, filter, options, update }) }
var makeItemOptionOffEventMethod =
module.makeItemOptionOffEventMethod =
function(event, option, {handler, default_item, filter, options, update=true}={}){
return makeItemEventMethod(event,
function(evt, items){
var change = false
items.forEach(function(item){
change = change || item[option]
delete item[option]
handler
&& handler.call(that, item) })
// need to update for changes to show up...
change
&& update
&& this.update() },
null,
default_item
|| function(){ return this.focused },
filter,
options) }
function(event, attr, {handler, default_item, filter, options, update=true}={}){
return makeItemOptionEventMethod(event,
function(item){
change = !!item[attr]
delete item[attr]
return change },
{ handler, default_item, filter, options, update }) }
// Generate item event/state toggler...
@ -2639,9 +2634,10 @@ var BaseBrowserPrototype = {
// NOTE: this will ignore disabled items.
// NOTE: .focus('next') / .focus('prev') will not wrap around the
// first last elements...
// NOTE: if focus does not change this will trigger any handlers...
// NOTE: this will reveal the focused item...
focus: makeItemEventMethod('focus',
function(evt, items){
focus: makeItemEventMethod('focus', {
handler: function(evt, items){
// blur .focused...
this.focused
&& this.blur(this.focused)
@ -2650,18 +2646,16 @@ var BaseBrowserPrototype = {
item != null
&& this.reveal(item)
&& (item.focused = true) },
null,
function(){ return this.get(0) },
{
getMode: 'get',
default_item: function(){ return this.get(0) },
options: {
get_mode: 'get',
skipDisabled: true,
}),
blur: makeItemEventMethod('blur',
function(evt, items){
} }),
blur: makeItemEventMethod('blur', {
handler: function(evt, items){
items.forEach(function(item){
delete item.focused }) },
null,
function(){ return this.focused }),
default_item: function(){ return this.focused } }),
// NOTE: .next() / .prev() will wrap around the first/last elements...
next: function(){
this.focus('next').focused || this.focus('first')
@ -2676,19 +2670,17 @@ var BaseBrowserPrototype = {
false),
// selection...
// XXX these should skip disabled... option???
select: makeItemEventMethod('select',
function(evt, items){
select: makeItemEventMethod('select', {
handler: function(evt, items){
items.forEach(function(item){
item.selected = true }) },
null,
// XXX is this a good default???
function(){ return this.focused }),
deselect: makeItemEventMethod('deselect',
function(evt, items){
default_item: function(){ return this.focused } }),
deselect: makeItemEventMethod('deselect', {
handler: function(evt, items){
items.forEach(function(item){
delete item.selected }) },
null,
function(){ return this.focused }),
default_item: function(){ return this.focused } }),
toggleSelect: makeItemEventToggler(
'selected',
'select', 'deselect',
@ -2725,17 +2717,14 @@ var BaseBrowserPrototype = {
'focused'),
// primary/secondary/ternary? item actions...
open: makeItemEventMethod('open',
function(evt, item){},
open: makeItemEventMethod('open', {
// XXX not yet sure if this is correct...
function(evt, item){
action: function(evt, item){
item.length > 0
&& this.toggleCollapse(item) },
function(){ return this.focused }),
launch: makeItemEventMethod('launch',
function(evt, item){},
null,
function(){ return this.focused }),
default_item: function(){ return this.focused } }),
launch: makeItemEventMethod('launch', {
default_item: function(){ return this.focused } }),
// Update state (make then render)...
//