Mercurial > code > home > repos > light9
view light8/Fader.py @ 134:f2f73a2171e6
many adjustments to the loops and timing
many adjustments to the loops and timing
now sends the hardware updates only when clients change, but at least 1Hz
new option to adjust the rate of the loop that considers sending changes (if
the lights have changed)
author | drewp |
---|---|
date | Sat, 14 Jun 2003 14:59:09 +0000 |
parents | e04f7b552bcd |
children |
line wrap: on
line source
from Tix import * from time import time # time is on my side from util import subsetdict from FlyingFader import FlyingFader from uihelpers import get_selection # statuses are: # stopped - no cue is loaded or cue is stopped # running - cue is running, not complete # finished - cue is finished, next is loaded stdfont = ('Arial', 10) class Fader(Frame): 'User interface for cue fader' def __init__(self, master, cues, scalelevels): self.master = master self.cues = cues self.scalelevels = scalelevels self.time_start = 0 self.init_layout() self.stop() def init_layout(self): Frame.__init__(self, self.master) # info variables self.cuename = StringVar() self.cuelength = DoubleVar() self.cuetarget = StringVar() # info about a running cue self.cuestatus = StringVar() # text description self.cuestatus.set("stopped") self.cuepercent = DoubleVar() # percent complete self.cuepercent.set(0) self.cuepercent.trace('w', self.update_percent) self.cuetimeelapse = StringVar() # time elapsed self.cuetimeelapse.set('0s') self.cuetimeleft = StringVar() # time left self.cuetimeleft.set('0s') buttonframe = Frame(self) topframe = Frame(self) # to contain cue list and infoframe infoframe = Frame(topframe) topframe.pack() self.listbox = ScrolledListBox(topframe, command=self.update_selection) self.listbox.listbox.configure({'exportselection' : 0, 'selectmode' : EXTENDED}) for c in self.cues: self.listbox.listbox.insert(END, c.name) self.listbox.pack(side=LEFT) self.listbox.listbox.bind("<<ListboxSelect>>", self.update_selection, add=1) Button(buttonframe, text="Go", command=self.go, font=stdfont, bg='green').pack(side=LEFT) Button(buttonframe, text="Stop", command=self.stop, font=stdfont, bg='red').pack(side=LEFT) Button(buttonframe, text="Prev", command=self.prev, font=stdfont).pack(side=LEFT) nextbutton = Button(buttonframe, text="Next", command=self.next, font=stdfont) # Button(buttonframe, text="Load", command=self.mark_start, bg='grey80', # font=stdfont).pack(side=LEFT) Label(infoframe, textvariable=self.cuename, font=('Arial', 12), bg='lightBlue').grid(columnspan=4, sticky=NE+SW) Label(infoframe, text="Length", font=stdfont, bg='lightPink').grid(row=1, sticky=NE+SW) Label(infoframe, textvariable=self.cuelength, font=stdfont).grid(row=1, column=1, columnspan=3, sticky=NE+SW) Label(infoframe, text="Target", font=stdfont, bg='lightPink').grid(row=2, sticky=NE+SW) Label(infoframe, textvariable=self.cuetarget, font=stdfont, wraplength=250).grid(row=2, column=1, columnspan=3, sticky=NE+SW) Label(infoframe, text="Status", font=stdfont, bg='lightPink').grid(row=3, sticky=NE+SW) Label(infoframe, textvariable=self.cuestatus, font=stdfont).grid(row=3, column=1, columnspan=3, sticky=NE+SW) Label(infoframe, text="Time Elapsed", font=stdfont, bg='lightPink').grid(row=4, sticky=NE+SW) Label(infoframe, textvariable=self.cuetimeelapse, font=stdfont).grid(row=4, column=1, sticky=NE+SW) Label(infoframe, text="Time Remain", font=stdfont, bg='lightPink').grid(row=4, column=2, sticky=NE+SW) Label(infoframe, textvariable=self.cuetimeleft, font=stdfont).grid(row=4, column=3, sticky=NE+SW) Label(infoframe, text="Percent Complete", font=stdfont, bg='lightPink').grid(row=5, column=0, sticky=NE+SW) self.percentlabel = Label(infoframe, font=stdfont) self.percentlabel.grid(row=5, column=1, columnspan=3, sticky=NE+SW) # s = Scale(infoframe, variable=self.cuepercent, s = Scale(buttonframe, variable=self.cuepercent, showvalue=0, length=220, width=18, sliderlength=30, to=100,res=.1,from_=0,bd=1, font=stdfont, orient='horiz') # s.grid(row=6, columnspan=4, sticky='ew') nextbutton.pack(side=RIGHT) s.pack(side=RIGHT, expand=1, fill=X) infoframe.pack(side=RIGHT, fill=BOTH, expand=1) buttonframe.pack(side=BOTTOM, expand=1, fill=X) self.listbox.listbox.select_set(0) self.update_selection() def mark_start(self): self.time_start = time() startlevels = dict([(k, v.get()) for k, v in self.scalelevels.items()]) # print "going to mark with", startlevels self.current.start(startlevels, self.time_start) def update_percent(self, *args): if self.cuestatus.get() != 'running': self.cuestatus.set("running") self.mark_start() percent = self.cuepercent.get() self.percentlabel.config(text='%.1f%%' % percent) percent /= 100 elapsed = percent * self.current.dur self.cuetimeelapse.set('%.1fs' % elapsed) self.cuetimeleft.set('%.1fs' % (self.current.dur - elapsed)) newlevels = self.current.get_levels(self.time_start + elapsed) # print "newlevels", newlevels for ch, lev in newlevels.items(): try: self.scalelevels[ch].set(lev) except KeyError: pass def update_selection(self, *args): self.cuestatus.set('stopped') selection = get_selection(self.listbox.listbox) self.current = self.cues[selection] self.cuename.set(self.current.name) self.cuelength.set(self.current.dur) target = ', '.join(['%s -> %.2f' % (n, lev) for n, lev in self.current.get_end_levels().items()]) self.cuetarget.set(target) self.cuetimeelapse.set('0s') self.cuetimeleft.set('%.1fs' % self.current.dur) self.cuepercent.set(0) def go(self): self.update_selection() self.cuestatus.set("running") self.mark_start() self.running_loop() def stop(self): self.cuestatus.set('stopped') def prev(self): self.stop() selection = get_selection(self.listbox.listbox) if selection != 0: self.listbox.listbox.select_clear(selection) self.listbox.listbox.select_set(selection - 1) self.update_selection() self.mark_start() def next(self): self.stop() selection = get_selection(self.listbox.listbox) if selection != self.listbox.listbox.size() - 1: self.listbox.listbox.select_clear(selection) self.listbox.listbox.select_set(selection + 1) self.update_selection() self.mark_start() def running_loop(self): if self.cuestatus.get() == 'stopped': return curtime = time() elapsed = (curtime - self.time_start) if elapsed > self.current.dur: self.cuestatus.set('stopped') self.cuepercent.set(100) # advance cues if okay self.next() return self.cuepercent.set(100 * elapsed / self.current.dur) self.after(30, self.running_loop)