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