diff --git a/double_slider.py b/double_slider.py new file mode 100644 index 0000000..460159c --- /dev/null +++ b/double_slider.py @@ -0,0 +1,33 @@ +from __future__ import division +from future.builtins import super + +from PyQt5.QtWidgets import QSlider + + +class QDoubleSlider(QSlider): + + def __init__(self, parent, min_value, max_value, step, init_value=None): + super().__init__(parent) + self.min_value = min_value + self.max_value = max_value + self.step = step + self.init_value = init_value + self.nvalues = int((max_value - min_value)/step) + + true_max_value = min_value + step*self.nvalues + if true_max_value != max_value: + self.max_value = true_max_value + + self.setMinimum(self.float_2_int(min_value)) + self.setMaximum(self.float_2_int(max_value)) + if init_value is not None: + self.setValue(self.float_2_int(init_value)) + + def int_2_float(self, value): + return (self.max_value - self.min_value)*value/self.nvalues + \ + self.min_value + + def float_2_int(self, value): + return int( + self.nvalues*(value - self.min_value) / + (self.max_value - self.min_value)) diff --git a/moulder.py b/moulder.py index 8b24f4e..9fb61e9 100644 --- a/moulder.py +++ b/moulder.py @@ -15,6 +15,7 @@ from PyQt5.QtWidgets import QSlider, QHBoxLayout, QLabel, QDialog from PyQt5.QtWidgets import QDialogButtonBox, QDoubleSpinBox from figure_canvas import GravityModelCanvas +from double_slider import QDoubleSlider from interactive import Moulder from configure_dialog import ConfigureMeassurementDialog @@ -118,11 +119,9 @@ class MoulderApp(QMainWindow): self.density_spinbox.setValue(0) self.density_spinbox.setSingleStep(1) - self.error_slider = QSlider(Qt.Horizontal) - self.error_slider.setMinimum(0) - self.error_slider.setMaximum(5) - self.error_slider.setValue(0) - self.error_slider.setTickInterval(0.5) + self.error_slider = QDoubleSlider(Qt.Horizontal, 0, 5, 0.5, + init_value=0) + self.error_slider.setTickInterval(self.error_slider.float_2_int(0.5)) self.error_slider.setTickPosition(QSlider.TicksBelow) self.error_spinbox = QDoubleSpinBox() self.error_spinbox.setMinimum(0) @@ -160,10 +159,11 @@ class MoulderApp(QMainWindow): self.density_slider.setValue(value) self.moulder.set_density(value) elif sender == self.error_slider: + value = self.error_slider.int_2_float(value) self.error_spinbox.setValue(value) self.moulder.set_error(value) elif sender == self.error_spinbox: - self.error_slider.setValue(value) + self.error_slider.setValue(self.error_slider.float_2_int(value)) self.moulder.set_error(value) def _quit_callback(self):