qmsk/dmx/web.py
author Tero Marttila <terom@paivola.fi>
Sun, 20 Apr 2014 23:51:57 +0300
changeset 80 5254ba612630
parent 76 ca10547ba9db
child 82 b5878197d017
permissions -rw-r--r--
dmx-web: slightly better RGB colorpicker control..
import pvl.web
from pvl.web import urls, html

import logging; log = logging.getLogger('qmsk.dmx.web')

class Handler (pvl.web.Handler) :
    # Bootstrap
    DOCTYPE = 'html'
    HTML_XMLNS = None
    HTML_LANG = 'en'
    CSS = (
            '//code.jquery.com/ui/1.10.4/themes/ui-darkness/jquery-ui.css',
            '//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css',
    )
    JS = (
            '//code.jquery.com/jquery-2.1.0.js',
            '//code.jquery.com/ui/1.10.4/jquery-ui.js',
            '//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js',
            
            '/static/color-slider.js',
    )

    STYLE = """
body {
    padding-top: 2em;
    text-align: center;
}

.container {
    padding: 2em 1em;
    text-align: left;
}

.panel {
    width: 30em;
    margin: 1em auto;
}

input.color-control {
    width: 5em;
}

div#color {
    width: 5em;
    height: 5em;

    margin: 1em auto;
}

div.color-slider {
    margin: 1em;
}

div.color-slider#slider-r .ui-slider-range {
    background: #ff0000;
}

div.color-slider#slider-g .ui-slider-range {
    background: #00ff00;
}

div.color-slider#slider-b .ui-slider-range {
    background: #0000ff;
}
    """

    # test
    TITLE = u"DMX Control"

    def process (self) :
        if self.request.method == 'POST' :
            self.color = tuple((int(x, 16) if x else 0) for x in (
                    self.request.form.get('r'),
                    self.request.form.get('g'),
                    self.request.form.get('b'),
            ))

            r, g, b = self.color

            self.app.dmx_color(r, g, b, 255)

        else :
            self.color = None

        log.info("%s", self.color)

    def render (self) :
        if self.color :
            r, g, b = self.color
        else :
            r = g = b = None

        def color_swatch () :
            return html.div(id='color',
                    style='background-color: rgb({r}, {g}, {b})'.format(r=r, g=g, b=b)
            )(' '),

        def color_input (name, value) :
            color = dict(r=0, g=0, b=0)
            bgcolor = dict(r=0, g=0, b=0)

            if value :
                color[name] = value
                alpha = value / 255.0
            else :
                alpha = 0

            bgcolor[name] = 255

            return html.input(type='text', name=name,
                    class_      = 'form-control color-control',
                    placeholder = name,
                    id          = name,

                    value   = '{v:02x}'.format(v=value) if value else None,
                    style   = 'background-color: rgba({r}, {g}, {b}, {a:0.2f})'.format(a=alpha, **bgcolor),
            )

        return html.div(class_='container')(
            html.div(class_='panel')(
                color_swatch(),
                html.div(id='slider-r', class_='color-slider')(' '),
                html.div(id='slider-g', class_='color-slider')(' '),
                html.div(id='slider-b', class_='color-slider')(' '),
                html.form(action='.', method='POST', class_='form-inline')(
                       #html.label(for_='color', class_='control-label')("Color"),
                    html.div(class_='form-group')(
                       color_input('r', r),
                    ),
                    html.div(class_='form-group')(
                       color_input('g', g),
                    ),
                    html.div(class_='form-group')(
                       color_input('b', b),
                    ),
                    html.div(class_='form-group')(
                        html.button(type='submit', class_='btn btn-primary')("Go"),
                    ),
                )
            )
        )

class DMXWebApplication (pvl.web.Application) :
    URLS = urls.Map((
        urls.rule('/',          Handler),
    ))

    def __init__ (self, dmx, **opts) :
        super(DMXWebApplication, self).__init__(**opts)

        self.dmx = dmx

    def dmx_color (self, r, g, b, a=255) :
        for c in (1, 30) :
            # XXX: separate commands... each one flushes...
            self.dmx[c + 0:c + 26] = (r, g, b)
            self.dmx[c + 27] = (0, a)