author | Tero Marttila <terom@paivola.fi> |
Fri, 11 Apr 2014 22:22:11 +0300 | |
changeset 76 | ca10547ba9db |
parent 75 | baa33d32308e |
child 80 | 5254ba612630 |
permissions | -rw-r--r-- |
75 | 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) : |
|
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
42 |
if self.request.method == 'POST' : |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
43 |
self.color = tuple((int(x, 16) if x else 0) for x in ( |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
44 |
self.request.form.get('r'), |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
45 |
self.request.form.get('g'), |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
46 |
self.request.form.get('b'), |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
47 |
)) |
75 | 48 |
|
49 |
r, g, b = self.color |
|
50 |
||
51 |
self.app.dmx_color(r, g, b, 255) |
|
52 |
||
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
53 |
else : |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
54 |
self.color = None |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
55 |
|
75 | 56 |
log.info("%s", self.color) |
57 |
||
58 |
def render (self) : |
|
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
59 |
if self.color : |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
60 |
r, g, b = self.color |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
61 |
else : |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
62 |
r = g = b = None |
75 | 63 |
|
64 |
def color_input (name, value) : |
|
65 |
color = dict(r=0, g=0, b=0) |
|
66 |
bgcolor = dict(r=0, g=0, b=0) |
|
67 |
||
68 |
if value : |
|
69 |
color[name] = value |
|
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
70 |
alpha = value / 2 |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
71 |
else : |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
72 |
alpha = 0 |
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
73 |
|
75 | 74 |
bgcolor[name] = 255 |
75 |
||
76 |
return html.input(type='text', name=name, class_='form-control', placeholder=name, |
|
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
77 |
value = '{v:02x}'.format(v=value) if value else None, |
75 | 78 |
#style = 'background-color: #{r:02x}{g:02x}{b:02x}'.format(**color), |
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
79 |
style = 'background-color: rgba({r}, {g}, {b}, {a})'.format(a=alpha, **bgcolor), |
75 | 80 |
) |
81 |
||
82 |
return html.div(class_='container')( |
|
83 |
html.div(class_='panel')( |
|
84 |
html.form(action='.', method='POST', class_='form-horizontal')( |
|
85 |
html.div(class_='form-group')( |
|
86 |
html.label(for_='color', class_='control-label')("Color"), |
|
87 |
color_input('r', r), |
|
88 |
color_input('g', g), |
|
89 |
color_input('b', b), |
|
90 |
), |
|
91 |
html.div(class_='form-group')( |
|
92 |
html.button(type='submit', class_='btn btn-primary')("Go"), |
|
93 |
), |
|
94 |
) |
|
95 |
) |
|
96 |
) |
|
97 |
||
98 |
class DMXWebApplication (pvl.web.Application) : |
|
99 |
URLS = urls.Map(( |
|
100 |
urls.rule('/', Handler), |
|
101 |
)) |
|
102 |
||
103 |
def __init__ (self, dmx, **opts) : |
|
104 |
super(DMXWebApplication, self).__init__(**opts) |
|
105 |
||
106 |
self.dmx = dmx |
|
107 |
||
108 |
def dmx_color (self, r, g, b, a=255) : |
|
109 |
for c in (1, 30) : |
|
76
ca10547ba9db
qmsk.dmx.web: separate r/g/b/
Tero Marttila <terom@paivola.fi>
parents:
75
diff
changeset
|
110 |
# XXX: this is four separate commands... each one flushes... |
75 | 111 |
self.dmx[c + 0:c + 26:3] = r |
112 |
self.dmx[c + 1:c + 26:3] = g |
|
113 |
self.dmx[c + 2:c + 26:3] = b |
|
114 |
self.dmx[c + 28] = 255 |
|
115 |