RightGtkView = new XObject({
xtype : Gtk.VBox,
+ lastSrc : '',
pack : [ 'append_page', new Gtk.Label({ label : "Gtk View" }) ],
items : [
xtype: Gtk.Button,
- label : 'Redraw',
+ label : 'Show in New Window',
pack : [ 'pack_start', false, false, 0 ],
listeners : {
// pressed...
'button-press-event' : function(w, ev ){
/// dump..
+ RightGtkView.showInWindow();
return true;
// show the MidPropTree..
}
}
],
- renderJS : function(data)
+
+ showInWindow: function ()
{
- /**
- * first effort..
- * sandbox it? - nope then will have dificulting passing. stuff aruond..
- *
- */
+ var src= this.lastSrc;
+ if (!this.lastSrc.length) {
+ return;
+ }
+ var x = new imports.sandbox.Context();
+ x.add_globals();
+ print(src);
+ try {
+ x.eval(src);
+ } catch( e) {
+ print(e.toString());
+ return;
+ }
+
+ var _top = x.get_global_object()._top;
+
+ _top.el.set_screen(Gdk.Screen.get_default()); // just in case..
+ _top.el.show_all();
+ if (_top.el.popup) {
+ _top.el.popup(null, null, null, null, 3, null);
+ }
+ },
+
+ buildJS: function(data) {
var i = [ 'Gtk', 'Gdk', 'Pango' ];
var src = "";
i.forEach(function(e) {
src += "XObject = imports.XObject.XObject;\n"; // path?!!?
src += '_top=new XObject('+ this.mungeToString(data) + ')\n;';
- src += '_top.el.show_all();\n';
+ src += '_top.init();\n';
+ print(src);
+ this.lastSrc = src;
+ return src;
+ },
+
+ renderJS : function(data)
+ {
+ // can we mess with data?!?!?
+
+ /**
+ * first effort..
+ * sandbox it? - nope then will have dificulting passing. stuff aruond..
+ *
+ */
+ if (!data) {
+ return;
+ }
+ var src = this.buildJS(data);
var x = new imports.sandbox.Context();
x.add_globals();
//x.get_global_object().a = "hello world";
- print(src);
- x.eval(src);
+
+ try {
+ x.eval(src);
+ } catch( e) {
+ print(e.toString());
+ return;
+ }
+
+ var r = new Gdk.Rectangle();
+ var _top = x.get_global_object()._top;
+
+ _top.el.set_screen(Gdk.Screen.get_default()); // just in case..
+ _top.el.show_all();
+ if (_top.el.popup) {
+ _top.el.popup(null, null, null, null, 3, null);
+ }
+
+
+
+ var pb = _top.el.get_snapshot(r);
+ if (!pb) {
+ return;
+ }
+ _top.el.hide();
+ _top.el.destroy();
+ x._top = false;
+ var Window = imports.Builder.Window.Window;
+ var gc = new Gdk.GC.c_new(Window.el.window);
+
+ // 10 points all round..
+ var full = new Gdk.Pixmap.c_new (Window.el.window, r.width+20, r.height+20, pb.get_depth());
+ // draw a white background..
+ // gc.set_rgb_fg_color({ red: 0, white: 0, black : 0 });
+ Gdk.draw_rectangle(full, gc, true, 0, 0, r.width+20, r.height+20);
+ // paint image..
+ Gdk.draw_drawable (full, gc, pb, 0, 0, 10, 10, r.width, r.height);
+ // boxes..
+ //gc.set_rgb_fg_color({ red: 255, white: 255, black : 255 });
+ Gdk.draw_rectangle(full, gc, true, 0, 0, 10, 10);
+ this.get('view').el.set_from_pixmap(full, null);
+ //var img = new Gtk.Image.from_file("/home/alan/solarpanels.jpeg");
+
+
},
- mungeToString: function(obj)
+ mungeToString: function(obj, isListener)
{
var keys = [];
var isArray = false;
- if (obj.constructor == Array) {
+ isListener = isListener || false;
+
+ if (obj.constructor.toString() === Array.toString()) {
for (var i= 0; i < obj.length; i++) {
keys.push(i);
}
keys.push(i);
}
}
-
- var _this = this;
var els = [];
+ var skip = [];
+ if (!isArray &&
+ typeof(obj['|xns']) != 'undefined' &&
+ typeof(obj['xtype']) != 'undefined'
+ ) {
+ els.push('xtype: '+ obj['|xns'] + '.' + obj['xtype']);
+ skip.push('|xns','xtype');
+ }
+
+ var _this = this;
+
keys.forEach(function(i) {
var el = obj[i];
+ if (!isArray && skip.indexOf(i) > -1) {
+ return;
+ }
+ if (isListener) {
+ els.push(JSON.stringify(i) + ":" + obj[i]);
+ return;
+ }
if (typeof(i) == 'string' && i[0] == '|') {
// does not hapepnd with arrays..
els.push(JSON.stringify(i.substring(1)) + ":" + obj[i]);
return;
}
- var left = isArray ? ('' +i) : (JSON.stringify(i) + " : " )
+ var left = isArray ? '' : (JSON.stringify(i) + " : " )
if (typeof(el) == 'object') {
- els.push(left + _this.mungeToString(el));
+ els.push(left + _this.mungeToString(el, i == 'listeners'));
return;
}
els.push(JSON.stringify(i) + ":" + JSON.stringify(obj[i]));