Labrador/Desktop_Interface/ui_elements/espospinbox.cpp

111 lines
3.0 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;
}
}