SpinSlider no longer sets value back-and-forth between slider and spinbox
Prevents feedback loops when float values can't be converted exactly
This commit is contained in:
parent
e583a91a95
commit
8d3b90d815
@ -3,6 +3,8 @@
|
|||||||
"""
|
"""
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
import logging
|
import logging
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from PySide import QtGui, QtCore
|
from PySide import QtGui, QtCore
|
||||||
from PySide.QtCore import Qt
|
from PySide.QtCore import Qt
|
||||||
from mcedit2.util.load_ui import registerCustomWidget
|
from mcedit2.util.load_ui import registerCustomWidget
|
||||||
@ -22,7 +24,9 @@ class SpinSlider(QtGui.QWidget):
|
|||||||
increment = kwargs.pop('increment', None)
|
increment = kwargs.pop('increment', None)
|
||||||
if increment is None:
|
if increment is None:
|
||||||
increment = 0.1 if isDouble else 1
|
increment = 0.1 if isDouble else 1
|
||||||
|
|
||||||
|
self._changing = False
|
||||||
|
|
||||||
self.isDouble = isDouble
|
self.isDouble = isDouble
|
||||||
|
|
||||||
super(SpinSlider, self).__init__(*args, **kwargs)
|
super(SpinSlider, self).__init__(*args, **kwargs)
|
||||||
@ -49,23 +53,49 @@ class SpinSlider(QtGui.QWidget):
|
|||||||
self.slider.sliderReleased.connect(self.sliderReleased)
|
self.slider.sliderReleased.connect(self.sliderReleased)
|
||||||
|
|
||||||
self.setLayout(Row(self.spinBox, self.slider, margin=0))
|
self.setLayout(Row(self.spinBox, self.slider, margin=0))
|
||||||
|
|
||||||
if minimum is not None:
|
if minimum is not None:
|
||||||
self.setMinimum(minimum)
|
self.setMinimum(minimum)
|
||||||
if maximum is not None:
|
if maximum is not None:
|
||||||
self.setMaximum(maximum)
|
self.setMaximum(maximum)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
self.setValue(value)
|
self.setValue(value)
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def suppressChanges(self):
|
||||||
|
try:
|
||||||
|
self._changing = True
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
self._changing = False
|
||||||
|
|
||||||
|
def toSlider(self, value):
|
||||||
|
return value * self.sliderFactor
|
||||||
|
|
||||||
|
def fromSlider(self, value):
|
||||||
|
return value / self.sliderFactor
|
||||||
|
|
||||||
def spinBoxChanged(self, value):
|
def spinBoxChanged(self, value):
|
||||||
|
if self._changing:
|
||||||
|
return
|
||||||
|
|
||||||
self._value = value
|
self._value = value
|
||||||
self.slider.setValue(value * self.sliderFactor)
|
|
||||||
|
with self.suppressChanges():
|
||||||
|
self.slider.setValue(self.toSlider(value))
|
||||||
|
|
||||||
self.valueChanged.emit(value, False)
|
self.valueChanged.emit(value, False)
|
||||||
|
|
||||||
def sliderChanged(self, value):
|
def sliderChanged(self, value):
|
||||||
value /= self.sliderFactor
|
if self._changing:
|
||||||
|
return
|
||||||
|
|
||||||
|
value = self.fromSlider(value)
|
||||||
self._value = value
|
self._value = value
|
||||||
self.spinBox.setValue(value)
|
|
||||||
|
with self.suppressChanges():
|
||||||
|
self.spinBox.setValue(value)
|
||||||
|
|
||||||
self.valueChanged.emit(value, self.slider.isSliderDown())
|
self.valueChanged.emit(value, self.slider.isSliderDown())
|
||||||
|
|
||||||
def sliderReleased(self):
|
def sliderReleased(self):
|
||||||
@ -77,7 +107,9 @@ class SpinSlider(QtGui.QWidget):
|
|||||||
def setValue(self, value):
|
def setValue(self, value):
|
||||||
self._value = value
|
self._value = value
|
||||||
self.spinBox.setValue(value)
|
self.spinBox.setValue(value)
|
||||||
self.slider.setValue(value * self.sliderFactor)
|
# if value is not None:
|
||||||
|
# value *= self.sliderFactor
|
||||||
|
# self.slider.setValue(value)
|
||||||
|
|
||||||
def minimum(self):
|
def minimum(self):
|
||||||
return self._minimum
|
return self._minimum
|
||||||
|
Reference in New Issue
Block a user