Source code for qargparser.number

from .arg import Arg
from .Qt import QtWidgets, QtCore

class DoubleSlider(QtWidgets.QSlider):

    doubleValueChanged = QtCore.Signal(float)

    def __init__(self, orient=QtCore.Qt.Horizontal , parent=None, decimals=3):
        super(DoubleSlider, self).__init__(orient, parent)
        self._multi = 10 ** decimals

        self.valueChanged.connect(self.emitDoubleValueChanged)

    def emitDoubleValueChanged(self):
        value = float(super(DoubleSlider, self).value()) / self._multi
        self.doubleValueChanged.emit(value)

    def value(self):
        return float(super(DoubleSlider, self).value()) / self._multi

    def setMinimum(self, value):
        super(DoubleSlider, self).setMinimum(value * self._multi)

    def setMaximum(self, value):
        return super(DoubleSlider, self).setMaximum(value * self._multi)

    def setSingleStep(self, value):
        super(DoubleSlider, self).setSingleStep(value * self._multi)

    def singleStep(self):
        return float(super(DoubleSlider, self).singleStep()) / self._multi

    def setValue(self, value):
        super(DoubleSlider, self).setValue(int(value * self._multi))

class AbstractSliderSpinBox(QtWidgets.QWidget):
    valueChanged = QtCore.Signal(int)

    def __init__(self, min=0.0, max=1.0, step=1.0, default=0.0, *args, **kwargs):
        use_slider = kwargs.pop("slider", False)

        super(AbstractSliderSpinBox, self).__init__(*args, **kwargs)

        if isinstance(self, SliderSpinBox):
            self.spin_box = QtWidgets.QSpinBox()
            self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
            self.slider.valueChanged.connect(self.spin_box.setValue)
        else:
            self.spin_box = QtWidgets.QDoubleSpinBox()
            self.slider = DoubleSlider(QtCore.Qt.Horizontal)
            self.slider.doubleValueChanged.connect(self.spin_box.setValue)
            
        self.setMinimum(min)
        self.setMaximum(max)
        self.setSingleStep(step)
        self.setValue(default)

        self.spin_box.valueChanged.connect(self.slider.setValue)
        self.spin_box.valueChanged.connect(self.valueChanged.emit)

        lay = QtWidgets.QHBoxLayout(self)
        lay.setContentsMargins(0, 0, 0, 0)
        lay.addWidget(self.slider)
        lay.addWidget(self.spin_box)

        self.set_slider_visible(use_slider)

    def value(self):
        return self.spin_box.value()

    def singleStep(self):
        return self.spin_box.singleStep()

    def setValue(self, value):
        self.spin_box.setValue(value)
        self.slider.setValue(value)

    def setMinimum(self, value):
        self.spin_box.setMinimum(value)
        self.slider.setMinimum(value)

    def setMaximum(self, value):
        self.spin_box.setMaximum(value)
        self.slider.setMaximum(value)

    def setSingleStep(self, value):
        self.spin_box.setSingleStep(value)
        self.slider.setSingleStep(value)
        self.slider.setTickInterval(value)

    def set_slider_visible(self, show):
        self.slider.setVisible(show)

class SliderSpinBox(AbstractSliderSpinBox):
    pass

class SliderDoubleSpinBox(AbstractSliderSpinBox):
    pass

class Number(Arg):

    def create(self):
        #Widget
        if isinstance(self, Float):
            _cls = SliderDoubleSpinBox
        else:
            _cls = SliderSpinBox

        wdg = _cls(slider=self._data["slider"],
                   step=self._data["step"],
                   min=self._data['min'],
                   max=self._data['max'],
                   default=self._data['default'])

        self._write = wdg.setValue
        self._read = wdg.value

        wdg.valueChanged.connect(self.on_changed)

        self.wdg = wdg
        return wdg

    def reset(self):
        self._write(self._data['default'])

    def _update(self):
        super(Number, self)._update()
        self.wdg.setMaximum(self._data["max"])
        self.wdg.setMinimum(self._data["min"])
        self.wdg.setSingleStep(self._data["step"])
        self.wdg.set_slider_visible(self._data["slider"])

[docs]class Integer(Number): """ Integer argument widget. :param default: The default value, defaults to 0 :type default: int, optional :param step: The step, defaults to 0 :type step: int, optional :param min: The minimum value, defaults to -10000 :type min: int, optional :param max: The maximum value, defaults to 10000 :type max: int, optional :param slider: Add a slider if True, defaults to False :type slider: bool, optional :return: The new instance :rtype: :class:`~qargparser.number.Integer` instance """ pass
[docs]class Float(Number): """ Float argument widget. :param default: The default value, defaults to 0.0 :type default: float, optional :param step: The step, defaults to 0.1 :type step: float, optional :param min: The minimum value, defaults to -10000.0 :type min: float, optional :param max: The maximum value, defaults to 10000.0 :type max: float, optional :param slider: Add a slider if True, defaults to False :type slider: bool, optional :return: The new instance :rtype: :class:`~qargparser.number.Float` instance """ pass