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:
David Vierra 2017-03-30 03:55:13 -10:00
parent e583a91a95
commit 8d3b90d815

View File

@ -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
@ -23,6 +25,8 @@ class SpinSlider(QtGui.QWidget):
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)
@ -57,15 +61,41 @@ class SpinSlider(QtGui.QWidget):
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