annotate Widgets/Fadable.py @ 161:0803fb42109d

we now have TkCueList, which is really cool. it doesn't provide editing we now have TkCueList, which is really cool. it doesn't provide editing yet, but you could almost nearly probably maybe run a show with it. heck, i hope so. some of the shifting/drawing problems were probably fixed. cuelist1 got more bogus data to help populate the TkCueList.
author dmcc
date Mon, 07 Jul 2003 17:18:26 +0000
parents e7b531d10cf9
children 851cf44cea40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 # taken from SnackMix -- now that's reusable code
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 from Tix import *
45b12307c695 Initial revision
drewp
parents:
diff changeset
3 import time
45b12307c695 Initial revision
drewp
parents:
diff changeset
4
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 class Fadable:
45b12307c695 Initial revision
drewp
parents:
diff changeset
6 """Fading mixin: must mix in with a Tk widget (or something that has
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 'after' at least) This is currently used by VolumeBox and MixerTk.
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 It's probably too specialized to be used elsewhere, but could possibly
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 work with an Entry or a Meter, I guess.
45b12307c695 Initial revision
drewp
parents:
diff changeset
10
45b12307c695 Initial revision
drewp
parents:
diff changeset
11 var is a Tk variable that should be used to set and get the levels.
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 If use_fades is true, it will use fades to move between levels.
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 If key_bindings is true, it will install these keybindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
14
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 Press a number to fade to that amount (e.g. '5' = 50%). Also,
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 '`' (grave) will fade to 0 and '0' will fade to 100%.
45b12307c695 Initial revision
drewp
parents:
diff changeset
17
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 If mouse_bindings is true, the following mouse bindings will be
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 installed: Right clicking toggles muting. The mouse wheel will
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 raise or lower the volume. Shift-mouse wheeling will cause a more
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 precise volume adjustment. Control-mouse wheeling will cause a
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 longer fade."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 def __init__(self, var, wheel_step=5, use_fades=1, key_bindings=1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 mouse_bindings=1):
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 self.use_fades = use_fades # whether increase and decrease should fade
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 self.wheel_step = wheel_step # amount that increase and descrease should
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 # change volume (by default)
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 self.fade_start_level = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 self.fade_end_level = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 self.fade_start_time = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 self.fade_length = 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 self.fade_step_time = 10
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 self.fade_var = var
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 self.fading = 0 # whether a fade is in progress
45b12307c695 Initial revision
drewp
parents:
diff changeset
36
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 if key_bindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 for k in range(1, 10):
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 self.bind("<Key-%d>" % k,
133
e7b531d10cf9 - sliders go from 0 to 1
dmcc
parents: 111
diff changeset
40 lambda evt, k=k: self.fade(k / 10.0))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 self.bind("<Key-0>", lambda evt: self.fade(100))
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 self.bind("<grave>", lambda evt: self.fade(0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
43
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 # up / down arrows
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 self.bind("<Key-Up>", lambda evt: self.increase())
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 self.bind("<Key-Down>", lambda evt: self.decrease())
45b12307c695 Initial revision
drewp
parents:
diff changeset
47
45b12307c695 Initial revision
drewp
parents:
diff changeset
48 if mouse_bindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 # right mouse button toggles muting
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 # self.bind('<3>', lambda evt: self.toggle_mute())
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 # "NOT ANY MORE!" - homer
45b12307c695 Initial revision
drewp
parents:
diff changeset
52
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 # mouse wheel
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 self.bind('<4>', lambda evt: self.increase())
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 self.bind('<5>', lambda evt: self.decrease())
45b12307c695 Initial revision
drewp
parents:
diff changeset
56
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 # modified mouse wheel
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 self.bind('<Shift-4>', lambda evt: self.increase(multiplier=0.2))
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 self.bind('<Shift-5>', lambda evt: self.decrease(multiplier=0.2))
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 self.bind('<Control-4>', lambda evt: self.increase(length=1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.bind('<Control-5>', lambda evt: self.decrease(length=1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
62
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 self.last_level = 0 # used for muting
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 def fade(self, value, length=0.5, step_time=10):
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 """Fade to value in length seconds with steps every step_time
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 seconds"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 self.fade_start_time = time.time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 self.fade_length = length
45b12307c695 Initial revision
drewp
parents:
diff changeset
69
45b12307c695 Initial revision
drewp
parents:
diff changeset
70 self.fade_start_level = self.fade_var.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 self.fade_end_level = value
45b12307c695 Initial revision
drewp
parents:
diff changeset
72
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 self.fade_step_time = step_time
133
e7b531d10cf9 - sliders go from 0 to 1
dmcc
parents: 111
diff changeset
74 if not self.fading:
e7b531d10cf9 - sliders go from 0 to 1
dmcc
parents: 111
diff changeset
75 self.fading = 1
e7b531d10cf9 - sliders go from 0 to 1
dmcc
parents: 111
diff changeset
76 self.do_fade()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 def do_fade(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 """Actually performs the fade for Fadable.fade. Shouldn't be called
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 directly."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
80 now = time.time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 elapsed = now - self.fade_start_time
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 complete = elapsed / self.fade_length
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 complete = min(1.0, complete)
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 diff = self.fade_end_level - self.fade_start_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 newlevel = (complete * diff) + self.fade_start_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 if complete < 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 self.after(self.fade_step_time, self.do_fade)
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 self.fading = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 def increase(self, multiplier=1, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 """Increases the volume by multiplier * wheel_step. If use_fades is
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 true, it do this as a fade over length time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 amount = self.wheel_step * multiplier
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 if self.fading:
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 newlevel = self.fade_end_level + amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 newlevel = self.fade_var.get() + amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 newlevel = min(100, newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 self.set_volume(newlevel, length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 def decrease(self, multiplier=1, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 """Descreases the volume by multiplier * wheel_step. If use_fades
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 is true, it do this as a fade over length time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 amount = self.wheel_step * multiplier
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 if self.fading:
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 newlevel = self.fade_end_level - amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 newlevel = self.fade_var.get() - amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 newlevel = max(0, newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 self.set_volume(newlevel, length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 def set_volume(self, newlevel, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 """Sets the volume to newlevel, performing a fade of length if
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 use_fades is true."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 if self.use_fades:
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 self.fade(newlevel, length=length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 def toggle_mute(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 """Toggles whether the volume is being muted."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 curlevel = self.fade_var.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 if curlevel:
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 newlevel = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 self.last_level = curlevel
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 self['bg'] = 'red' # TODO: let them choose these colors
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 newlevel = self.last_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 self['bg'] = 'lightGray'
45b12307c695 Initial revision
drewp
parents:
diff changeset
128
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
130
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 if __name__ == "__main__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 class SubScale(Scale, Fadable):
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 def __init__(self, master, *args, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 self.scale_var = DoubleVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 kw['variable'] = self.scale_var
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 Scale.__init__(self, master, *args, **kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 Fadable.__init__(self, var=self.scale_var)
45b12307c695 Initial revision
drewp
parents:
diff changeset
138
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 root = Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 root.tk_focusFollowsMouse()
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 ss = SubScale(root, from_=100, to_=0,)
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 ss.pack()
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 mainloop()