mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-04 13:20:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			152 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
* 
 | 
						|
*
 | 
						|
*
 | 
						|
**********************************************************************/
 | 
						|
 | 
						|
//var DEBUG = DEBUG != null ? DEBUG : true
 | 
						|
 | 
						|
define(function(require){ var module = {}
 | 
						|
 | 
						|
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 })
 |