laurent@371: #!/usr/bin/python laurent@371: # -*- coding: utf-8 -*- laurent@371: laurent@371: import os laurent@371: laurent@371: from nevow import rend, appserver, inevow, tags, loaders, athena laurent@371: import simplejson as json laurent@371: laurent@371: svgfile = '%(svgfile)s' laurent@371: laurent@371: svguiWidgets={} laurent@371: laurent@371: class SvguiWidget: laurent@371: laurent@371: def __init__(self, classname, back_id, **kwargs): laurent@371: self.classname = classname laurent@371: self.back_id = back_id laurent@371: self.attrs = kwargs.copy() laurent@371: self.lastattrs = kwargs.copy() laurent@371: self.inhibit = False laurent@371: self.changed = False laurent@371: laurent@371: def setattr(self, attrname, value): laurent@371: self.attrs[attrname] = value laurent@371: laurent@371: def getattr(self, attrname): laurent@371: return self.args.get(attrname, None) laurent@371: laurent@371: def update(self, **kwargs): laurent@371: for attrname, value in kwargs.iteritems(): laurent@371: if self.lastattrs.get(attrname, None) != value: laurent@371: self.changed = True laurent@371: self.attrs[attrname] = value laurent@371: self.lastattrs[attrname] = value laurent@371: interface = website.getHMI() laurent@371: if interface is not None and self.changed and not self.inhibit: laurent@371: self.changed = False laurent@371: interface.sendData(self) laurent@371: laurent@371: return self.attrs["state"] laurent@371: laurent@371: def convert_to_builtin_type(obj): laurent@371: # Convert objects to a dictionary of their representation laurent@371: d = { '__class__':obj.classname, laurent@371: 'back_id':obj.back_id, laurent@371: 'kwargs':json.dumps(obj.attrs), laurent@371: } laurent@371: return d laurent@371: laurent@371: def dataToSend(): laurent@371: gadgets = [] laurent@371: for gadget in svguiWidgets.values(): laurent@371: gadgets.append(unicode(json.dumps(gadget, default=convert_to_builtin_type, indent=2), 'ascii')) laurent@371: return gadgets laurent@371: laurent@371: laurent@371: class SVGUI_HMI(athena.LiveElement): laurent@371: jsClass = u"LiveSVGPage.LiveSVGWidget" laurent@371: laurent@371: docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[ laurent@371: tags.xml(loaders.xmlfile(os.path.join(WorkingDir, svgfile))), laurent@371: ]) laurent@371: laurent@371: def sendData(self,data): laurent@371: objDefer = self.callRemote('receiveData',unicode(json.dumps(data, default=convert_to_builtin_type, indent=2), 'ascii')) laurent@371: laurent@371: def initClient(self): laurent@371: self.callRemote('init', dataToSend()) laurent@371: laurent@371: def setattr(self, id, attrname, value): laurent@371: svguiWidgets[id].setattr(attrname, value) laurent@371: laurent@371: def SVGUI(*args, **kwargs): laurent@371: classname, back_id = args laurent@371: gad = svguiWidgets.get(back_id, None) laurent@371: if gad is None: laurent@371: gad = SvguiWidget(classname, back_id, **kwargs) laurent@371: svguiWidgets[back_id] = gad laurent@371: gadget = [unicode(json.dumps(gad, default=convert_to_builtin_type, indent=2), 'ascii')] laurent@371: interface = website.getHMI() laurent@371: if interface is not None: laurent@371: interface.callRemote('init', gadget) laurent@371: laurent@371: return gad.update(**kwargs)