blob: 8953efd16653af1399eca62f818a2b415c675061 [file] [log] [blame]
Guido van Rossum336f2811990-10-24 16:39:18 +00001# Module 'Sliders'
2#
3# Sliders are somewhat like buttons but have an extra hook that is
4# called whenever their value is changed.
5
6import stdwin
7from stdwinevents import *
8import rect
9from minmax import min, max
10from Buttons import ClassicButton
11
12
13# Field indices in event detail
14#
15_HV = 0
16_CLICKS = 1
17_BUTTON = 2
18_MASK = 3
19
20
21# A dragslider is the simplest possible slider.
22# It looks like a button but dragging the mouse left or right
23# changes the controlled value.
24#
25class DragSlider() = ClassicButton():
26 #
27 # INVARIANTS maintained by the define and setval methods:
28 #
29 # self.min <= self.val <= self.max
30 # self.text = `self.val`
31 #
32 # (Notice that unlike in Python ranges, the end point belongs
33 # to the range.)
34 #
35 def define(self, (win, bounds)):
36 self.min = 0
37 self.val = 50
38 self.max = 100
39 self.setval_hook = 0
40 self.pretext = self.postext = ''
41 self.text = self.pretext + `self.val` + self.postext
42 self = ClassicButton.define(self, (win, bounds, self.text))
43 return self
44 #
45 def setval(self, val):
46 val = min(self.max, max(self.min, val))
47 if val <> self.val:
48 self.val = val
49 self.text = self.pretext + `self.val` + self.postext
50 if self.setval_hook:
51 self.setval_hook(self)
52 self.redraw()
53 #
54 def settext(self, text):
55 pass # shouldn't be called at all
56 #
57 def mouse_down(self, detail):
58 h, v = hv = detail[_HV]
59 if self.enabled and self.mousetest(hv):
60 self.anchor = h
61 self.oldval = self.val
62 self.active = 1
63 #
64 def mouse_move(self, detail):
65 if self.active:
66 h, v = detail[_HV]
67 self.setval(self.oldval + (h - self.anchor))
68 #
69 def mouse_up(self, detail):
70 if self.active:
71 h, v = detail[_HV]
72 self.setval(self.oldval + (h - self.anchor))
73 self.active = 0
74 #