Mercurial > code > home > repos > light9
view light8/Fader.py @ 271:97c08a1c4351
gyrocontroller: remap buttons, fix keep mode
Also, solo mode is now default, colors are brighter, numeric names for subs
are converted to subs with only that channel up, send zeroes when exiting
author | David McClosky <dmcc@bigasterisk.com> |
---|---|
date | Fri, 17 Jun 2005 04:23:07 +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)