diff --git a/IPython/html/widgets/widget_float.py b/IPython/html/widgets/widget_float.py
index 506fb03..639eb87 100644
--- a/IPython/html/widgets/widget_float.py
+++ b/IPython/html/widgets/widget_float.py
@@ -38,14 +38,29 @@ class _BoundedFloat(_Float):
def __init__(self, *pargs, **kwargs):
"""Constructor"""
super(_BoundedFloat, self).__init__(*pargs, **kwargs)
- self._validate('value', None, self.value)
- self.on_trait_change(self._validate, ['value', 'min', 'max'])
+ self._value_changed('value', None, self.value)
+ self._min_changed('min', None, self.min)
+ self._max_changed('max', None, self.max)
- def _validate(self, name, old, new):
- """Validate value, max, min."""
+ def _value_changed(self, name, old, new):
+ """Validate value."""
if self.min > new or new > self.max:
self.value = min(max(new, self.min), self.max)
+ def _max_changed(self, name, old, new):
+ """Make sure the min is always <= the max."""
+ if new < self.min:
+ raise ValueError("setting max < min")
+ if new < self.value:
+ self.value = new
+
+ def _min_changed(self, name, old, new):
+ """Make sure the max is always >= the min."""
+ if new > self.max:
+ raise ValueError("setting min > max")
+ if new > self.value:
+ self.value = new
+
@register('IPython.FloatText')
class FloatText(_Float):
diff --git a/IPython/html/widgets/widget_int.py b/IPython/html/widgets/widget_int.py
index 73ca5cf..678054e 100644
--- a/IPython/html/widgets/widget_int.py
+++ b/IPython/html/widgets/widget_int.py
@@ -41,24 +41,28 @@ class _BoundedInt(_Int):
def __init__(self, *pargs, **kwargs):
"""Constructor"""
super(_BoundedInt, self).__init__(*pargs, **kwargs)
- self.on_trait_change(self._validate_value, ['value'])
- self.on_trait_change(self._handle_max_changed, ['max'])
- self.on_trait_change(self._handle_min_changed, ['min'])
+ self._value_changed('value', None, self.value)
+ self._min_changed('min', None, self.min)
+ self._max_changed('max', None, self.max)
- def _validate_value(self, name, old, new):
+ def _value_changed(self, name, old, new):
"""Validate value."""
if self.min > new or new > self.max:
self.value = min(max(new, self.min), self.max)
- def _handle_max_changed(self, name, old, new):
+ def _max_changed(self, name, old, new):
"""Make sure the min is always <= the max."""
if new < self.min:
raise ValueError("setting max < min")
+ if new < self.value:
+ self.value = new
- def _handle_min_changed(self, name, old, new):
+ def _min_changed(self, name, old, new):
"""Make sure the max is always >= the min."""
if new > self.max:
raise ValueError("setting min > max")
+ if new > self.value:
+ self.value = new
@register('IPython.IntText')
class IntText(_Int):