summaryrefslogtreecommitdiffstats
path: root/Lib/stdwin/Sliders.py
blob: 8953efd16653af1399eca62f818a2b415c675061 (plain)
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
	#