Advertisement
whitequark

Untitled

May 7th, 2011
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.59 KB | None | 0 0
  1. var QMeta = ruby.define_module("QMeta");
  2.  
  3. function wrapQtObject(object) {
  4.   if(typeof object == "number") {
  5.     return object;
  6.   } else if(object == null) {
  7.     return ruby.builtin.Qnil;
  8.   } else if(object == true) {
  9.     return ruby.builtin.Qtrue;
  10.   } else if(object == false) {
  11.     return ruby.builtin.Qfalse;
  12.   } else if(typeof object == "string") {
  13.     return ruby.string_new(object);
  14.   } else if(typeof object == "array") {
  15.     var new_ary = [];
  16.     for(var i = 0; i < object.length; i++)
  17.       new_ary.push(wrapQtObject(object[i]);
  18.     return new_ary;
  19.   } else { // Qt Object
  20.     var qtKlass = getQtClass(object.metaObject);
  21.     return {
  22.       klass: qtKlass,
  23.       qt_internal: object,
  24.     };
  25.   }
  26. }
  27.  
  28. function unwrapRubyObject(object) {
  29.   if(object.klass == ruby.c.Fixnum) {
  30.     return object;
  31.   } else if(object == ruby.builtin.Qnil) {
  32.     return null;
  33.   } else if(object == ruby.builtin.Qtrue) {
  34.     return true;
  35.   } else if(object == ruby.builtin.Qfalse) {
  36.     return false;
  37.   } else if(object.klass == ruby.c.String) {
  38.     return object.value;
  39.   } else if(object.klass == ruby.c.Array) {
  40.     var new_ary = [];
  41.     for(var i = 0; i < object.length; i++)
  42.       new_ary.push(unwrapRubyObject(object[i]);
  43.     return new_ary;
  44.   } else if(object.qt_internal) {
  45.     return object.qt_internal;
  46.   } else {
  47.     throw new Error("unwrapRubyObject: cannot unwrap " + ruby.obj_classname(object));
  48.   }
  49. }
  50.  
  51. function getQtClass(metaObject) {
  52.   if(ruby.const_defined(QMeta, metaObject.className))
  53.     return ruby.const_get(QMeta, metaObject.className);
  54.  
  55.   var superklass = metaObject.superClass;
  56.   if(superklass) superklass = makeQtClass(superklass);
  57.  
  58.   var klass = ruby.define_class_under(QMeta, metaObject.className, superklass);
  59.  
  60.   for(var i = metaObject.propertyOffset; i < metaObject.propertyCount; i++) {
  61.     var property = metaObject.properties[i];
  62.  
  63.     if(property.isReadable) {
  64.       ruby.define_method(klass, property.name, 0, function(self) {
  65.         return wrapQtObject(self.qt_internal[property.name]);
  66.       });
  67.     }
  68.  
  69.     if(property.isWritable) {
  70.       ruby.define_method(klass, property.name + "=", 1, function(self, value) {
  71.         self.qt_internal[property.name] = unwrapRubyObject(value);
  72.       });
  73.     }
  74.   }
  75.  
  76.   for(var i = metaObject.propertyOffset; i < metaObject.methodCount; i++) {
  77.     var method = metaObject.methods[i];
  78.  
  79.     ruby.define_method(klass, method.match(/^[^(]+/)[0], -1, function(self, args) {
  80.       return wrapQtObject(self.qt_internal.apply(self.qt_internal, unwrapRubyObject(args)));
  81.     });
  82.   }
  83. };
  84.  
  85. var $i = { print: print };
  86.  
  87. debugger;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement