|
@@ -27,7 +27,7 @@ class Slider(Valuator):
|
|
|
)
|
|
)
|
|
|
self.defineoptions(kw, optiondefs)
|
|
self.defineoptions(kw, optiondefs)
|
|
|
Valuator.__init__(self, parent)
|
|
Valuator.__init__(self, parent)
|
|
|
- # Can not enter none for min or max
|
|
|
|
|
|
|
+ # Can not enter None for min or max, update propertyDict to reflect
|
|
|
self.propertyDict['min']['fNone'] = 0
|
|
self.propertyDict['min']['fNone'] = 0
|
|
|
self.propertyDict['min']['help'] = 'Minimum allowable value.'
|
|
self.propertyDict['min']['help'] = 'Minimum allowable value.'
|
|
|
self.propertyDict['max']['fNone'] = 0
|
|
self.propertyDict['max']['fNone'] = 0
|
|
@@ -44,7 +44,7 @@ class Slider(Valuator):
|
|
|
style = self['style'],
|
|
style = self['style'],
|
|
|
command = self.setEntry,
|
|
command = self.setEntry,
|
|
|
value = self['value'])
|
|
value = self['value'])
|
|
|
- self._valuator._canvas.bind('<Double-ButtonPress-1>', self.mouseReset)
|
|
|
|
|
|
|
+ self._valuator._widget.bind('<Double-ButtonPress-1>', self.mouseReset)
|
|
|
|
|
|
|
|
# Add popup bindings to slider widget
|
|
# Add popup bindings to slider widget
|
|
|
try:
|
|
try:
|
|
@@ -89,12 +89,12 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
INITOPT = Pmw.INITOPT
|
|
INITOPT = Pmw.INITOPT
|
|
|
optiondefs = (
|
|
optiondefs = (
|
|
|
# Appearance
|
|
# Appearance
|
|
|
|
|
+ ('style', VALUATOR_MINI, INITOPT),
|
|
|
('relief', RAISED, self.setRelief),
|
|
('relief', RAISED, self.setRelief),
|
|
|
('borderwidth', 2, self.setBorderwidth),
|
|
('borderwidth', 2, self.setBorderwidth),
|
|
|
('background', 'SystemButtonFace', self.setBackground),
|
|
('background', 'SystemButtonFace', self.setBackground),
|
|
|
('fliparrow', 0, INITOPT),
|
|
('fliparrow', 0, INITOPT),
|
|
|
# Behavior
|
|
# Behavior
|
|
|
- ('style', VALUATOR_MINI, INITOPT),
|
|
|
|
|
# Bounds
|
|
# Bounds
|
|
|
('min', 0.0, self.setMin),
|
|
('min', 0.0, self.setMin),
|
|
|
('max', 100.0, self.setMax),
|
|
('max', 100.0, self.setMax),
|
|
@@ -125,91 +125,99 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
self.increment = 0.01
|
|
self.increment = 0.01
|
|
|
|
|
|
|
|
# Interaction flags
|
|
# Interaction flags
|
|
|
- self._fUpdate = 0
|
|
|
|
|
|
|
+ self._isPosted = 0
|
|
|
self._fUnpost = 0
|
|
self._fUnpost = 0
|
|
|
|
|
+ self._fUpdate = 0
|
|
|
|
|
+ self._firstPress = 1
|
|
|
self._fPressInsde = 0
|
|
self._fPressInsde = 0
|
|
|
- self._isPosted = 0
|
|
|
|
|
- if self['style'] == VALUATOR_MINI:
|
|
|
|
|
- self._firstPress = 1
|
|
|
|
|
- else:
|
|
|
|
|
- self._firstPress = 0
|
|
|
|
|
|
|
|
|
|
# Slider dimensions
|
|
# Slider dimensions
|
|
|
width = 100
|
|
width = 100
|
|
|
self.xPad = xPad = 10
|
|
self.xPad = xPad = 10
|
|
|
- canvasWidth = width + 2 * xPad
|
|
|
|
|
|
|
+ sliderWidth = width + 2 * xPad
|
|
|
height = 20
|
|
height = 20
|
|
|
self.left = left = -(width/2.0)
|
|
self.left = left = -(width/2.0)
|
|
|
self.right = right = (width/2.0)
|
|
self.right = right = (width/2.0)
|
|
|
- self.top = top = -5
|
|
|
|
|
- self.bottom = bottom = top + height
|
|
|
|
|
|
|
+ top = -5
|
|
|
|
|
+ bottom = top + height
|
|
|
|
|
|
|
|
- def _createSlider(parent):
|
|
|
|
|
- # Create the canvas inside the dropdown window.
|
|
|
|
|
|
|
+ def createSlider(parent):
|
|
|
|
|
+ # Create the slider inside the dropdown window.
|
|
|
# Min label
|
|
# Min label
|
|
|
self._minLabel = Label(parent, text = self['min'], width = 8,
|
|
self._minLabel = Label(parent, text = self['min'], width = 8,
|
|
|
- anchor = E)
|
|
|
|
|
|
|
+ anchor = W)
|
|
|
self._minLabel.pack(side = LEFT)
|
|
self._minLabel.pack(side = LEFT)
|
|
|
- # Slider
|
|
|
|
|
- self._canvas = self.createcomponent(
|
|
|
|
|
- 'canvas', (), None,
|
|
|
|
|
- Canvas, (parent,),
|
|
|
|
|
- width = canvasWidth,
|
|
|
|
|
- height = height,
|
|
|
|
|
- bd = 2,
|
|
|
|
|
- highlightthickness = 0,
|
|
|
|
|
- scrollregion = (left - xPad, top, right + xPad, bottom))
|
|
|
|
|
- self._canvas.pack(side = LEFT, expand=1, fill=X)
|
|
|
|
|
|
|
+ # Slider widget
|
|
|
if self['style'] == VALUATOR_FULL:
|
|
if self['style'] == VALUATOR_FULL:
|
|
|
- self._canvas.configure(relief = SUNKEN, bd = 2)
|
|
|
|
|
|
|
+ # Use a scale slider
|
|
|
|
|
+ self._widgetVar = DoubleVar()
|
|
|
|
|
+ self._widgetVar.set(self['value'])
|
|
|
|
|
+ self._widget = self.createcomponent(
|
|
|
|
|
+ 'slider', (), None,
|
|
|
|
|
+ Scale, (interior,),
|
|
|
|
|
+ variable = self._widgetVar,
|
|
|
|
|
+ from_ = self['min'], to = self['max'],
|
|
|
|
|
+ width = 10,
|
|
|
|
|
+ orient = 'horizontal',
|
|
|
|
|
+ showvalue = 0,
|
|
|
|
|
+ length = sliderWidth,
|
|
|
|
|
+ relief = FLAT, bd = 2,
|
|
|
|
|
+ highlightthickness = 0)
|
|
|
|
|
+ else:
|
|
|
|
|
+ # Use a canvas slider
|
|
|
|
|
+ self._widget = self.createcomponent(
|
|
|
|
|
+ 'slider', (), None,
|
|
|
|
|
+ Canvas, (parent,),
|
|
|
|
|
+ width = sliderWidth,
|
|
|
|
|
+ height = height,
|
|
|
|
|
+ bd = 2,
|
|
|
|
|
+ highlightthickness = 0,
|
|
|
|
|
+ scrollregion = (left - xPad, top, right + xPad, bottom))
|
|
|
|
|
+ # Interaction marker
|
|
|
|
|
+ xShift = 1
|
|
|
|
|
+ # Shadow arrow
|
|
|
|
|
+ self._marker = self._widget.create_polygon(-7 + xShift, 12,
|
|
|
|
|
+ 7 + xShift, 12,
|
|
|
|
|
+ xShift, 0,
|
|
|
|
|
+ fill = 'black',
|
|
|
|
|
+ tags = ('marker',))
|
|
|
|
|
+ # Arrow
|
|
|
|
|
+ self._widget.create_polygon(-6.0, 10,
|
|
|
|
|
+ 6.0, 10,
|
|
|
|
|
+ 0, 0,
|
|
|
|
|
+ fill = 'grey85',
|
|
|
|
|
+ outline = 'black',
|
|
|
|
|
+ tags = ('marker',))
|
|
|
|
|
+ # The indicator
|
|
|
|
|
+ self._widget.create_line(left, 0,
|
|
|
|
|
+ right, 0,
|
|
|
|
|
+ width = 2,
|
|
|
|
|
+ tags = ('line',))
|
|
|
|
|
+
|
|
|
|
|
+ self._widget.pack(side = LEFT, expand=1, fill=X)
|
|
|
|
|
+
|
|
|
# Max label
|
|
# Max label
|
|
|
self._maxLabel = Label(parent, text = self['max'], width = 8,
|
|
self._maxLabel = Label(parent, text = self['max'], width = 8,
|
|
|
anchor = W)
|
|
anchor = W)
|
|
|
self._maxLabel.pack(side = LEFT)
|
|
self._maxLabel.pack(side = LEFT)
|
|
|
|
|
|
|
|
- # Interaction marker
|
|
|
|
|
- xShift = 1
|
|
|
|
|
- # Shadow arrow
|
|
|
|
|
- self._marker = self._canvas.create_polygon(-7 + xShift, 12,
|
|
|
|
|
- 7 + xShift, 12,
|
|
|
|
|
- xShift, 0,
|
|
|
|
|
- fill = 'black',
|
|
|
|
|
- tags = ('slider',))
|
|
|
|
|
- # Arrow
|
|
|
|
|
- self._canvas.create_polygon(-6.0, 10,
|
|
|
|
|
- 6.0, 10,
|
|
|
|
|
- 0, 0,
|
|
|
|
|
- fill = 'grey85',
|
|
|
|
|
- outline = 'black',
|
|
|
|
|
- tags = ('slider',))
|
|
|
|
|
- # The indicator
|
|
|
|
|
- self._canvas.create_line(left, 0,
|
|
|
|
|
- right, 0,
|
|
|
|
|
- width = 2,
|
|
|
|
|
- tags = ('line',))
|
|
|
|
|
-
|
|
|
|
|
- self._canvas.bind('<Left>', self._decrementValue)
|
|
|
|
|
- self._canvas.bind('<Right>', self._incrementValue)
|
|
|
|
|
- self._canvas.bind('<Shift-Left>', self._bigDecrementValue)
|
|
|
|
|
- self._canvas.bind('<Shift-Right>', self._bigIncrementValue)
|
|
|
|
|
- self._canvas.bind('<Home>', self._goToMin)
|
|
|
|
|
- self._canvas.bind('<End>', self._goToMax)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
# Create slider
|
|
# Create slider
|
|
|
if self['style'] == VALUATOR_MINI:
|
|
if self['style'] == VALUATOR_MINI:
|
|
|
- self._isPosted = 0
|
|
|
|
|
|
|
|
|
|
- # Create the arrow button.
|
|
|
|
|
- self._arrowBtn = self.createcomponent('arrowbutton',
|
|
|
|
|
- (), None,
|
|
|
|
|
- Canvas, (interior,), borderwidth = 0,
|
|
|
|
|
- relief = FLAT, width = 14, height = 14)
|
|
|
|
|
|
|
+ # Create the arrow button to invoke slider
|
|
|
|
|
+ self._arrowBtn = self.createcomponent(
|
|
|
|
|
+ 'arrowbutton',
|
|
|
|
|
+ (), None,
|
|
|
|
|
+ Canvas, (interior,), borderwidth = 0,
|
|
|
|
|
+ relief = FLAT, width = 14, height = 14,
|
|
|
|
|
+ scrollregion = (-7,-7,7,7))
|
|
|
self._arrowBtn.pack(expand = 1, fill = BOTH)
|
|
self._arrowBtn.pack(expand = 1, fill = BOTH)
|
|
|
- self._arrowBtn.create_polygon(2.5, 4.5, 12.5, 4.5, 7.5, 12.5,
|
|
|
|
|
|
|
+ self._arrowBtn.create_polygon(-5, -5, 5, -5, 0, 5,
|
|
|
|
|
+ fill = 'grey50',
|
|
|
tags = 'arrow')
|
|
tags = 'arrow')
|
|
|
- self._arrowRelief = self._arrowBtn.cget('relief')
|
|
|
|
|
-
|
|
|
|
|
|
|
+ self._arrowBtn.create_line(-5, 5, 5, 5,
|
|
|
|
|
+ fill = 'grey50',
|
|
|
|
|
+ tags = 'arrow')
|
|
|
# Create the dropdown window.
|
|
# Create the dropdown window.
|
|
|
self._popup = self.createcomponent(
|
|
self._popup = self.createcomponent(
|
|
|
'popup',
|
|
'popup',
|
|
@@ -219,31 +227,34 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
self._popup.withdraw()
|
|
self._popup.withdraw()
|
|
|
self._popup.overrideredirect(1)
|
|
self._popup.overrideredirect(1)
|
|
|
|
|
|
|
|
- _createSlider(self._popup)
|
|
|
|
|
|
|
+ # Create popup slider
|
|
|
|
|
+ createSlider(self._popup)
|
|
|
|
|
|
|
|
# Bind events to the arrow button.
|
|
# Bind events to the arrow button.
|
|
|
- self._arrowBtn.bind('<1>', self._postCanvas)
|
|
|
|
|
|
|
+ self._arrowBtn.bind('<1>', self._postSlider)
|
|
|
self._arrowBtn.bind('<Enter>', self.highlightWidget)
|
|
self._arrowBtn.bind('<Enter>', self.highlightWidget)
|
|
|
self._arrowBtn.bind('<Leave>', self.restoreWidget)
|
|
self._arrowBtn.bind('<Leave>', self.restoreWidget)
|
|
|
# Need to unpost the popup if the arrow Button is unmapped (eg:
|
|
# Need to unpost the popup if the arrow Button is unmapped (eg:
|
|
|
- # its toplevel window is withdrawn) while the popup canvas is
|
|
|
|
|
|
|
+ # its toplevel window is withdrawn) while the popup slider is
|
|
|
# displayed.
|
|
# displayed.
|
|
|
- self._arrowBtn.bind('<Unmap>', self._unpostCanvas)
|
|
|
|
|
|
|
+ self._arrowBtn.bind('<Unmap>', self._unpostSlider)
|
|
|
|
|
|
|
|
# Bind events to the dropdown window.
|
|
# Bind events to the dropdown window.
|
|
|
- self._popup.bind('<Escape>', self._unpostCanvas)
|
|
|
|
|
- self._popup.bind('<ButtonRelease-1>', self._sliderBtnRelease)
|
|
|
|
|
- self._popup.bind('<ButtonPress-1>', self._sliderBtnPress)
|
|
|
|
|
- self._popup.bind('<Motion>', self._sliderMove)
|
|
|
|
|
|
|
+ self._popup.bind('<Escape>', self._unpostSlider)
|
|
|
|
|
+ self._popup.bind('<ButtonRelease-1>', self._widgetBtnRelease)
|
|
|
|
|
+ self._popup.bind('<ButtonPress-1>', self._widgetBtnPress)
|
|
|
|
|
+ self._popup.bind('<Motion>', self._widgetMove)
|
|
|
|
|
+
|
|
|
|
|
+ self._widget.bind('<Left>', self._decrementValue)
|
|
|
|
|
+ self._widget.bind('<Right>', self._incrementValue)
|
|
|
|
|
+ self._widget.bind('<Shift-Left>', self._bigDecrementValue)
|
|
|
|
|
+ self._widget.bind('<Shift-Right>', self._bigIncrementValue)
|
|
|
|
|
+ self._widget.bind('<Home>', self._goToMin)
|
|
|
|
|
+ self._widget.bind('<End>', self._goToMax)
|
|
|
else:
|
|
else:
|
|
|
- # Create the slider directly in the interior
|
|
|
|
|
- _createSlider(interior)
|
|
|
|
|
- self._canvas.bind('<ButtonRelease-1>', self._sliderBtnRelease)
|
|
|
|
|
- self._canvas.bind('<ButtonPress-1>', self._sliderBtnPress)
|
|
|
|
|
- self._canvas.bind('<Motion>', self._sliderMove)
|
|
|
|
|
- self._canvas.bind('<Configure>', self._changeConfiguration)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+ createSlider(interior)
|
|
|
|
|
+ self._widget['command'] = self._firstScaleCommand
|
|
|
|
|
+
|
|
|
# Check keywords and initialise options.
|
|
# Check keywords and initialise options.
|
|
|
self.initialiseoptions(SliderWidget)
|
|
self.initialiseoptions(SliderWidget)
|
|
|
|
|
|
|
@@ -252,6 +263,8 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
if self['style'] == VALUATOR_FULL:
|
|
if self['style'] == VALUATOR_FULL:
|
|
|
self['relief'] = FLAT
|
|
self['relief'] = FLAT
|
|
|
|
|
|
|
|
|
|
+ self.updateIndicator(self['value'])
|
|
|
|
|
+
|
|
|
def destroy(self):
|
|
def destroy(self):
|
|
|
if (self['style'] == VALUATOR_MINI) and self._isPosted:
|
|
if (self['style'] == VALUATOR_MINI) and self._isPosted:
|
|
|
Pmw.popgrab(self._popup)
|
|
Pmw.popgrab(self._popup)
|
|
@@ -280,58 +293,67 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
return self.value
|
|
return self.value
|
|
|
|
|
|
|
|
def updateIndicator(self, value):
|
|
def updateIndicator(self, value):
|
|
|
- # Get current marker position
|
|
|
|
|
- markerX = self._getMarkerX()
|
|
|
|
|
- percentX = (value - self['min'])/(self['max'] - self['min'])
|
|
|
|
|
- newX = percentX * (self.right - self.left) + self.left
|
|
|
|
|
- dx = newX - markerX
|
|
|
|
|
- self._canvas.move('slider', dx, 0)
|
|
|
|
|
|
|
+ if self['style'] == VALUATOR_MINI:
|
|
|
|
|
+ # Get current marker position
|
|
|
|
|
+ markerX = self._getMarkerX()
|
|
|
|
|
+ percentX = (value - self['min'])/(self['max'] - self['min'])
|
|
|
|
|
+ newX = percentX * (self.right - self.left) + self.left
|
|
|
|
|
+ dx = newX - markerX
|
|
|
|
|
+ self._widget.move('marker', dx, 0)
|
|
|
|
|
+ else:
|
|
|
|
|
+ # Update scale's variable, which update scale without
|
|
|
|
|
+ # Calling scale's command
|
|
|
|
|
+ self._widgetVar.set(value)
|
|
|
|
|
|
|
|
#======================================================================
|
|
#======================================================================
|
|
|
|
|
|
|
|
# Private methods for slider.
|
|
# Private methods for slider.
|
|
|
|
|
|
|
|
- def _postCanvas(self, event = None):
|
|
|
|
|
|
|
+ def _postSlider(self, event = None):
|
|
|
self._isPosted = 1
|
|
self._isPosted = 1
|
|
|
self._fUpdate = 0
|
|
self._fUpdate = 0
|
|
|
- if self['style'] == VALUATOR_MINI:
|
|
|
|
|
- self.interior()['relief'] = SUNKEN
|
|
|
|
|
|
|
|
|
|
# Make sure that the arrow is displayed sunken.
|
|
# Make sure that the arrow is displayed sunken.
|
|
|
|
|
+ self.interior()['relief'] = SUNKEN
|
|
|
self.update_idletasks()
|
|
self.update_idletasks()
|
|
|
-
|
|
|
|
|
- x = self._arrowBtn.winfo_rootx() + self._arrowBtn.winfo_width()/2.0
|
|
|
|
|
|
|
+ # Position popup so that marker is immediately below center of
|
|
|
|
|
+ # Arrow button
|
|
|
|
|
+ # Find screen space position of bottom/center of arrow button
|
|
|
|
|
+ x = (self._arrowBtn.winfo_rootx() + self._arrowBtn.winfo_width()/2.0 -
|
|
|
|
|
+ string.atoi(self.interior()['bd']))
|
|
|
y = self._arrowBtn.winfo_rooty() + self._arrowBtn.winfo_height()
|
|
y = self._arrowBtn.winfo_rooty() + self._arrowBtn.winfo_height()
|
|
|
|
|
+ # Popup border width
|
|
|
|
|
+ bd = string.atoi(self._popup['bd'])
|
|
|
|
|
+ # Get width of label
|
|
|
minW = self._minLabel.winfo_width()
|
|
minW = self._minLabel.winfo_width()
|
|
|
- cw = self._canvas.winfo_width()
|
|
|
|
|
- maxW = self._maxLabel.winfo_width()
|
|
|
|
|
- #pw = minW + cw + maxW
|
|
|
|
|
- pw = maxW + cw/2.0
|
|
|
|
|
- ch = self._canvas.winfo_height()
|
|
|
|
|
|
|
+ # Width of canvas to adjust for
|
|
|
|
|
+ cw = (self._getMarkerX() - self.left ) + self.xPad
|
|
|
|
|
+ popupOffset = bd + minW + cw
|
|
|
|
|
+ ch = self._widget.winfo_height()
|
|
|
sh = self.winfo_screenheight()
|
|
sh = self.winfo_screenheight()
|
|
|
|
|
|
|
|
# Compensate if too close to edge of screen
|
|
# Compensate if too close to edge of screen
|
|
|
if y + ch > sh and y > sh / 2:
|
|
if y + ch > sh and y > sh / 2:
|
|
|
y = self._arrowBtn.winfo_rooty() - ch
|
|
y = self._arrowBtn.winfo_rooty() - ch
|
|
|
-
|
|
|
|
|
- Pmw.setgeometryanddeiconify(self._popup, '+%d+%d' % (x - pw, y))
|
|
|
|
|
|
|
+ # Popup window
|
|
|
|
|
+ Pmw.setgeometryanddeiconify(self._popup, '+%d+%d' % (x-popupOffset, y))
|
|
|
|
|
|
|
|
# Grab the popup, so that all events are delivered to it, and
|
|
# Grab the popup, so that all events are delivered to it, and
|
|
|
- # set focus to the canvas, to make keyboard navigation
|
|
|
|
|
|
|
+ # set focus to the slider, to make keyboard navigation
|
|
|
# easier.
|
|
# easier.
|
|
|
- Pmw.pushgrab(self._popup, 1, self._unpostCanvas)
|
|
|
|
|
- self._canvas.focus_set()
|
|
|
|
|
|
|
+ Pmw.pushgrab(self._popup, 1, self._unpostSlider)
|
|
|
|
|
+ self._widget.focus_set()
|
|
|
|
|
|
|
|
# Ignore the first release of the mouse button after posting the
|
|
# Ignore the first release of the mouse button after posting the
|
|
|
- # dropdown canvas, unless the mouse enters the dropdown canvas.
|
|
|
|
|
|
|
+ # dropdown slider, unless the mouse enters the dropdown slider.
|
|
|
self._fUpdate = 0
|
|
self._fUpdate = 0
|
|
|
self._fUnpost = 0
|
|
self._fUnpost = 0
|
|
|
self._firstPress = 1
|
|
self._firstPress = 1
|
|
|
self._fPressInsde = 0
|
|
self._fPressInsde = 0
|
|
|
|
|
|
|
|
def _updateValue(self,event):
|
|
def _updateValue(self,event):
|
|
|
- mouseX = self._canvas.canvasx(
|
|
|
|
|
- event.x_root - self._canvas.winfo_rootx())
|
|
|
|
|
|
|
+ mouseX = self._widget.canvasx(
|
|
|
|
|
+ event.x_root - self._widget.winfo_rootx())
|
|
|
if mouseX < self.left:
|
|
if mouseX < self.left:
|
|
|
mouseX = self.left
|
|
mouseX = self.left
|
|
|
if mouseX > self.right:
|
|
if mouseX > self.right:
|
|
@@ -341,16 +363,13 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
newVal = sf * (self['max'] - self['min']) + self['min']
|
|
newVal = sf * (self['max'] - self['min']) + self['min']
|
|
|
self.set(newVal)
|
|
self.set(newVal)
|
|
|
|
|
|
|
|
- def _sliderBtnPress(self, event):
|
|
|
|
|
|
|
+ def _widgetBtnPress(self, event):
|
|
|
# Check behavior for this button press
|
|
# Check behavior for this button press
|
|
|
- if self['style'] == VALUATOR_MINI:
|
|
|
|
|
- widget = self._popup
|
|
|
|
|
- xPos = event.x_root - widget.winfo_rootx()
|
|
|
|
|
- yPos = event.y_root - widget.winfo_rooty()
|
|
|
|
|
- fInside = ((xPos > 0) and (xPos < widget.winfo_width()) and
|
|
|
|
|
- (yPos > 0) and (yPos < widget.winfo_height()))
|
|
|
|
|
- else:
|
|
|
|
|
- fInside = 1
|
|
|
|
|
|
|
+ widget = self._popup
|
|
|
|
|
+ xPos = event.x_root - widget.winfo_rootx()
|
|
|
|
|
+ yPos = event.y_root - widget.winfo_rooty()
|
|
|
|
|
+ fInside = ((xPos > 0) and (xPos < widget.winfo_width()) and
|
|
|
|
|
+ (yPos > 0) and (yPos < widget.winfo_height()))
|
|
|
# Set flags based upon result
|
|
# Set flags based upon result
|
|
|
if fInside:
|
|
if fInside:
|
|
|
self._fPressInside = 1
|
|
self._fPressInside = 1
|
|
@@ -360,20 +379,20 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
self._fPressInside = 0
|
|
self._fPressInside = 0
|
|
|
self._fUpdate = 0
|
|
self._fUpdate = 0
|
|
|
|
|
|
|
|
- def _sliderMove(self, event):
|
|
|
|
|
|
|
+ def _widgetMove(self, event):
|
|
|
if self._firstPress and not self._fUpdate:
|
|
if self._firstPress and not self._fUpdate:
|
|
|
- canvasY = self._canvas.canvasy(
|
|
|
|
|
- event.y_root - self._canvas.winfo_rooty())
|
|
|
|
|
|
|
+ canvasY = self._widget.canvasy(
|
|
|
|
|
+ event.y_root - self._widget.winfo_rooty())
|
|
|
if canvasY > 0:
|
|
if canvasY > 0:
|
|
|
self._fUpdate = 1
|
|
self._fUpdate = 1
|
|
|
self._unpostOnNextRelease()
|
|
self._unpostOnNextRelease()
|
|
|
elif self._fUpdate:
|
|
elif self._fUpdate:
|
|
|
self._updateValue(event)
|
|
self._updateValue(event)
|
|
|
|
|
|
|
|
- def _sliderBtnRelease(self, event):
|
|
|
|
|
|
|
+ def _widgetBtnRelease(self, event):
|
|
|
if (self._fUnpost or
|
|
if (self._fUnpost or
|
|
|
(not (self._firstPress or self._fPressInside))):
|
|
(not (self._firstPress or self._fPressInside))):
|
|
|
- self._unpostCanvas()
|
|
|
|
|
|
|
+ self._unpostSlider()
|
|
|
# Otherwise, continue
|
|
# Otherwise, continue
|
|
|
self._fUpdate = 0
|
|
self._fUpdate = 0
|
|
|
self._firstPress = 0
|
|
self._firstPress = 0
|
|
@@ -382,7 +401,7 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
def _unpostOnNextRelease(self, event = None):
|
|
def _unpostOnNextRelease(self, event = None):
|
|
|
self._fUnpost = 1
|
|
self._fUnpost = 1
|
|
|
|
|
|
|
|
- def _unpostCanvas(self, event=None):
|
|
|
|
|
|
|
+ def _unpostSlider(self, event=None):
|
|
|
if not self._isPosted:
|
|
if not self._isPosted:
|
|
|
# It is possible to get events on an unposted popup. For
|
|
# It is possible to get events on an unposted popup. For
|
|
|
# example, by repeatedly pressing the space key to post
|
|
# example, by repeatedly pressing the space key to post
|
|
@@ -401,8 +420,8 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
|
|
|
|
|
self._isPosted = 0
|
|
self._isPosted = 0
|
|
|
|
|
|
|
|
- if self['style'] == VALUATOR_MINI:
|
|
|
|
|
- self.interior()['relief'] = RAISED
|
|
|
|
|
|
|
+ # Raise up arrow button
|
|
|
|
|
+ self.interior()['relief'] = RAISED
|
|
|
|
|
|
|
|
def _incrementValue(self, event):
|
|
def _incrementValue(self, event):
|
|
|
self.set(self.value + self.increment)
|
|
self.set(self.value + self.increment)
|
|
@@ -417,13 +436,24 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
def _goToMax(self, event):
|
|
def _goToMax(self, event):
|
|
|
self.set(self['max'])
|
|
self.set(self['max'])
|
|
|
|
|
|
|
|
|
|
+ def _firstScaleCommand(self, val):
|
|
|
|
|
+ """ Hack to avoid calling command on instantiation of Scale """
|
|
|
|
|
+ self._widget['command'] = self._scaleCommand
|
|
|
|
|
+
|
|
|
|
|
+ def _scaleCommand(self, val):
|
|
|
|
|
+ self.set(string.atof(val))
|
|
|
|
|
+
|
|
|
# Methods to modify floater characteristics
|
|
# Methods to modify floater characteristics
|
|
|
def setMin(self):
|
|
def setMin(self):
|
|
|
self._minLabel['text'] = self.formatString % self['min']
|
|
self._minLabel['text'] = self.formatString % self['min']
|
|
|
|
|
+ if self['style'] == VALUATOR_FULL:
|
|
|
|
|
+ self._widget['from_'] = self['min']
|
|
|
self.updateIndicator(self.value)
|
|
self.updateIndicator(self.value)
|
|
|
|
|
|
|
|
def setMax(self):
|
|
def setMax(self):
|
|
|
self._maxLabel['text'] = self.formatString % self['max']
|
|
self._maxLabel['text'] = self.formatString % self['max']
|
|
|
|
|
+ if self['style'] == VALUATOR_FULL:
|
|
|
|
|
+ self._widget['to'] = self['max']
|
|
|
self.updateIndicator(self.value)
|
|
self.updateIndicator(self.value)
|
|
|
|
|
|
|
|
def setNumDigits(self):
|
|
def setNumDigits(self):
|
|
@@ -433,18 +463,9 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
self.updateIndicator(self.value)
|
|
self.updateIndicator(self.value)
|
|
|
self.increment = pow(10, -self['numDigits'])
|
|
self.increment = pow(10, -self['numDigits'])
|
|
|
|
|
|
|
|
- def _changeConfiguration(self, event):
|
|
|
|
|
- newWidth = self._canvas.winfo_width()
|
|
|
|
|
- self.left = -newWidth/2.0 + self.xPad
|
|
|
|
|
- self.right = newWidth/2.0 - self.xPad
|
|
|
|
|
- self._canvas.configure(scrollregion = (-newWidth/2.0, self.top,
|
|
|
|
|
- newWidth/2.0, self.bottom))
|
|
|
|
|
- self._canvas.coords('line', self.left, 0, self.right, 0)
|
|
|
|
|
- self.updateIndicator(self.value)
|
|
|
|
|
-
|
|
|
|
|
def _getMarkerX(self):
|
|
def _getMarkerX(self):
|
|
|
# Get marker triangle coordinates
|
|
# Get marker triangle coordinates
|
|
|
- c = self._canvas.coords(self._marker)
|
|
|
|
|
|
|
+ c = self._widget.coords(self._marker)
|
|
|
# Marker postion defined as X position of third vertex
|
|
# Marker postion defined as X position of third vertex
|
|
|
return c[4]
|
|
return c[4]
|
|
|
|
|
|
|
@@ -455,11 +476,11 @@ class SliderWidget(Pmw.MegaWidget):
|
|
|
self.interior()['borderwidth'] = self['borderwidth']
|
|
self.interior()['borderwidth'] = self['borderwidth']
|
|
|
|
|
|
|
|
def setBackground(self):
|
|
def setBackground(self):
|
|
|
- self._canvas['background'] = self['background']
|
|
|
|
|
|
|
+ self._widget['background'] = self['background']
|
|
|
|
|
|
|
|
def highlightWidget(self, event):
|
|
def highlightWidget(self, event):
|
|
|
self._arrowBtn.itemconfigure('arrow', fill = 'black')
|
|
self._arrowBtn.itemconfigure('arrow', fill = 'black')
|
|
|
|
|
|
|
|
def restoreWidget(self, event):
|
|
def restoreWidget(self, event):
|
|
|
- self._arrowBtn.itemconfigure('arrow', fill = '#A0A0A0')
|
|
|
|
|
|
|
+ self._arrowBtn.itemconfigure('arrow', fill = 'grey50')
|
|
|
|
|
|