diff -r ee802ef00ca5 -r b7cb57a2da08 plugins/python/modules/svgui/svgui_server.py --- /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)