plugins/python/modules/svgui/svgui_server.py
changeset 371 b7cb57a2da08
child 381 5c0f34a9ab00
equal deleted inserted replaced
370:ee802ef00ca5 371:b7cb57a2da08
       
     1 #!/usr/bin/python
       
     2 # -*- coding: utf-8 -*-
       
     3 
       
     4 import os
       
     5 
       
     6 from nevow import rend, appserver, inevow, tags, loaders, athena
       
     7 import simplejson as json
       
     8 
       
     9 svgfile = '%(svgfile)s'
       
    10 
       
    11 svguiWidgets={}
       
    12 
       
    13 class SvguiWidget:
       
    14     
       
    15     def __init__(self, classname, back_id, **kwargs):
       
    16         self.classname = classname
       
    17         self.back_id = back_id
       
    18         self.attrs = kwargs.copy()
       
    19         self.lastattrs = kwargs.copy()
       
    20         self.inhibit = False
       
    21         self.changed = False
       
    22 
       
    23     def setattr(self, attrname, value):
       
    24         self.attrs[attrname] = value
       
    25         
       
    26     def getattr(self, attrname):
       
    27         return self.args.get(attrname, None)
       
    28 
       
    29     def update(self, **kwargs):
       
    30         for attrname, value in kwargs.iteritems():
       
    31             if self.lastattrs.get(attrname, None) != value:
       
    32                 self.changed = True
       
    33                 self.attrs[attrname] = value
       
    34                 self.lastattrs[attrname] = value
       
    35         interface = website.getHMI()
       
    36         if interface is not None and self.changed and not self.inhibit:
       
    37             self.changed = False
       
    38             interface.sendData(self)
       
    39         
       
    40         return self.attrs["state"]
       
    41 
       
    42 def convert_to_builtin_type(obj):
       
    43     # Convert objects to a dictionary of their representation
       
    44     d = { '__class__':obj.classname,
       
    45           'back_id':obj.back_id,
       
    46           'kwargs':json.dumps(obj.attrs),
       
    47           }
       
    48     return d
       
    49 
       
    50 def dataToSend():
       
    51     gadgets = []
       
    52     for gadget in svguiWidgets.values():
       
    53         gadgets.append(unicode(json.dumps(gadget, default=convert_to_builtin_type, indent=2), 'ascii'))
       
    54     return gadgets
       
    55 
       
    56 
       
    57 class SVGUI_HMI(athena.LiveElement):
       
    58     jsClass = u"LiveSVGPage.LiveSVGWidget"
       
    59     
       
    60     docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[                                    
       
    61                                          tags.xml(loaders.xmlfile(os.path.join(WorkingDir, svgfile))),
       
    62                                          ])
       
    63 
       
    64     def sendData(self,data):
       
    65         objDefer = self.callRemote('receiveData',unicode(json.dumps(data, default=convert_to_builtin_type, indent=2), 'ascii'))
       
    66 
       
    67     def initClient(self):
       
    68         self.callRemote('init', dataToSend())
       
    69     
       
    70     def setattr(self, id, attrname, value):
       
    71         svguiWidgets[id].setattr(attrname, value)
       
    72 
       
    73 def SVGUI(*args, **kwargs):
       
    74     classname, back_id = args
       
    75     gad = svguiWidgets.get(back_id, None)
       
    76     if gad is None:
       
    77         gad = SvguiWidget(classname, back_id, **kwargs)
       
    78         svguiWidgets[back_id] = gad
       
    79         gadget = [unicode(json.dumps(gad, default=convert_to_builtin_type, indent=2), 'ascii')]
       
    80         interface = website.getHMI()
       
    81         if interface is not None:
       
    82             interface.callRemote('init', gadget)
       
    83 
       
    84     return gad.update(**kwargs)