plugins/python/modules/svgui/svgui_server.py
author laurent
Wed, 12 Aug 2009 11:46:22 +0200
changeset 371 b7cb57a2da08
child 381 5c0f34a9ab00
permissions -rw-r--r--
Adding new svgui support using twisted website HMI
Updating svgui example
#!/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)