forked from IPKM/nmreval
		
	
		
			
				
	
	
		
			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)
 |