Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-05-24 00:18:53 +03:00
parent f8244c51d6
commit 9b3a5007f3

View File

@ -184,10 +184,12 @@ Items.ListTitle = function(){}
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// Event system... // Event system parts and helpers...
// //
// XXX might be a good idea to make this a generic module... // XXX might be a good idea to make this a generic module...
// Base event object...
//
var BrowserEvent = var BrowserEvent =
module.BrowserEvent = module.BrowserEvent =
object.makeConstructor('BrowserEvent', object.makeConstructor('BrowserEvent',
@ -254,6 +256,7 @@ var makeEventMethod = function(event, handler, retrigger){
event: event, event: event,
}) } }) }
// Call item event handlers... // Call item event handlers...
// //
// callItemEventHandlers(item, event_name, event_object, ...) // callItemEventHandlers(item, event_name, event_object, ...)
@ -277,6 +280,7 @@ var callItemEventHandlers = function(item, event, evt, ...args){
&& item.parent.trigger && item.parent.trigger
&& item.parent.trigger(evt, item, ...args) } && item.parent.trigger(evt, item, ...args) }
// Generate item event method... // Generate item event method...
// //
// This extends makeEventMethod(..) by adding an option to pass an item // This extends makeEventMethod(..) by adding an option to pass an item
@ -287,10 +291,12 @@ var callItemEventHandlers = function(item, event, evt, ...args){
// .event([item, ..], ..) // .event([item, ..], ..)
// -> this // -> this
// //
//
// NOTE: item is compatible to .search(item, ..) spec, see that for more // NOTE: item is compatible to .search(item, ..) spec, see that for more
// details... // details...
// NOTE: triggering an event that matches several items will handle each // NOTE: triggering an event that matches several items will handle each
// item-parent chain individually, and independently... // item-parent chain individually, and independently when propagating
// the event up...
// NOTE: a parent that contains multiple items will get triggered multiple // NOTE: a parent that contains multiple items will get triggered multiple
// times, once per each item... // times, once per each item...
// NOTE: item events do not directly trigger the original caller's handlers // NOTE: item events do not directly trigger the original caller's handlers
@ -1816,12 +1822,25 @@ var BaseBrowserPrototype = {
// XXX // XXX
__event_handlers: null, __event_handlers: null,
// generic event infrastructure... // Generic event infrastructure...
// XXX add support for item events... //
// e.g. item.focus(..) -> root.focus(..) // Bind a handler to an event...
// XXX also need to design a means for this system to interact both // .on(event, func)
// .on(event, func, tag)
// -> this
//
// tag can be used to unregister several handlers in a single operation,
// see .off(..) for more info...
//
//
// NOTE: .one(..) has the same signature as .on(..) but will unregister
// the handler as soon as it is done...
//
// XXX need to design a means for this system to interact both
// ways with DOM events... // ways with DOM events...
// XXX need to bubble the event up through the nested browsers... // XXX need to bubble the event up through the nested browsers...
// XXX should we be able to trigger events from the item directly???
// i.e. .get(42).on('open', ...) instead of .get(42).open = ...
on: function(evt, handler, tag){ on: function(evt, handler, tag){
var handlers = this.__event_handlers = this.__event_handlers || {} var handlers = this.__event_handlers = this.__event_handlers || {}
handlers = handlers[evt] = handlers[evt] || [] handlers = handlers[evt] = handlers[evt] || []
@ -1830,12 +1849,12 @@ var BaseBrowserPrototype = {
&& (handler.tag = tag) && (handler.tag = tag)
return this return this
}, },
one: function(evt, handler){ one: function(evt, handler, tag){
var func = function(...args){ var func = function(...args){
handler.call(this, ...args) handler.call(this, ...args)
this.off(evt, func) this.off(evt, func)
} }
this.on(evt, func) this.on(evt, func, tag)
return this return this
}, },
// //
@ -1931,7 +1950,6 @@ var BaseBrowserPrototype = {
// //
// for docs on <event-object> see BrowserEvent(..) // for docs on <event-object> see BrowserEvent(..)
// //
// XXX need to make this workable with DOM events... (???)
trigger: function(evt, ...args){ trigger: function(evt, ...args){
var that = this var that = this
@ -1974,8 +1992,9 @@ var BaseBrowserPrototype = {
return this return this
}, },
// List events... // List events...
// XXX avoid expensive props... // XXX avoid going through expensive props...
get events(){ get events(){
var that = this var that = this
return Object.deepKeys(this) return Object.deepKeys(this)
@ -1988,10 +2007,15 @@ var BaseBrowserPrototype = {
.flat() }, .flat() },
// domain events/actions... // domain events/actions...
// XXX need a way to extend these to: //
// - be able to trigger an external (DOM) event... // Bind a handler to an event...
// - be able to be triggered from an external (DOM) event... // .focus(func)
// XXX should we trigger direct item's parent event??? // -> this
//
// Trigger an event...
// .focus(query[, ...])
// -> this
//
focus: makeItemEventMethod('focus', function(evt, items){ focus: makeItemEventMethod('focus', function(evt, items){
// blur .focused... // blur .focused...
this.focused this.focused
@ -2010,7 +2034,6 @@ var BaseBrowserPrototype = {
deselect: makeItemEventMethod('deselect', function(evt, items){ deselect: makeItemEventMethod('deselect', function(evt, items){
items.forEach(function(item){ items.forEach(function(item){
delete item.selected }) }), delete item.selected }) }),
open: makeItemEventMethod('open', function(evt, item){}), open: makeItemEventMethod('open', function(evt, item){}),
enter: makeItemEventMethod('enter', function(evt, item){}), enter: makeItemEventMethod('enter', function(evt, item){}),
// XXX can/should we unify these??? // XXX can/should we unify these???