qmsk/dmx/web.py
changeset 75 baa33d32308e
child 76 ca10547ba9db
equal deleted inserted replaced
74:9031dafa39d6 75:baa33d32308e
       
     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