Mercurial > cpython-lru_cache-weakref
annotate Lib/stdwin/Sliders.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 1d06b1499eb9 |
| children |
| rev | line source |
|---|---|
| 28 | 1 # Module 'Sliders' |
| 32 | 2 |
| 28 | 3 |
| 4 import stdwin | |
| 5 from stdwinevents import * | |
| 6 import rect | |
| 32 | 7 from Buttons import * |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
8 from HVSplit import HSplit |
| 28 | 9 |
| 10 | |
| 11 # Field indices in event detail | |
| 12 # | |
| 13 _HV = 0 | |
| 14 _CLICKS = 1 | |
| 15 _BUTTON = 2 | |
| 16 _MASK = 3 | |
| 17 | |
| 18 | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
19 # DragSlider is the simplest possible slider. |
| 28 | 20 # It looks like a button but dragging the mouse left or right |
| 21 # changes the controlled value. | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
22 # It does not support any of the triggers or hooks defined by Buttons, |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
23 # but defines its own setval_trigger and setval_hook. |
| 28 | 24 # |
| 531 | 25 class DragSliderReactivity(BaseReactivity): |
| 28 | 26 # |
| 27 def mouse_down(self, detail): | |
| 28 h, v = hv = detail[_HV] | |
| 29 if self.enabled and self.mousetest(hv): | |
| 30 self.anchor = h | |
| 31 self.oldval = self.val | |
| 32 self.active = 1 | |
| 33 # | |
| 34 def mouse_move(self, detail): | |
| 35 if self.active: | |
| 36 h, v = detail[_HV] | |
| 37 self.setval(self.oldval + (h - self.anchor)) | |
| 38 # | |
| 39 def mouse_up(self, detail): | |
| 40 if self.active: | |
| 41 h, v = detail[_HV] | |
| 42 self.setval(self.oldval + (h - self.anchor)) | |
| 43 self.active = 0 | |
| 44 # | |
| 32 | 45 |
| 531 | 46 class DragSliderAppearance(ButtonAppearance): |
| 32 | 47 # |
| 48 # INVARIANTS maintained by the setval method: | |
| 49 # | |
| 50 # self.min <= self.val <= self.max | |
| 51 # self.text = self.pretext + `self.val` + self.postext | |
| 52 # | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
53 # (Notice that unlike Python ranges, the end point belongs |
| 32 | 54 # to the range.) |
| 55 # | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
56 def init_appearance(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
57 ButtonAppearance.init_appearance(self) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
58 self.min = 0 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
59 self.val = 0 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
60 self.max = 100 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
61 self.hook = 0 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
62 self.pretext = self.postext = '' |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
63 self.recalctext() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
64 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
65 # The 'get*' and 'set*' methods belong to the generic slider interface |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
66 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
67 def getval(self): return self.val |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
68 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
69 def sethook(self, hook): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
70 self.hook = hook |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
71 # |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
72 def setminvalmax(self, min, val, max): |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
73 self.min = min |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
74 self.max = max |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
75 self.setval(val) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
76 # |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
77 def settexts(self, pretext, postext): |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
78 self.pretext = pretext |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
79 self.postext = postext |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
80 self.recalctext() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
81 # |
| 32 | 82 def setval(self, val): |
| 83 val = min(self.max, max(self.min, val)) | |
| 84 if val <> self.val: | |
| 85 self.val = val | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
86 self.recalctext() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
87 self.trigger() |
| 32 | 88 # |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
89 def trigger(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
90 if self.hook: |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
91 self.hook(self) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
92 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
93 def recalctext(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
94 self.settext(self.pretext + `self.val` + self.postext) |
| 32 | 95 # |
| 96 | |
| 531 | 97 class DragSlider(DragSliderReactivity, DragSliderAppearance, Define): |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
98 def definetext(self, parent, text): |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
99 raise RuntimeError, 'DragSlider.definetext() not supported' |
| 32 | 100 |
| 101 | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
102 # Auxiliary class for PushButton incorporated in ComplexSlider |
| 32 | 103 # |
| 531 | 104 class _StepButton(PushButton): |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
105 def define(self, parent): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
106 self = PushButton.define(self, parent) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
107 self.step = 0 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
108 return self |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
109 def setstep(self, step): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
110 self.step = step |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
111 def definetextstep(self, parent, text, step): |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
112 self = self.definetext(parent, text) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
113 self.setstep(step) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
114 return self |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
115 def init_reactivity(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
116 PushButton.init_reactivity(self) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
117 self.parent.need_timer(self) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
118 def step_trigger(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
119 self.parent.setval(self.parent.getval() + self.step) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
120 def down_trigger(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
121 self.step_trigger() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
122 self.parent.settimer(5) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
123 def timer(self): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
124 if self.hilited: |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
125 self.step_trigger() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
126 if self.active: |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
127 self.parent.settimer(1) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
128 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
129 |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
130 # A complex slider is an HSplit initialized to three buttons: |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
131 # one to step down, a dragslider, and one to step up. |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
132 # |
| 531 | 133 class ComplexSlider(HSplit): |
| 32 | 134 # |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
135 # Override Slider define() method |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
136 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
137 def define(self, parent): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
138 self = self.create(parent) # HSplit |
| 32 | 139 # |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
140 self.downbutton = _StepButton().definetextstep(self, '-', -1) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
141 self.dragbutton = DragSlider().define(self) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
142 self.upbutton = _StepButton().definetextstep(self, '+', 1) |
| 32 | 143 # |
| 144 return self | |
| 145 # | |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
146 # Override HSplit methods |
| 32 | 147 # |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
148 def getminsize(self, m, (width, height)): |
|
350
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
149 w1, h1 = self.downbutton.getminsize(m, (0, height)) |
|
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
150 w3, h3 = self.upbutton.getminsize(m, (0, height)) |
|
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
151 w1 = max(w1, h1) |
|
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
152 w3 = max(w3, h3) |
|
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
153 w2, h2 = self.dragbutton.getminsize(m, (width-w1-w3, height)) |
|
3dfaa093d96e
minsize --> getminsize; new implementation of getminsize
Guido van Rossum <guido@python.org>
parents:
63
diff
changeset
|
154 return w1+w2+w3, max(h1, h2, h3) |
| 32 | 155 # |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
156 def setbounds(self, bounds): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
157 (left, top), (right, bottom) = self.bounds = bounds |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
158 size = bottom - top |
|
1110
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
159 self.downbutton.setbounds(((left, top), (left+size, bottom))) |
|
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
160 self.dragbutton.setbounds(((left+size, top), \ |
|
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
161 (right-size, bottom))) |
|
1d06b1499eb9
* Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents:
531
diff
changeset
|
162 self.upbutton.setbounds(((right-size, top), (right, bottom))) |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
163 # |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
164 # Pass other Slider methods on to dragbutton |
| 32 | 165 # |
|
63
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
166 def getval(self): return self.dragbutton.getval() |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
167 def sethook(self, hook): self.dragbutton.sethook(hook) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
168 def setminvalmax(self, args): self.dragbutton.setminvalmax(args) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
169 def settexts(self, args): self.dragbutton.settexts(args) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
170 def setval(self, val): self.dragbutton.setval(val) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
171 def enable(self, flag): |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
172 self.downbutton.enable(flag) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
173 self.dragbutton.enable(flag) |
|
61311506f2cd
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
54
diff
changeset
|
174 self.upbutton.enable(flag) |
