Mercurial > code > home > repos > light9
diff light8/Subs.py @ 0:45b12307c695
Initial revision
author | drewp |
---|---|
date | Wed, 03 Jul 2002 09:37:57 +0000 |
parents | |
children | f974a462133f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light8/Subs.py Wed Jul 03 09:37:57 2002 +0000 @@ -0,0 +1,252 @@ +from Patch import * +from time import time +from Tix import * +from types import TupleType + +stdfont = ('Arial', 8) + +class Param: # abstract + def get_value(self): + pass + def set_value(self, v): + pass + def draw_tk(self, frame): + pass + def __getstate__(self): + return {'value' : self.get_value()} + def __setstate__(self, dict): + self.value = StringVar() + self.set_value(dict['value']) + +class CheckboxParam(Param): + def __init__(self, initial=0): + self.value = IntVar() + self.value.set(initial) + def get_value(self): + return self.value.get() + def draw_tk(self, frame): + self.c = Checkbutton(frame, variable=self.value) + self.c.pack() + +class SliderParam(Param): + def __init__(self, range=(0, 1), res=0.01, initial=0, orient='v', + **options): + self.value = DoubleVar() + self.value.set(initial) + self.options = {'res' : res, 'to' : range[0], 'from' : range[1], + 'orient' : orient, + 'font' : stdfont, 'length' : 50, 'sliderlength' : 10, + 'width' : 10} + self.options.update(options) + def get_value(self): + return self.value.get() + def draw_tk(self, frame): + s = Scale(frame, variable=self.value, **self.options) + s.pack() + +class TextParam(Param): + def __init__(self, initial=''): + self.value = StringVar() + self.value.set(initial) + def get_value(self): + return self.value.get() + def select_all(self, evt): + self.e.select_range(0, END) + def unfocus(self, evt): + self.frame.focus() + def draw_tk(self, frame): + self.frame = frame + self.e = Entry(frame, textvariable=self.value) + self.e.bind("<Return>", self.unfocus) + self.e.pack() + +class ListParam(Param): + def __init__(self, options=(), multiple=0, initial=''): + self.value = StringVar() + self.value.set(initial) + self.options = options + if multiple: + self.selectmode = 'MULTIPLE' + else: + self.selectmode = 'SINGLE' + def get_value(self): + try: + return self.l.get(self.l.curselection()) + except: + return '' + def draw_tk(self, frame): + self.l = Listbox(frame, selectmode=self.selectmode, font=stdfont, + width=max([len(o) for o in self.options]), + height=len(self.options), exportselection=0) + for o in self.options: + self.l.insert(END, o) + self.l.pack() + +class LabelParam(Param): + def __init__(self, initial=''): + self.value = StringVar() + self.value.set(initial) + def get_value(self): + return self.value.get() + def set_value(self, v): + if 'value' not in self.__dict__: + self.value = StringVar() + self.value.set(v) + def draw_tk(self, frame): + l = Label(frame, textvariable=self.value, font=stdfont) + l.pack() + +class ButtonParam(Param): + def __init__(self, text, **options): + self.options = {'text' : text} + self.options.update(options) + self.pressed = 0 + self.unread = 0 # unread button presses + def draw_tk(self, frame): + b = Button(frame, **self.options) + b.pack() + b.bind('<ButtonPress>', self.activate) + b.bind('<ButtonRelease>', self.deactivate) + def get_value(self): + if self.unread: + self.unread = 0 + return 1 + + return self.pressed + def activate(self, evt): + self.pressed = 1 + self.unread = 1 + def deactivate(self, evt): + self.pressed = 0 + +class Params: + def __init__(self): + self.params = {} + def add_param(self, name, param): + self.params[name] = param + def get_param_value(self, name): + return self.params[name].get_value() + def __getitem__(self, name): + return self.params[name].get_value() + def __setitem__(self, name, value): + self.params[name].set_value(value) + def draw_tk(self, frame): + for name,param in self.params.items(): + f = Frame(frame) + l = Label(f, text=name, font=stdfont) + l.pack(side='left') + pframe = Frame(f) + param.draw_tk(pframe) + pframe.pack(side='right') + f.pack() + +class SliderAdjuster: + def __init__(self): + self.var = None + self.atzero = 0 + def set(self, level): + if self.var is not None: + self.var.set(level) + def get(self, level): + if self.var is not None: + return self.var.get() + return None + def justturnedon(self): + return self.atzero + def __getstate__(self): + state = self.__dict__.copy() + # remove var (non-pickleable) + try: + del state['var'] + except KeyError: + pass + return state + # no setstate needed + +class Sub: + def __init__(self, name, levels, dimmers=68, color=None): + self.name = name # keep this consistent please + self.levels = levels + self.dimmers = dimmers # needed? + self.is_effect = callable(self.levels) + self.slideradjuster = SliderAdjuster() + self.namecache = {} + if self.is_effect: + self.params = Params() + self.generator = self.levels(self.params, self.slideradjuster) + self.generator.next() + self.color = color + def resolve_name(self, ch_name): + if ch_name in self.namecache: + return self.namecache[ch_name] + else: + resolved = get_dmx_channel(ch_name) + self.namecache[ch_name] = resolved + return resolved + def set_slider_var(self, slidervar): + if self.is_effect: + self.slideradjuster.var = slidervar + def draw_tk(self, frame): + if self.is_effect: + self.params.draw_tk(frame) + def get_state(self): + state = self.__dict__.copy() + if self.is_effect: + del state['levels'] + del state['generator'] + + return state + def set_state(self, statedict): + self.__dict__.update(statedict) + def get_levels(self, level): + """returns a scaled version of the levels in the sub; channel names + are resolved to numbers""" + d = {} + if level == 0: + self.slideradjuster.atzero = 1 + return d + if self.is_effect: # effect + d = self.generator.next() + self.slideradjuster.atzero = 0 + return dict([(get_dmx_channel(ch), float(lev) * float(level)) + for ch, lev in d.items()]) + else: # dictionary (standard) + d = self.levels + return dict([(self.resolve_name(ch), float(lev) * float(level)) + for ch, lev in d.items()]) + + # + # methods for Subediting to use + # + def getlevels(self): + return self.levels.copy() + def reviselevels(self,levels): + # we can accept these new levels; subediting has done all the work + self.levels.update(levels) + + + +def reload_data(dummy): + global subs, cues + if dummy: + import ConfigDummy as Config + else: + import Config + + reload(Config) + + subs = {} + for name, levels in Config.subs.items(): + if type(name) == TupleType: + name, color = name + else: + color = None + + subs[name] = Sub(name, levels, color=color) + + # subs = dict([(name, Sub(levels)) for name, levels in Config.subs.items()]) + + cues = Config.cues + +def longestsubname(): + return max([len(x) for x in subs.keys()])