5 from stdwinevents
import *
8 from HVSplit
import HSplit
11 # Field indices in event detail
19 # DragSlider is the simplest possible slider.
20 # It looks like a button but dragging the mouse left or right
21 # changes the controlled value.
22 # It does not support any of the triggers or hooks defined by Buttons,
23 # but defines its own setval_trigger and setval_hook.
25 class DragSliderReactivity(BaseReactivity
):
27 def mouse_down(self
, detail
):
28 h
, v
= hv
= detail
[_HV
]
29 if self
.enabled
and self
.mousetest(hv
):
31 self
.oldval
= self
.val
34 def mouse_move(self
, detail
):
37 self
.setval(self
.oldval
+ (h
- self
.anchor
))
39 def mouse_up(self
, detail
):
42 self
.setval(self
.oldval
+ (h
- self
.anchor
))
46 class DragSliderAppearance(ButtonAppearance
):
48 # INVARIANTS maintained by the setval method:
50 # self.min <= self.val <= self.max
51 # self.text = self.pretext + `self.val` + self.postext
53 # (Notice that unlike Python ranges, the end point belongs
56 def init_appearance(self
):
57 ButtonAppearance
.init_appearance(self
)
62 self
.pretext
= self
.postext
= ''
65 # The 'get*' and 'set*' methods belong to the generic slider interface
67 def getval(self
): return self
.val
69 def sethook(self
, hook
):
72 def setminvalmax(self
, min, val
, max):
77 def settexts(self
, pretext
, postext
):
78 self
.pretext
= pretext
79 self
.postext
= postext
82 def setval(self
, val
):
83 val
= min(self
.max, max(self
.min, val
))
94 self
.settext(self
.pretext
+ `self
.val`
+ self
.postext
)
97 class DragSlider(DragSliderReactivity
, DragSliderAppearance
, Define
):
98 def definetext(self
, parent
, text
):
99 raise RuntimeError, 'DragSlider.definetext() not supported'
102 # Auxiliary class for PushButton incorporated in ComplexSlider
104 class _StepButton(PushButton
):
105 def define(self
, parent
):
106 self
= PushButton
.define(self
, parent
)
109 def setstep(self
, step
):
111 def definetextstep(self
, parent
, text
, step
):
112 self
= self
.definetext(parent
, text
)
115 def init_reactivity(self
):
116 PushButton
.init_reactivity(self
)
117 self
.parent
.need_timer(self
)
118 def step_trigger(self
):
119 self
.parent
.setval(self
.parent
.getval() + self
.step
)
120 def down_trigger(self
):
122 self
.parent
.settimer(5)
127 self
.parent
.settimer(1)
130 # A complex slider is an HSplit initialized to three buttons:
131 # one to step down, a dragslider, and one to step up.
133 class ComplexSlider(HSplit
):
135 # Override Slider define() method
137 def define(self
, parent
):
138 self
= self
.create(parent
) # HSplit
140 self
.downbutton
= _StepButton().definetextstep(self
, '-', -1)
141 self
.dragbutton
= DragSlider().define(self
)
142 self
.upbutton
= _StepButton().definetextstep(self
, '+', 1)
146 # Override HSplit methods
148 def getminsize(self
, m
, (width
, height
)):
149 w1
, h1
= self
.downbutton
.getminsize(m
, (0, height
))
150 w3
, h3
= self
.upbutton
.getminsize(m
, (0, height
))
153 w2
, h2
= self
.dragbutton
.getminsize(m
, (width
-w1
-w3
, height
))
154 return w1
+w2
+w3
, max(h1
, h2
, h3
)
156 def setbounds(self
, bounds
):
157 (left
, top
), (right
, bottom
) = self
.bounds
= bounds
159 self
.downbutton
.setbounds(((left
, top
), (left
+size
, bottom
)))
160 self
.dragbutton
.setbounds(((left
+size
, top
), \
161 (right
-size
, bottom
)))
162 self
.upbutton
.setbounds(((right
-size
, top
), (right
, bottom
)))
164 # Pass other Slider methods on to dragbutton
166 def getval(self
): return self
.dragbutton
.getval()
167 def sethook(self
, hook
): self
.dragbutton
.sethook(hook
)
168 def setminvalmax(self
, args
): self
.dragbutton
.setminvalmax(args
)
169 def settexts(self
, args
): self
.dragbutton
.settexts(args
)
170 def setval(self
, val
): self
.dragbutton
.setval(val
)
171 def enable(self
, flag
):
172 self
.downbutton
.enable(flag
)
173 self
.dragbutton
.enable(flag
)
174 self
.upbutton
.enable(flag
)