Changeset - 3f9162973d60
[Not reviewed]
default
0 2 0
drewp@bigasterisk.com - 15 years ago 2010-06-19 18:51:29
drewp@bigasterisk.com
KC channel color support. use statements like sub:scoop :color "#ffaa77"
Ignore-this: 6862a42373695ce083dbd82166080be7
2 files changed with 27 insertions and 17 deletions:
0 comments (0 inline, 0 general)
bin/keyboardcomposer
Show inline comments
 
#!/usr/bin/python
 

	
 
from __future__ import division, nested_scopes
 
import cgi, os, sys, time, subprocess
 
from optparse import OptionParser
 
import webcolors, colorsys
 

	
 
from twisted.internet import reactor, tksupport
 
from twisted.web import xmlrpc, server, resource
 
from Tix import *
 
import Tix as tk
 
import pickle
 
@@ -49,35 +50,41 @@ class SubScale(Scale, Fadable):
 
        if self.scale_var.get() == 0:
 
            self['troughcolor'] = 'black'
 
        else:
 
            self['troughcolor'] = 'blue'
 

	
 
class SubmasterTk(Frame):
 
    def __init__(self, master, name, current_level):
 
        Frame.__init__(self, master, bd=1, relief='raised', bg='black')
 
        self.name = name
 
    def __init__(self, master, sub, current_level):
 
        bg = sub.graph.value(sub.uri, L9.color, default='#000000')
 
        rgb = webcolors.hex_to_rgb(bg)
 
        hsv = colorsys.rgb_to_hsv(*[x/255 for x in rgb])
 
        darkBg = webcolors.rgb_to_hex(tuple([x * 255 for x in colorsys.hsv_to_rgb(
 
            hsv[0], hsv[1], .3)]))
 
        Frame.__init__(self, master, bd=1, relief='raised', bg=bg)
 
        self.name = sub.name
 
        self.slider_var = DoubleVar()
 
        self.slider_var.set(current_level)
 
        self.scale = SubScale(self, variable=self.slider_var, width=20)
 
        namelabel = Label(self, text=name, font="Arial 7", bg='black',
 
        namelabel = Label(self, text=sub.name, font="Arial 7", bg=darkBg,
 
            fg='white', pady=0)
 
        namelabel.pack(side=TOP)
 
        levellabel = Label(self, textvariable=self.slider_var, font="Arial 7",
 
            bg='black', fg='white', pady=0)
 
        levellabel.pack(side=TOP)
 
        self.scale.pack(side=BOTTOM, expand=1, fill=BOTH)
 
        bindkeys(self, "<Control-Key-l>", self.launch_subcomposer)
 

	
 
    def launch_subcomposer(self, *args):
 
        subprocess.Popen(["bin/subcomposer", "--no-geometry", self.name])
 

	
 
class KeyboardComposer(Frame, SubClient):
 
    def __init__(self, root, submasters, current_sub_levels=None,
 
    def __init__(self, root, graph, submasters, current_sub_levels=None,
 
                 hw_sliders=True):
 
        Frame.__init__(self, root, bg='black')
 
        SubClient.__init__(self)
 
        self.graph = graph
 
        self.submasters = submasters
 
        self.name_to_subtk = {}
 
        self.current_sub_levels = {}
 
        self.current_row = 0
 
        if current_sub_levels is not None:
 
            self.current_sub_levels = current_sub_levels
 
@@ -135,27 +142,26 @@ class KeyboardComposer(Frame, SubClient)
 
    def draw_sliders(self):
 
        self.tk_focusFollowsMouse()
 

	
 
        rowcount = -1
 
        col = 0
 
        last_group = None
 
        graph = showconfig.getGraph()
 
        withgroups = sorted((graph.value(sub.uri, L9['group']), 
 
                             graph.value(sub.uri, L9['order']), 
 
        withgroups = sorted((self.graph.value(sub.uri, L9['group']), 
 
                             self.graph.value(sub.uri, L9['order']), 
 
                             sub)
 
            for sub in self.submasters.get_all_subs())
 

	
 
        for group, order, sub in withgroups:
 
            group = graph.value(sub.uri, L9['group'])
 
            group = self.graph.value(sub.uri, L9['group'])
 

	
 
            if col == 0 or group != last_group: # make new row
 
                row = self.make_row()
 
                rowcount += 1
 
                col = 0
 
            current_level = self.current_sub_levels.get(sub.name, 0)
 
            subtk = self.draw_sub_slider(row, col, sub.name, current_level)
 
            subtk = self.draw_sub_slider(row, col, sub, current_level)
 
            self.slider_table[(rowcount, col)] = subtk
 
            self.name_to_subtk[sub.name] = subtk
 

	
 
            def slider_changed(x, y, z, subtk=subtk,
 
                               col=col, sub=sub, rowcount=rowcount):
 
                subtk.scale.draw_indicator_colors()
 
@@ -167,18 +173,18 @@ class KeyboardComposer(Frame, SubClient)
 

	
 
            # initial position
 
            self.send_to_hw(sub.name, col + 1)
 
            col = (col + 1) % 8
 
            last_group = group
 

	
 
    def draw_sub_slider(self, row, col, name, current_level):
 
        subtk = SubmasterTk(row, name, current_level)
 
    def draw_sub_slider(self, row, col, sub, current_level):
 
        subtk = SubmasterTk(row, sub, current_level)
 
        subtk.place(relx=col / 8, rely=0, relwidth=1 / 8, relheight=1)
 
        self.setup_key_nudgers(subtk.scale)
 

	
 
        self.slider_vars[name] = subtk.slider_var
 
        self.slider_vars[sub.name] = subtk.slider_var
 
        return subtk
 

	
 
    def toggle_slider_connectedness(self):
 
        self.use_hw_sliders = not self.use_hw_sliders
 
        if self.use_hw_sliders:
 
            self.sliders.reopen()
 
@@ -436,22 +442,25 @@ if __name__ == "__main__":
 
    parser = OptionParser()
 
    parser.add_option('--nonpersistent', action="store_true",
 
                      help="don't load or save levels")
 
    parser.add_option('--no-sliders', action='store_true',
 
                      help="don't attach to hardware sliders")
 
    opts, args = parser.parse_args()
 

	
 
    graph = showconfig.getGraph()
 
    
 
    s = Submasters()
 
    s = Submasters(graph)
 

	
 
    root = Tk()
 
    tl = toplevelat("Keyboard Composer", existingtoplevel=root)
 

	
 
    startLevels = None
 
    if opts.nonpersistent:
 
        startLevels = {}
 
    kc = KeyboardComposer(tl, s, startLevels, hw_sliders=not opts.no_sliders)
 
    kc = KeyboardComposer(tl, graph, s, startLevels,
 
                          hw_sliders=not opts.no_sliders)
 
    kc.pack(fill=BOTH, expand=1)
 

	
 
    for helpline in ["Bindings: B3 mute; C-l edit levels in subcomposer"]:
 
        tk.Label(root,text=helpline, font="Helvetica -12 italic",
 
                 anchor='w').pack(side='top',fill='x')
 

	
light9/Submaster.py
Show inline comments
 
@@ -43,12 +43,13 @@ class Submaster:
 
            name = graph.label(sub)
 
        if graph is not None:
 
            # old code was passing leveldict as second positional arg
 
            assert isinstance(graph, Graph)
 
        self.name = name
 
        self.uri = sub
 
        self.graph = graph
 
        self.temporary = temporary
 
        if leveldict:
 
            self.levels = leveldict
 
        else:
 
            self.levels = {}
 
            self.reload(quiet=True, graph=graph)
 
@@ -212,23 +213,23 @@ def combine_subdict(subdict, name=None, 
 
        maxes.temporary = False
 

	
 
    return maxes
 

	
 
class Submasters:
 
    "Collection o' Submaster objects"
 
    def __init__(self):
 
    def __init__(self, graph):
 
        self.submasters = {}
 

	
 
        files = os.listdir(showconfig.subsDir())
 

	
 
        for filename in files:
 
            # we don't want these files
 
            if filename.startswith('.') or filename.endswith('~') or \
 
               filename.startswith('CVS'):
 
                continue
 
            self.submasters[filename] = Submaster(filename)
 
            self.submasters[filename] = Submaster(filename, graph=graph)
 
        print "loaded subs", self.submasters
 
    def get_all_subs(self):
 
        "All Submaster objects"
 
        l = self.submasters.items()
 
        l.sort()
 
        l = [x[1] for x in l]
0 comments (0 inline, 0 general)