cpython/Lib/lib-stdwin/Sliders.py

75 lines
1.7 KiB
Python

# 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
#