Builder/RightGtkView.js
[app.Builder.js] / Builder / RightGtkView.js
index 6d2bc3d..5b23391 100755 (executable)
@@ -23,6 +23,7 @@ LeftPanel = imports.Builder.LeftPanel.LeftPanel;
 
 RightGtkView = new XObject({
         xtype : Gtk.VBox,
+        lastSrc : '',
         pack : [ 'append_page', new Gtk.Label({ label : "Gtk View" })  ],
         items : [
         
@@ -34,12 +35,13 @@ RightGtkView = new XObject({
                         
                         
                         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..
                             }
@@ -220,13 +222,33 @@ RightGtkView = new XObject({
             }
                 
         ],
-        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) {
@@ -235,19 +257,80 @@ RightGtkView = new XObject({
             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);
                 }
@@ -257,19 +340,35 @@ RightGtkView = new XObject({
                     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]));