diff flax/CueFaders.py @ 178:e9c06be9b26b

more updates, some bugfixes (hopefully!)
author dmcc
date Thu, 10 Jul 2003 07:20:20 +0000
parents c8d24bd2a99e
children ce362534d133
line wrap: on
line diff
--- a/flax/CueFaders.py	Thu Jul 10 02:58:46 2003 +0000
+++ b/flax/CueFaders.py	Thu Jul 10 07:20:20 2003 +0000
@@ -12,11 +12,12 @@
     'next' : ('red',    'white'),
 }
 
-# TODO pause fades, set new time to be remaining about of time in the fade so fade
-#        can continue properly
-#      make fades work properly: the set_next / prev bug
-#      find cue by page ("not necessawy!")
-#      CueFader controls KeyboardController?  unlikely
+# TODO 
+# .... pause fades, set new time to be remaining about of time in the fade so 
+#           fade can continue properly
+# FIX? make fades work properly: the set_next / prev bug
+# WONT find cue by page ("not necessawy!")
+# WONT CueFader controls KeyboardController?  unlikely
 
 class LabelledScale(Tk.Frame):
     """Scale with two labels: a name and current value"""
@@ -91,7 +92,9 @@
         self.timer_entry.pack(fill='y', side='left')
         self.timer_var.set(2)
         self.disabled = (self.button['state'] == 'disabled')
+        self.start_time = 0
         self.fading = 0
+        self.last_after_key = 0
     def wheelscroll(self, event):
         """Mouse wheel increments or decrements timer."""
         if event.num == 4: # scroll up
@@ -99,20 +102,35 @@
         else:            # scroll down
             self.timer_entry.decrement()
     def start_fade(self, end_level=1):
-        try:
-            fade_time = float(self.timer_var.get())
-        except ValueError:
-            # since we use a control now, i don't think we need to worry about
-            # validation any more.
-            print ">>> Can't fade -- bad time", self.timer_var.get()
-            return
-
+        self.last_start_time = self.start_time
         self.start_time = time.time()
         self.start_level = self.scale_to_fade.scale_var.get()
         self.end_level = end_level
-        self.fade_length = fade_time
-        self.fading = 1
-        self.do_fade()
+
+        if self.fading == 1: # if we're already fading
+            print "already fading!"
+            # fade_time = old_fade_length - 
+            self.fading = 'paused'
+            self.fade_length = time.time() - self.last_start_time
+            print "fade_length", self.fade_length
+            self.end_fade()
+        else:
+            print "not already fading or continuing a fade"
+            try:
+                fade_time = float(self.timer_var.get())
+            except ValueError:
+                # since we use a TixControl now, i don't think we need to worry 
+                # about validation any more.
+                print ">>> Can't fade -- bad time", self.timer_var.get()
+                return
+
+            # TODO fix
+            if self.fading != 'paused':
+                self.fade_length = fade_time
+            print "fade_length", self.fade_length
+            self.button['text'] = 'Pause'
+            self.fading = 1
+            self.do_fade()
     def do_fade(self):
         diff = time.time() - self.start_time
         if diff < self.fade_length:
@@ -122,12 +140,16 @@
             self.scale_to_fade.scale_var.set(newlevel)
 
             if newlevel != self.end_level:
-                self.after(10, self.do_fade)
+                self.last_after_key = self.after(10, self.do_fade)
             else:
-                self.fading = 0
+                self.end_fade()
         else:
             self.scale_to_fade.scale_var.set(self.end_level)
-            self.fading = 0
+            self.end_fade()
+    def end_fade(self):
+        self.button['text'] = self.name
+        self.fading = 0
+        self.after_cancel(self.last_after_key)
     def disable(self):
         if not self.disabled:
             self.button['state'] = 'disabled'
@@ -216,7 +238,7 @@
                                                                           name))
             scale.pack(fill='x', expand=0)
             go = TimedGoButton(frame, 'Go %s' % name, scale, bg=color, 
-                fg='white')
+                fg='white', width=10)
             go.pack(fill='both', expand=1)
             frame.pack(side=side, fill='both', expand=1)
         
@@ -249,14 +271,16 @@
     def reload_cue_times(self):
         prev, cur, next = self.cuelist.get_current_cues()
         self.go_buttons['Next'].set_time(next.time)
-    def update_cue_cache(self):
+    def update_cue_cache(self, compute_dmx_levels=1):
         """Rebuilds subs from the current cues.  As this is expensive, we don't
         do it unless necessary (i.e. whenever we shift or a cue is edited)"""
+        # print "update_cue_cache"
         # load the subs to fade between
         for cue, name in zip(self.cuelist.get_current_cues(), 
                              ('Prev', 'Cur', 'Next')):
             self.cues_as_subs[name] = cue.get_levels_as_sub()
-        self.compute_dmx_levels()
+        if compute_dmx_levels:
+            self.compute_dmx_levels()
     def compute_dmx_levels(self):
         """Compute the DMX levels to send.  This should get called whenever the
         DMX levels could change: either during a crossfade or when a cue is
@@ -271,6 +295,11 @@
             current_levels_as_sub = cur_sub.crossfade(other_sub, scale_val)
             self.current_dmx_levels = current_levels_as_sub.get_dmx_list()
             self.send_dmx_levels()
+
+            # print "compute_dmx_levels: fade at", scale_val
+            # print "between", cur_sub.name, 
+            # print "and", other_sub.name
+            # print 
     def send_dmx_levels(self, *args):
         # print "send_dmx_levels", self.current_dmx_levels
         if self.mute.get():
@@ -303,12 +332,15 @@
         # to prevent overshifting
         if self.no_shifts_until_release:
             return
+        # print "shift", name
 
+        self.cuelist.shift((-1, 1)[name == 'Next'])
+        self.update_cue_cache(compute_dmx_levels=0)
         for scale_name, scale in self.scales.items():
+            # print "shift: setting scale to 0", scale_name
             scale.scale.set(0)
-        self.cuelist.shift((-1, 1)[name == 'Next'])
+        self.update_cue_cache(compute_dmx_levels=1)
 
-        self.update_cue_cache()
         if self.auto_load_times.get():
             self.reload_cue_times()
     def autoshift(self, name, scale):
@@ -574,11 +606,17 @@
         self.reset_cue_indicators((next,))
         CueList.set_next(self, index)
         self.update_cue_indicators()
+
+        if self.fader: # XXX this is untested
+            self.fader.update_cue_cache()
     def set_prev(self, index):
         prev, cur, next = self.get_current_cue_indices()
         self.reset_cue_indicators((prev,))
         CueList.set_prev(self, index)
         self.update_cue_indicators()
+
+        if self.fader: # XXX this is untested
+            self.fader.update_cue_cache()
     def set_selection_as_prev(self):
         sel = self.hlist.info_selection()
         if sel:
@@ -618,7 +656,7 @@
             entryvar = Tk.StringVar()
             entry = Tk.Entry(self, fg='white', bg='black', 
                 textvariable=entryvar, insertbackground='white',
-                highlightbackground='red') # TODO this red/black is backwards
+                highlightcolor='red') # TODO this red/black is backwards
             entry.grid(row=row, column=1, sticky='nsew')
 
             self.variables[field] = entryvar
@@ -649,7 +687,7 @@
 if __name__ == "__main__":
     root = Tk.Tk()
     root.title("ShowMaster 9000")
-    root.geometry("500x555")
+    root.geometry("600x670")
     cl = TkCueList(root, 'cues/dolly')
     cl.pack(fill='both', expand=1)