Source code for pyleecan.GUI.Tools.FloatEdit
# -*- coding: utf-8 -*-
from re import compile, search
from PySide2 import QtGui
from PySide2.QtGui import QDoubleValidator
from PySide2.QtWidgets import QLineEdit
from ...GUI import gui_option
_float_re = compile(r"(([+-]?\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)")
[docs]def valid_float_string(string):
"""
Parameters
----------
string :
Returns
-------
"""
match = _float_re.search(string)
return match.groups()[0] == string if match else False
[docs]class FloatEdit(QLineEdit):
"""A Line Edit Widget optimized to input float"""
def __init__(self, unit="", *args, **kwargs):
"""Same constructor as QLineEdit + config validator"""
self.unit = unit
self.u = gui_option.unit
# Call the Line Edit constructor
super(FloatEdit, self).__init__(*args, **kwargs)
# Setup the validator
Validator = FloatValidator(-1e18, 1e18, 10)
Validator.Notation = QDoubleValidator.ScientificNotation
self.setValidator(Validator)
[docs] def setValue(self, value):
"""Allow to set the containt of the Widget with a float
Parameters
----------
self :
A FloatEdit object
value :
A float value to set the Text
Returns
-------
"""
if value in [None, ""]:
self.clear()
else:
if self.unit == "m":
self.setText(format(self.u.get_m(value), ".8g"))
else:
self.setText(format(value, ".8g"))
[docs] def value(self):
"""Return the content of the Widget as a float
Parameters
----------
self :
A FloatEdit object
Returns
-------
"""
try:
self.setText(self.validator().fixup_txt(self.text(), self.u, self.unit))
if self.text() == "":
return None
else:
value = float(self.text())
if self.unit == "m":
return self.u.set_m(value)
else:
return value
except Exception:
return None
[docs]class FloatValidator(QDoubleValidator):
"""DoubleValidator with fixup method to correct the input"""
[docs] def validate(self, string, position):
"""
Parameters
----------
string :
position :
Returns
-------
"""
string = string.replace(",", ".")
match = search(r"^[+-]?($|(\d+\.?|\.?(\d+|$))\d*($|([eE][+-]?)?\d*$))", string)
is_intermediate = True if match else False
if valid_float_string(string) or string == "":
state = QtGui.QValidator.Acceptable
elif is_intermediate:
state = QtGui.QValidator.Intermediate
else:
state = QtGui.QValidator.Invalid
return (state, string, position)
[docs] def fixup_txt(self, text, gui_unit, val_unit):
"""When the input text is wrong, fixup is called to correct it in
the field
Parameters
----------
self :
A FloatValidator object
text :
The text to correct
gui_unit :
Current gui unit system
val_unit :
Unit used by the FloatEdit
Returns
-------
"""
if text != "": # We can't correct an empty text
# 12,10 can't be converted to float 12.10 can
text = text.replace(",", ".")
try:
top = self.top()
bottom = self.bottom()
# Check unit
if val_unit == "m":
top = gui_unit.get_m(top)
bottom = gui_unit.get_m(bottom)
# If the input is too high...
if float(text) > top:
# ... we replace it by the maximum
text = str(top)
# If the input is too low...
elif float(text) < bottom:
# ... we replace it by the minimum
text = str(bottom)
except ValueError: # Can't convert value to float => not complete
pass
return text