Source code for qudi.util.widgets.slider
# -*- coding: utf-8 -*-
"""
This file contains a wrapper to display the SpinBox in scientific way
.. Copyright (c) 2021, the qudi developers. See the AUTHORS.md file at the top-level directory of this
.. distribution and on <https://github.com/Ulm-IQO/qudi-core/>
..
.. This file is part of qudi.
..
.. Qudi is free software: you can redistribute it and/or modify it under the terms of
.. the GNU Lesser General Public License as published by the Free Software Foundation,
.. either version 3 of the License, or (at your option) any later version.
..
.. Qudi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
.. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.. See the GNU Lesser General Public License for more details.
..
.. You should have received a copy of the GNU Lesser General Public License along with qudi.
.. If not, see <https://www.gnu.org/licenses/>.
"""
__all__ = ['DoubleSlider']
from PySide2 import QtCore, QtWidgets
[docs]
class DoubleSlider(QtWidgets.QSlider):
""" """
doubleValueChanged = QtCore.Signal(float)
doubleSliderMoved = QtCore.Signal(float)
doubleRangeChanged = QtCore.Signal(float, float)
[docs]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._step_number = 1000
self._minimum_value = 0
self._maximum_value = 1
super().setRange(0, self._step_number)
self.valueChanged.connect(self.__translate_value_changed)
self.sliderMoved.connect(self.__translate_slider_moved)
self.rangeChanged.connect(self.__translate_range_changed)
return
[docs]
def setMinimum(self, min_val):
self._minimum_value = float(min_val)
return
[docs]
def setMaximum(self, max_val):
self._maximum_value = float(max_val)
return
[docs]
def setRange(self, min_val, max_val):
self._minimum_value = float(min_val)
self._maximum_value = float(max_val)
return
[docs]
def minimum(self):
return self._minimum_value
[docs]
def maximum(self):
return self._maximum_value
[docs]
def value(self):
int_val = super().value()
return self.minimum() + (self.maximum() - self.minimum()) * (
int_val / self._step_number
)
[docs]
def setValue(self, val):
max_val = self.maximum()
min_val = self.minimum()
val = max(min_val, min(max_val, val))
int_val = int(round((val - min_val) * self._step_number / (max_val - min_val)))
super().setValue(int_val)
@property
def granularity(self) -> int:
return self._step_number + 1
[docs]
def set_granularity(self, number_of_steps):
"""
Set the granularity of the slider, i.e., the number of discrete steps within the value range.
Parameters
----------
number_of_steps : int
The number of discrete positions the slider has.
"""
number_of_steps = int(number_of_steps)
if number_of_steps < 1:
raise ValueError('Number of steps must be larger than 0.')
self._step_number = number_of_steps - 1 # Include 0 as position
super().setRange(0, self._step_number)
return
@QtCore.Slot(int)
def __translate_value_changed(self, int_val):
self.doubleValueChanged.emit(
self.minimum()
+ (self.maximum() - self.minimum()) * (int_val / self._step_number)
)
return
@QtCore.Slot(int)
def __translate_slider_moved(self, int_val):
self.doubleSliderMoved.emit(
self.minimum()
+ (self.maximum() - self.minimum()) * (int_val / self._step_number)
)
return
@QtCore.Slot()
def __translate_range_changed(self):
self.doubleRangeChanged.emit(self.minimum(), self.maximum())
return