plugins/python/modules/svgui/svgui_server.py
changeset 371 b7cb57a2da08
child 381 5c0f34a9ab00
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/python/modules/svgui/svgui_server.py	Wed Aug 12 11:46:22 2009 +0200
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+
+from nevow import rend, appserver, inevow, tags, loaders, athena
+import simplejson as json
+
+svgfile = '%(svgfile)s'
+
+svguiWidgets={}
+
+class SvguiWidget:
+    
+    def __init__(self, classname, back_id, **kwargs):
+        self.classname = classname
+        self.back_id = back_id
+        self.attrs = kwargs.copy()
+        self.lastattrs = kwargs.copy()
+        self.inhibit = False
+        self.changed = False
+
+    def setattr(self, attrname, value):
+        self.attrs[attrname] = value
+        
+    def getattr(self, attrname):
+        return self.args.get(attrname, None)
+
+    def update(self, **kwargs):
+        for attrname, value in kwargs.iteritems():
+            if self.lastattrs.get(attrname, None) != value:
+                self.changed = True
+                self.attrs[attrname] = value
+                self.lastattrs[attrname] = value
+        interface = website.getHMI()
+        if interface is not None and self.changed and not self.inhibit:
+            self.changed = False
+            interface.sendData(self)
+        
+        return self.attrs["state"]
+
+def convert_to_builtin_type(obj):
+    # Convert objects to a dictionary of their representation
+    d = { '__class__':obj.classname,
+          'back_id':obj.back_id,
+          'kwargs':json.dumps(obj.attrs),
+          }
+    return d
+
+def dataToSend():
+    gadgets = []
+    for gadget in svguiWidgets.values():
+        gadgets.append(unicode(json.dumps(gadget, default=convert_to_builtin_type, indent=2), 'ascii'))
+    return gadgets
+
+
+class SVGUI_HMI(athena.LiveElement):
+    jsClass = u"LiveSVGPage.LiveSVGWidget"
+    
+    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[                                    
+                                         tags.xml(loaders.xmlfile(os.path.join(WorkingDir, svgfile))),
+                                         ])
+
+    def sendData(self,data):
+        objDefer = self.callRemote('receiveData',unicode(json.dumps(data, default=convert_to_builtin_type, indent=2), 'ascii'))
+
+    def initClient(self):
+        self.callRemote('init', dataToSend())
+    
+    def setattr(self, id, attrname, value):
+        svguiWidgets[id].setattr(attrname, value)
+
+def SVGUI(*args, **kwargs):
+    classname, back_id = args
+    gad = svguiWidgets.get(back_id, None)
+    if gad is None:
+        gad = SvguiWidget(classname, back_id, **kwargs)
+        svguiWidgets[back_id] = gad
+        gadget = [unicode(json.dumps(gad, default=convert_to_builtin_type, indent=2), 'ascii')]
+        interface = website.getHMI()
+        if interface is not None:
+            interface.callRemote('init', gadget)
+
+    return gad.update(**kwargs)