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