mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
153 lines
3.3 KiB
JavaScript
Executable File
153 lines
3.3 KiB
JavaScript
Executable File
/**********************************************************************
|
|
*
|
|
*
|
|
*
|
|
**********************************************************************/
|
|
|
|
//var DEBUG = DEBUG != null ? DEBUG : true
|
|
|
|
define(function(require){ var module = {}
|
|
console.log('>>> client')
|
|
|
|
doc = require('lib/keyboard').doc
|
|
|
|
data = require('data')
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
// attr can be:
|
|
// "name" - attribute name
|
|
// "name, name, ..."
|
|
// - string containign coma separated attribute names
|
|
// list - list of attribute names
|
|
//
|
|
// XXX add a callback here...
|
|
function proxy(attr, name){
|
|
// we can proxy multiple attrs...
|
|
attr = typeof(attr) == typeof('str')
|
|
? attr.split(',').map(function(e){ return e.trim() })
|
|
: attr
|
|
return function(){
|
|
var that = this
|
|
var args = arguments
|
|
attr.forEach(function(a){
|
|
a = that[a]
|
|
a[name].apply(a, args)
|
|
})
|
|
return this
|
|
}
|
|
}
|
|
|
|
function proxyMethods(obj, map){
|
|
var txt = ''
|
|
map = map == null ? obj : map
|
|
|
|
for(var attr in map){
|
|
var methods = map[attr]
|
|
methods = typeof(methods) == typeof('str') ? {attr: methods} : methods
|
|
for(var name in methods){
|
|
var txt = methods[name]
|
|
if(txt == null){
|
|
obj[name] = proxy(attr, name)
|
|
} else {
|
|
obj[name] = doc(txt, proxy(attr, name))
|
|
}
|
|
}
|
|
}
|
|
return obj
|
|
}
|
|
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
// This will:
|
|
// - provide an abstraction layer to data (proxy)
|
|
// - provide API docs usable for doc generation...
|
|
// - provide callbacks (???)
|
|
//
|
|
var ClientClassPrototype = {
|
|
}
|
|
|
|
|
|
|
|
var ClientPrototype = {
|
|
// this expects the folowing attrs:
|
|
//
|
|
// .data
|
|
//
|
|
|
|
// direct proxy methods...
|
|
focusImage: 'Focus image',
|
|
focusRibbon: 'Focus ribbon',
|
|
|
|
firstImage: 'Focus first image in current ribbon',
|
|
lastImage: 'Focus last image in current ribbon',
|
|
|
|
// XXX client-specific API...
|
|
// XXX
|
|
}
|
|
// XXX this is temporary...
|
|
// ...this will messup actual methods...
|
|
proxyMethods(ClientPrototype)
|
|
|
|
|
|
|
|
// XXX auto apply this...
|
|
function chainSelfAttrMethod(cls, attr, name, func){
|
|
return function(){
|
|
// NOTE: this is super, python-style but without multiple
|
|
// inheritance...
|
|
// ...that last part makes this more of a code reuse
|
|
// than a programming tool...
|
|
cls.__proto__[name].apply(this, arguments)
|
|
// call the encapsulated method...
|
|
this[attr][name].apply(this[attr], arguments)
|
|
if(func != null){
|
|
return func.apply(this, arguments)
|
|
}
|
|
return this
|
|
}
|
|
}
|
|
|
|
function chainSelfAttrMethods(obj, map){
|
|
for(var attr in map){
|
|
var methods = map[attr]
|
|
for(var name in methods){
|
|
obj[name] = doc(methods[name], chainSelfAttrMethod(obj, attr, name))
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
var ViewerPrototype = {
|
|
// this expects the folowing attrs:
|
|
//
|
|
// .ribbons
|
|
//
|
|
}
|
|
chainSelfAttrMethods(ViewerPrototype, {
|
|
ribbons: {
|
|
focusImage: 'Focus image',
|
|
focusRibbon: 'Focus ribbon',
|
|
},
|
|
})
|
|
ViewerPrototype.__proto__ = ClientPrototype
|
|
|
|
|
|
|
|
var Client =
|
|
module.Client = Object.create(ClientPrototype)
|
|
|
|
var Viewer =
|
|
module.Viewer = Object.create(ViewerPrototype)
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
* vim:set ts=4 sw=4 : */
|
|
return module })
|