|
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) |