Files @ c58e781829a3
Branch filter:

Location: light9/bin/lightsim

David McClosky
keyboardcomposer: sort subs by group, then order, then name
#!/usr/bin/python

from __future__ import division
import run_local

from rdflib import Literal, URIRef
from twisted.internet import reactor, tksupport
from twisted.internet.task import LoopingCall
from twisted.web.xmlrpc import Proxy
import xmlrpclib, sys, logging
log = logging.getLogger()
logging.basicConfig(format="%(asctime)s %(levelname)-5s %(name)s %(filename)s:%(lineno)d: %(message)s")
log.setLevel(logging.DEBUG)
import Tkinter as tk
from light9 import networking, Patch, showconfig, dmxclient, updatefreq, prof
from light9.namespaces import L9
from louie import dispatcher

try:
    from OpenGL import Tk as Togl
    from OpenGL.GL import *
except ImportError:
    sys.path.append("/usr/lib/python2.4/site-packages/OpenGL/Tk/linux2-tk8.4")
    from OpenGL.GL import *
    import Togl
  
from lightsim.openglsim import Surface

def poll(graph, serv, pollFreq):
    pollFreq.update()
    dispatcher.send("status", key="pollFreq", value=str(pollFreq))
    d = serv.callRemote("currentlevels", dmxclient._id)
    def received(dmxLevels):
        level = {} # filename : level
        for i, lev in enumerate(dmxLevels):
            if lev == 0:
                continue

            try:
                chan = Patch.get_channel_uri(Patch.get_channel_name(i + 1))
            except KeyError:
                continue

            for lyr in graph.objects(chan, L9['previewLayer']):
                for imgPath in graph.objects(lyr, L9['path']):
                    level[str(imgPath)] = lev

        ogl.newLevels(levels=level)
    d.addCallback(received)
    return d

class StatusKeys(tk.Frame):
    # watch out- this might be an accidental redo of what curvecalc
    # has. Or, maybe CC should use this obj
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        dispatcher.connect(self.status, "status")
        self.row = {} # key name : (Frame, value Label)
        
    def status(self, key, value):
        if key not in self.row:
            f = tk.Frame(self)
            f.pack(side='top')
            tk.Label(f, text=key, font="arial 8").pack(side='left')
            l = tk.Label(f, text=value, font="arial 8")
            l.pack(side='left')
            self.row[key] = (f, l)
        else:
            row, lab = self.row[key]
            lab.config(text=value)

root = tk.Frame()
root.pack(expand=True, fill='both')
pollFreq = updatefreq.Updatefreq(samples=5)
graph = showconfig.getGraph()
filenames = []
for lyr in graph.objects(None, L9['previewLayer']):
    for p in graph.objects(lyr, L9['path']):
        filenames.append(str(p))

ogl = Surface(root, filenames, width=120, height=80, imgRescaleTo=128)
ogl.pack(side='top', expand=True, fill='both')

sk = StatusKeys(root)
sk.pack(side='top', fill='x')



serv = Proxy(networking.dmxServerUrl())
LoopingCall(poll, graph, serv, pollFreq).start(.1)

top = root.winfo_toplevel()
top.wm_title(dmxclient._id)
top.bind("<Control-Key-q>",lambda ev: reactor.stop)
top.bind("<Destroy>",lambda ev: reactor.stop)
top.protocol('WM_DELETE_WINDOW', reactor.stop)
tksupport.install(ogl, ms=20)

prof.run(reactor.run, profile=False)