|
1 import pvl.web |
|
2 from pvl.web import urls, html |
|
3 |
|
4 import logging; log = logging.getLogger('qmsk.dmx.web') |
|
5 |
|
6 class Handler (pvl.web.Handler) : |
|
7 # Bootstrap |
|
8 DOCTYPE = 'html' |
|
9 HTML_XMLNS = None |
|
10 HTML_LANG = 'en' |
|
11 CSS = ( |
|
12 '//code.jquery.com/ui/1.10.4/themes/ui-darkness/jquery-ui.css', |
|
13 '//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css', |
|
14 ) |
|
15 JS = ( |
|
16 '//code.jquery.com/jquery-2.1.0.js', |
|
17 '//code.jquery.com/ui/1.10.4/jquery-ui.js', |
|
18 '//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js', |
|
19 ) |
|
20 |
|
21 STYLE = """ |
|
22 body { |
|
23 padding-top: 2em; |
|
24 text-align: center; |
|
25 } |
|
26 |
|
27 .container { |
|
28 padding: 2em 1em; |
|
29 text-align: left; |
|
30 } |
|
31 |
|
32 .panel { |
|
33 width: 30em; |
|
34 margin: 1em auto; |
|
35 } |
|
36 """ |
|
37 |
|
38 # test |
|
39 TITLE = u"Hello World" |
|
40 |
|
41 def process (self) : |
|
42 self.color = ( |
|
43 self.request.form.get('r'), |
|
44 self.request.form.get('g'), |
|
45 self.request.form.get('b'), |
|
46 ) |
|
47 |
|
48 self.color = tuple((int(x, 16) if x else None) for x in self.color) |
|
49 |
|
50 if self.request.method == 'POST' : |
|
51 r, g, b = self.color |
|
52 |
|
53 self.app.dmx_color(r, g, b, 255) |
|
54 |
|
55 log.info("%s", self.color) |
|
56 |
|
57 def render (self) : |
|
58 r, g, b = self.color |
|
59 |
|
60 def color_input (name, value) : |
|
61 color = dict(r=0, g=0, b=0) |
|
62 bgcolor = dict(r=0, g=0, b=0) |
|
63 |
|
64 if value : |
|
65 color[name] = value |
|
66 bgcolor[name] = 255 |
|
67 |
|
68 return html.input(type='text', name=name, class_='form-control', placeholder=name, |
|
69 value = '{:02x}'.format(value), |
|
70 #style = 'background-color: #{r:02x}{g:02x}{b:02x}'.format(**color), |
|
71 style = 'background-color: rgba({r}, {g}, {b}, {a})'.format(a=value, **bgcolor), |
|
72 ) |
|
73 |
|
74 return html.div(class_='container')( |
|
75 html.div(class_='panel')( |
|
76 html.form(action='.', method='POST', class_='form-horizontal')( |
|
77 html.div(class_='form-group')( |
|
78 html.label(for_='color', class_='control-label')("Color"), |
|
79 color_input('r', r), |
|
80 color_input('g', g), |
|
81 color_input('b', b), |
|
82 ), |
|
83 html.div(class_='form-group')( |
|
84 html.button(type='submit', class_='btn btn-primary')("Go"), |
|
85 ), |
|
86 ) |
|
87 ) |
|
88 ) |
|
89 |
|
90 class DMXWebApplication (pvl.web.Application) : |
|
91 URLS = urls.Map(( |
|
92 urls.rule('/', Handler), |
|
93 )) |
|
94 |
|
95 def __init__ (self, dmx, **opts) : |
|
96 super(DMXWebApplication, self).__init__(**opts) |
|
97 |
|
98 self.dmx = dmx |
|
99 |
|
100 def dmx_color (self, r, g, b, a=255) : |
|
101 for c in (1, 30) : |
|
102 self.dmx[c + 0:c + 26:3] = r |
|
103 self.dmx[c + 1:c + 26:3] = g |
|
104 self.dmx[c + 2:c + 26:3] = b |
|
105 self.dmx[c + 28] = 255 |
|
106 |