annotate Widgets/Fadable.py @ 206:851cf44cea40

rename clientid and allow it as an argument
author drewp
date Sun, 10 Apr 2005 15:13:48 +0000
parents e7b531d10cf9
children
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
206
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
9 work with an Entry or a Meter, I guess. (Actually, this is used by
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
10 KeyboardComposer and KeyboardRecorder now too.)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
11
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 var is a Tk variable that should be used to set and get the levels.
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 If use_fades is true, it will use fades to move between levels.
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 If key_bindings is true, it will install these keybindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
15
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 Press a number to fade to that amount (e.g. '5' = 50%). Also,
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 '`' (grave) will fade to 0 and '0' will fade to 100%.
45b12307c695 Initial revision
drewp
parents:
diff changeset
18
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 If mouse_bindings is true, the following mouse bindings will be
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 installed: Right clicking toggles muting. The mouse wheel will
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 raise or lower the volume. Shift-mouse wheeling will cause a more
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 precise volume adjustment. Control-mouse wheeling will cause a
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 longer fade."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 def __init__(self, var, wheel_step=5, use_fades=1, key_bindings=1,
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 mouse_bindings=1):
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 self.use_fades = use_fades # whether increase and decrease should fade
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 self.wheel_step = wheel_step # amount that increase and descrease should
45b12307c695 Initial revision
drewp
parents:
diff changeset
28 # change volume (by default)
45b12307c695 Initial revision
drewp
parents:
diff changeset
29
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 self.fade_start_level = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 self.fade_end_level = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 self.fade_start_time = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 self.fade_length = 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 self.fade_step_time = 10
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 self.fade_var = var
45b12307c695 Initial revision
drewp
parents:
diff changeset
36 self.fading = 0 # whether a fade is in progress
45b12307c695 Initial revision
drewp
parents:
diff changeset
37
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 if key_bindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
39 for k in range(1, 10):
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 self.bind("<Key-%d>" % k,
133
e7b531d10cf9 - sliders go from 0 to 1
dmcc
parents: 111
diff changeset
41 lambda evt, k=k: self.fade(k / 10.0))
206
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
42 self.bind("<Key-0>", lambda evt: self.fade(1.0))
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 self.bind("<grave>", lambda evt: self.fade(0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
44
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 # up / down arrows
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 self.bind("<Key-Up>", lambda evt: self.increase())
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 self.bind("<Key-Down>", lambda evt: self.decrease())
45b12307c695 Initial revision
drewp
parents:
diff changeset
48
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 if mouse_bindings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 # right mouse button toggles muting
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 # self.bind('<3>', lambda evt: self.toggle_mute())
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 # "NOT ANY MORE!" - homer
45b12307c695 Initial revision
drewp
parents:
diff changeset
53
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 # mouse wheel
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 self.bind('<4>', lambda evt: self.increase())
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 self.bind('<5>', lambda evt: self.decrease())
45b12307c695 Initial revision
drewp
parents:
diff changeset
57
45b12307c695 Initial revision
drewp
parents:
diff changeset
58 # modified mouse wheel
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 self.bind('<Shift-4>', lambda evt: self.increase(multiplier=0.2))
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 self.bind('<Shift-5>', lambda evt: self.decrease(multiplier=0.2))
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 self.bind('<Control-4>', lambda evt: self.increase(length=1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
62 self.bind('<Control-5>', lambda evt: self.decrease(length=1))
45b12307c695 Initial revision
drewp
parents:
diff changeset
63
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 self.last_level = 0 # used for muting
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 def fade(self, value, length=0.5, step_time=10):
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 """Fade to value in length seconds with steps every step_time
206
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
67 milliseconds"""
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
68 if length == 0: # 0 seconds fades happen right away and prevents
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
69 # and prevents us from entering the fade loop,
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
70 # which would cause a divide by zero
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
71 self.fade_var.set(value)
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
72 self.fading = 0 # we stop all fades
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
73 else: # the general case
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
74 self.fade_start_time = time.time()
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
75 self.fade_length = length
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
76
206
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
77 self.fade_start_level = self.fade_var.get()
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
78 self.fade_end_level = value
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
79
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
80 self.fade_step_time = step_time
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
81 if not self.fading:
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
82 self.fading = 1
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
83 self.do_fade()
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
84 def do_fade(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 """Actually performs the fade for Fadable.fade. Shouldn't be called
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 directly."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 now = time.time()
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 elapsed = now - self.fade_start_time
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 complete = elapsed / self.fade_length
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 complete = min(1.0, complete)
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 diff = self.fade_end_level - self.fade_start_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 newlevel = (complete * diff) + self.fade_start_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 if complete < 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 self.after(self.fade_step_time, self.do_fade)
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 self.fading = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 def increase(self, multiplier=1, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 """Increases the volume by multiplier * wheel_step. If use_fades is
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 true, it do this as a fade over length time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 amount = self.wheel_step * multiplier
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 if self.fading:
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 newlevel = self.fade_end_level + amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 newlevel = self.fade_var.get() + amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 newlevel = min(100, newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 self.set_volume(newlevel, length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 def decrease(self, multiplier=1, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 """Descreases the volume by multiplier * wheel_step. If use_fades
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 is true, it do this as a fade over length time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 amount = self.wheel_step * multiplier
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 if self.fading:
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 newlevel = self.fade_end_level - amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 newlevel = self.fade_var.get() - amount
45b12307c695 Initial revision
drewp
parents:
diff changeset
116 newlevel = max(0, newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 self.set_volume(newlevel, length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 def set_volume(self, newlevel, length=0.3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 """Sets the volume to newlevel, performing a fade of length if
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 use_fades is true."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 if self.use_fades:
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 self.fade(newlevel, length=length)
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 def toggle_mute(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 """Toggles whether the volume is being muted."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 curlevel = self.fade_var.get()
45b12307c695 Initial revision
drewp
parents:
diff changeset
128 if curlevel:
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 newlevel = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 self.last_level = curlevel
45b12307c695 Initial revision
drewp
parents:
diff changeset
131 self['bg'] = 'red' # TODO: let them choose these colors
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 else:
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 newlevel = self.last_level
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 self['bg'] = 'lightGray'
45b12307c695 Initial revision
drewp
parents:
diff changeset
135
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 self.fade_var.set(newlevel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
137
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 if __name__ == "__main__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 class SubScale(Scale, Fadable):
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 def __init__(self, master, *args, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 self.scale_var = DoubleVar()
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 kw['variable'] = self.scale_var
45b12307c695 Initial revision
drewp
parents:
diff changeset
143 Scale.__init__(self, master, *args, **kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 Fadable.__init__(self, var=self.scale_var)
45b12307c695 Initial revision
drewp
parents:
diff changeset
145
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 root = Tk()
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 root.tk_focusFollowsMouse()
206
851cf44cea40 rename clientid and allow it as an argument
drewp
parents: 133
diff changeset
148 ss = SubScale(root, from_=1, to_=0, res=0.01)
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 ss.pack()
45b12307c695 Initial revision
drewp
parents:
diff changeset
150 mainloop()