46 lines
1.1 KiB
Python
46 lines
1.1 KiB
Python
|
from math import inf
|
||
|
|
||
|
from ..Qt import QtWidgets, QtGui
|
||
|
|
||
|
|
||
|
class SciSpinBox(QtWidgets.QDoubleSpinBox):
|
||
|
def __init__(self, parent=None):
|
||
|
super().__init__(parent=parent)
|
||
|
|
||
|
self.validator = QtGui.QDoubleValidator(self)
|
||
|
|
||
|
self.setMinimum(-inf)
|
||
|
self.setMaximum(inf)
|
||
|
self.setDecimals(1000)
|
||
|
self.precision = 0.001
|
||
|
|
||
|
self._prev_value = float(self.lineEdit().text())
|
||
|
|
||
|
def valueFromText(self, text: str) -> float:
|
||
|
try:
|
||
|
self._prev_value = float(self.cleanText())
|
||
|
except ValueError:
|
||
|
pass
|
||
|
return self._prev_value
|
||
|
|
||
|
def textFromValue(self, value: float) -> str:
|
||
|
if value == 0:
|
||
|
return '0'
|
||
|
else:
|
||
|
return f'{value:.3e}'
|
||
|
|
||
|
def stepBy(self, step: int):
|
||
|
self._prev_value = self.value()
|
||
|
|
||
|
new_value = self._prev_value
|
||
|
if new_value != 0.0:
|
||
|
new_value *= 10**(step/19.)
|
||
|
else:
|
||
|
new_value = 0.001
|
||
|
|
||
|
self.setValue(new_value)
|
||
|
self.lineEdit().setText(f'{new_value:.3e}')
|
||
|
|
||
|
def validate(self, text, pos):
|
||
|
return self.validator.validate(text, pos)
|