Changeset - 7e91c49fb2d6
[Not reviewed]
default
0 1 0
dmcc - 22 years ago 2003-06-14 15:02:38

whoops, forgot this one
1 file changed with 80 insertions and 23 deletions:
0 comments (0 inline, 0 general)
flax/KeyboardComposer.py
Show inline comments
 
from __future__ import nested_scopes
 
import sys
 
import sys, time
 
sys.path.append('..')
 
from Widgets.Fadable import Fadable
 

	
 
from Tix import *
 
import math
 
from Timeline import LevelFrame
 

	
 
Submaster = LevelFrame
 
import math, atexit, pickle
 
from Submaster import Submasters, sub_maxes
 
import dmxclient
 
from uihelpers import toplevelat
 

	
 
nudge_keys = {
 
    'up' : list('qwertyuiop'),
 
@@ -19,14 +19,15 @@ class SubScale(Scale, Fadable):
 
    def __init__(self, master, *args, **kw):
 
        self.scale_var = kw.get('variable') or DoubleVar()
 
        kw.update({'variable' : self.scale_var,
 
                   'from' : 100, 'to' : 0, 'showvalue' : 0,
 
                   'sliderlength' : 10})
 
                   'from' : 1, 'to' : 0, 'showvalue' : 0,
 
                   'sliderlength' : 30, 'res' : 0.01,
 
                   'width' : 50})
 
        Scale.__init__(self, master, *args, **kw)
 
        Fadable.__init__(self, var=self.scale_var)
 
        Fadable.__init__(self, var=self.scale_var, wheel_step=0.05)
 

	
 
class SubmasterTk(Frame):
 
    def __init__(self, master, name, current_level):
 
        Frame.__init__(self, master)
 
        Frame.__init__(self, master, bd=1, relief='raised')
 
        self.slider_var = DoubleVar()
 
        self.slider_var.set(current_level)
 
        self.scale = SubScale(self, variable=self.slider_var, width=20)
 
@@ -38,8 +39,19 @@ class KeyboardComposer(Frame):
 
    def __init__(self, root, submasters, current_sub_levels=None):
 
        Frame.__init__(self, root)
 
        self.submasters = submasters
 
        self.current_sub_levels = current_sub_levels or {}
 
        self.current_sub_levels = {}
 
        if current_sub_levels:
 
            self.current_sub_levels = current_sub_levels
 
        else:
 
            try:
 
                self.current_sub_levels = \
 
                    pickle.load(file('.keyboardcomposer.savedlevels'))
 
            except IOError:
 
                pass
 

	
 
        self.draw_ui()
 
        self.send_levels_loop()
 
    def draw_ui(self):
 
        self.rows = [] # this holds Tk Frames for each row
 
        self.slider_vars = {} # this holds subname:sub Tk vars
 
        self.slider_table = {} # this holds coords:sub Tk vars
 
@@ -49,6 +61,10 @@ class KeyboardComposer(Frame):
 
        self.draw_sliders()
 
        self.highlight_row(self.current_row)
 
        self.rows[self.current_row].focus()
 

	
 
        self.refreshbutton = Button(self, text="Refresh", command=self.refresh)
 
        self.refreshbutton.pack(side=BOTTOM)
 
        self.stop_frequent_update_time = 0
 
    def make_key_hints(self):
 
        keyhintrow = Frame(self)
 

	
 
@@ -57,10 +73,11 @@ class KeyboardComposer(Frame):
 
                                  nudge_keys['down']):
 
            # what a hack!
 
            downkey = downkey.replace('semicolon', ';')
 
            upkey, downkey = (upkey.upper(), downkey.upper())
 

	
 
            # another what a hack!
 
            keylabel = Label(keyhintrow, text='%s\n%s' % (upkey, downkey), 
 
                width=3, font=('Arial', 12), bg='red', fg='white')
 
                width=8, font=('Arial', 12), bg='red', fg='white', anchor='c')
 
            keylabel.pack(side=LEFT, expand=1, fill=X)
 
            col += 1
 

	
 
