75 lines
1.7 KiB
Python
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
|
||
|
#
|