mirror of https://github.com/EspoTek/Labrador.git
111 lines
2.8 KiB
C++
111 lines
2.8 KiB
C++
#include "espospinbox.h"
|
|
|
|
espoSpinBox::espoSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
|
|
{
|
|
setKeyboardTracking(false);
|
|
//connect(this, SIGNAL(valueChanged(double)), this, SLOT(changeStepping(double)));
|
|
}
|
|
|
|
QString espoSpinBox::textFromValue(double value) const{
|
|
QString windowText;
|
|
|
|
double approximatelyZero = pow(10, -1 * (decimals() + 1));
|
|
|
|
if (abs(value) <= approximatelyZero){
|
|
QTextStream(&windowText) << 0;
|
|
lastValidValue = 0;
|
|
return windowText;
|
|
}
|
|
if (abs(value) >= 1000000){
|
|
QTextStream(&windowText) << value/1000000 << "M";
|
|
lastValidValue = value;
|
|
return windowText;
|
|
}
|
|
if (abs(value) >= 1000){
|
|
QTextStream(&windowText) << value/1000 << "k";
|
|
lastValidValue = value;
|
|
return windowText;
|
|
}
|
|
if (abs(value) >= 1){
|
|
QTextStream(&windowText) << value;
|
|
lastValidValue = value;
|
|
return windowText;
|
|
}
|
|
if (abs(value) >= 1/1000){
|
|
QTextStream(&windowText) << value * 1000 << "m";
|
|
lastValidValue = value;
|
|
return windowText;
|
|
}
|
|
if (abs(value) >= 1/1000000){
|
|
QTextStream(&windowText) << value * 1000000 << "u";
|
|
lastValidValue = value;
|
|
return windowText;
|
|
}
|
|
return "invalid";
|
|
}
|
|
|
|
void espoSpinBox::maximumChanged(double linked){
|
|
this->setMaximum(9.6-linked);
|
|
}
|
|
|
|
void espoSpinBox::setMax(double newMax){
|
|
this->setMaximum(newMax);
|
|
}
|
|
|
|
void espoSpinBox::setMin(double newMin){
|
|
this->setMinimum(newMin);
|
|
}
|
|
|
|
void espoSpinBox::changeStepping(double value){
|
|
double roundval = pow(10.0, floor(log10(abs(value)))); //http://stackoverflow.com/questions/22491505/how-to-round-down-to-the-nearest-power-of-10
|
|
double minimumStepSize = pow(10, -1 * decimals());
|
|
setSingleStep(std::max(minimumStepSize, roundval/10));
|
|
}
|
|
|
|
QValidator::State espoSpinBox::validate(QString& text, int& pos) const
|
|
{
|
|
return QValidator::State::Acceptable;
|
|
}
|
|
|
|
double espoSpinBox::valueFromText(const QString &text) const
|
|
{
|
|
double ret;
|
|
bool isValid;
|
|
|
|
uint32_t prefixLength = text.length() - suffix().length();
|
|
|
|
qDebug() << text.mid(0, prefixLength - 1) << text.at(prefixLength - 1).toLatin1();
|
|
|
|
switch (text.at(prefixLength - 1).toLatin1())
|
|
{
|
|
case 'M':
|
|
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000000;
|
|
break;
|
|
|
|
case 'k':
|
|
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000;
|
|
break;
|
|
|
|
case 'm':
|
|
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000;
|
|
break;
|
|
|
|
case 'u':
|
|
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000000;
|
|
break;
|
|
|
|
default:
|
|
ret = text.mid(0, prefixLength).toDouble(&isValid);
|
|
}
|
|
|
|
if (isValid)
|
|
{
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "espoSpinBox: warning: invalid text input." << "Defaulting to last known good value of" << lastValidValue;
|
|
return lastValidValue;
|
|
}
|
|
}
|