@@ -99,11 +116,10 @@ class KeyboardComposer(Frame):
 
        row = self.rows[self.current_row]
 
        self.keyhints.pack_configure(before=row)
 
    def got_nudger(self, number, direction, full=0):
 
        print "got_nudger", number, direction, full
 
        subtk = self.slider_table[(self.current_row, number)]
 
        if direction == 'up':
 
            if full:
 
                subtk.scale.fade(100)
 
                subtk.scale.fade(1)
 
            else:
 
                subtk.scale.increase()
 
        else:
 
@@ -111,12 +127,20 @@ class KeyboardComposer(Frame):
 
                subtk.scale.fade(0)
 
            else:
 
                subtk.scale.decrease()
 
        # self.maybe_update()
 
    def maybe_update(self, dur=1.05):
 
        now = time.time()
 
        if now > self.stop_frequent_update_time:
 
            self.stop_frequent_update_time = now + dur
 
            self.send_frequent_updates()
 
        else:
 
            self.stop_frequent_update_time = now + dur
 
    def draw_sliders(self):
 
        self.tk_focusFollowsMouse()
 

	
 
        rowcount = -1
 
        col = 0
 
        for sub in self.submasters:
 
        for sub in self.submasters.get_all_subs():
 
            if col == 0: # make new row
 
                row = self.make_row()
 
                rowcount += 1
 
@@ -125,6 +149,8 @@ class KeyboardComposer(Frame):
 
            self.slider_table[(rowcount, col)] = subtk
 
            col += 1
 
            col %= 10
 

	
 
            subtk.slider_var.trace('w', lambda x, y, z: self.send_levels())
 
    def make_row(self):
 
        row = Frame(self, bd=2)
 
        row.pack(expand=1, fill=BOTH)
 
@@ -147,17 +173,48 @@ class KeyboardComposer(Frame):
 
    def get_levels(self):
 
        return dict([(name, slidervar.get()) 
 
            for name, slidervar in self.slider_vars.items()])
 
    def get_dmx_list(self):
 
        scaledsubs = [self.submasters.get_sub_by_name(sub) * level \
 
            for sub, level in self.get_levels().items()]
 

	
 
        maxes = sub_maxes(*scaledsubs)
 
        return maxes.get_dmx_list()
 
    def save(self):
 
        pickle.dump(self.get_levels(), 
 
                    file('.keyboardcomposer.savedlevels', 'w'))
 
    def send_frequent_updates(self):
 
        """called when we get a fade -- send events as quickly as possible"""
 
        if time.time() <= self.stop_frequent_update_time:
 
            self.send_levels()
 
            self.after(10, self.send_frequent_updates)
 
    def send_levels(self):
 
        print self.submasters.get_sub_by_name('frontwhite')
 
        levels = self.get_dmx_list()
 
        dmxclient.outputlevels(levels)
 
    def send_levels_loop(self):
 
        self.send_levels()
 
        self.after(1000, self.send_levels_loop)
 
    def refresh(self):
 
        self.save()
 
        self.submasters = Submasters()
 
        self.current_sub_levels = \
 
            pickle.load(file('.keyboardcomposer.savedlevels'))
 
        for r in self.rows:
 
            r.destroy()
 
        self.keyhints.destroy()
 
        self.refreshbutton.destroy()
 
        self.draw_ui()
 

	
 
if __name__ == "__main__":
 
    reds = Submaster('reds', {'red1' : 20, 'red2' : 30, 'red3' : 80})
 
    blues = Submaster('blues', {'blue1' : 60, 'blue2' : 80, 'blue3' : 20})
 

	
 
    subs = []
 
    for scenename in 'warmers house god spot explosion booth stageleft stageright donkey elvis sun fiddler satan lola bed treehouse motel6 deadmics suck burninggels firelights sodacan lighting homestar strongbad coachz pompom marzipan bubs thecheat'.split():
 
        subs.append(Submaster(scenename, {'dummy' : 20}))
 
    s = Submasters()
 

	
 
    root = Tk()
 
    root.wm_geometry('400x400')
 
    kc = KeyboardComposer(root, subs)
 
    tl = toplevelat("Keyboard Composer", existingtoplevel=root)
 
    kc = KeyboardComposer(tl, s)
 
    kc.pack(fill=BOTH, expand=1)
 
    mainloop()
 
    atexit.register(kc.save)
 
    try:
 
        mainloop()
 
    except KeyboardInterrupt:
 
        tl.destroy()
 
        sys.exit()
0 comments (0 inline, 0 general)