diff --git a/src/Gui/DlgUnitsCalculator.ui b/src/Gui/DlgUnitsCalculator.ui index 636eae6be9..b7f3758f5a 100644 --- a/src/Gui/DlgUnitsCalculator.ui +++ b/src/Gui/DlgUnitsCalculator.ui @@ -24,6 +24,9 @@ 0 + + input the source value and unit + @@ -34,13 +37,19 @@ - + 100 0 + + specify here the result unit + + + + @@ -58,6 +67,9 @@ 0 + + result + true @@ -67,6 +79,10 @@ + + List of last used calculations +To add a calculation press Return in the value input field + true @@ -82,7 +98,7 @@ - + 0 @@ -112,13 +128,6 @@ - - - - Help - - - @@ -134,6 +143,9 @@ + + copies result into the clipboard + Copy diff --git a/src/Gui/DlgUnitsCalculatorImp.cpp b/src/Gui/DlgUnitsCalculatorImp.cpp index ded183021e..2a84ae88d0 100644 --- a/src/Gui/DlgUnitsCalculatorImp.cpp +++ b/src/Gui/DlgUnitsCalculatorImp.cpp @@ -51,11 +51,10 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) this->setAttribute(Qt::WA_DeleteOnClose); connect(ui->ValueInput, SIGNAL(valueChanged(Base::Quantity)), this, SLOT(valueChanged(Base::Quantity))); - connect(ui->ValueInput, SIGNAL(returnPressed () ), this, SLOT(returnPressed())); - connect(ui->UnitInput, SIGNAL(valueChanged(Base::Quantity)), this, SLOT(unitValueChanged(Base::Quantity))); + connect(ui->ValueInput, SIGNAL(returnPressed()), this, SLOT(returnPressed())); + connect(ui->UnitInput, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); connect(ui->UnitInput, SIGNAL(returnPressed()), this, SLOT(returnPressed())); - connect(ui->pushButton_Help, SIGNAL(clicked()), this, SLOT(help())); connect(ui->pushButton_Close, SIGNAL(clicked()), this, SLOT(accept())); connect(ui->pushButton_Copy, SIGNAL(clicked()), this, SLOT(copy())); @@ -63,7 +62,9 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) connect(ui->UnitInput, SIGNAL(parseError(QString)), this, SLOT(parseError(QString))); ui->ValueInput->setParamGrpPath(QByteArray("User parameter:BaseApp/History/UnitsCalculator")); - actUnit.setInvalid(); + // set a default that also illustrates how the dialog works + ui->ValueInput->setText(QString::fromLatin1("1 cm")); + ui->UnitInput->setText(QString::fromLatin1("in")); units << Base::Unit::Length << Base::Unit::Mass << Base::Unit::Angle << Base::Unit::Density << Base::Unit::Area << Base::Unit::Volume << Base::Unit::TimeSpan << Base::Unit::Frequency @@ -72,7 +73,7 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) << Base::Unit::AmountOfSubstance << Base::Unit::LuminousIntensity << Base::Unit::Stress << Base::Unit::Pressure << Base::Unit::Force << Base::Unit::Work << Base::Unit::Power << Base::Unit::ThermalConductivity << Base::Unit::ThermalExpansionCoefficient - << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient <::iterator it = units.begin(); it != units.end(); ++it) { ui->unitsBox->addItem(it->getTypeString()); } @@ -95,31 +96,43 @@ void DlgUnitsCalculator::reject() QDialog::reject(); } -void DlgUnitsCalculator::unitValueChanged(const Base::Quantity& unit) +void DlgUnitsCalculator::textChanged(QString unit) { - actUnit = unit; - valueChanged(actValue); + valueChanged(actValue); } void DlgUnitsCalculator::valueChanged(const Base::Quantity& quant) { - if (actUnit.isValid()) { - if (actUnit.getUnit() != quant.getUnit()) { - ui->ValueOutput->setText(tr("Unit mismatch")); - ui->pushButton_Copy->setEnabled(false); - } else { - double value = quant.getValue()/actUnit.getValue(); - QString val = QLocale::system().toString(value, 'f', Base::UnitsApi::getDecimals()); - QString out = QString::fromLatin1("%1 %2").arg(val, ui->UnitInput->text()); - ui->ValueOutput->setText(out); - ui->pushButton_Copy->setEnabled(true); - } - } else { - //ui->ValueOutput->setValue(quant); - ui->ValueOutput->setText(quant.getUserString()); - ui->pushButton_Copy->setEnabled(true); - } - + // first check the unit, if it is invalid, getTypeString() outputs an empty string + if (Base::Unit(ui->UnitInput->text()).getTypeString().isEmpty()) { + ui->ValueOutput->setText(tr("unknown unit: ") + ui->UnitInput->text()); + ui->pushButton_Copy->setEnabled(false); + } else { // the unit is valid + // we can only convert units of the same type, thus check + if (Base::Unit(ui->UnitInput->text()).getTypeString() != quant.getUnit().getTypeString()) { + ui->ValueOutput->setText(tr("unit mismatch")); + ui->pushButton_Copy->setEnabled(false); + } else { // the unit is valid and has the same type + Base::Quantity inputt = Base::Quantity(1.0, ui->UnitInput->text()); + // this gives us e.g. for "1 in" the value '25.4' because 1 in = 25.4 mm + double convertValue = Base::Quantity::parse(QString::fromLatin1("1") + ui->UnitInput->text()).getValue(); + // the result is now just input / convertValue because the imput is always in a base unit + // (an input of "1 cm" will immediately be converted to "10 mm" by Gui::InputField from the dialog) + double value = quant.getValue() / convertValue; + // determine how many decimals we will need to avoid an output like "0.00" + // at first use scientific notation, if there is no "e", we can round it to the user-defined decimals + // the user-defined decimals might be too low for cases like "10 um" in "in", + // thus only if value > 0.005 because FC's default are 2 decimals + QString val = QLocale::system().toString(value, 'g'); + if (!val.contains(QChar::fromLatin1('e')) && (value > 0.005)) + val = QLocale::system().toString(value, 'f', Base::UnitsApi::getDecimals()); + // create the output string + QString out = QString::fromLatin1("%1 %2").arg(val, ui->UnitInput->text()); + ui->ValueOutput->setText(out); + ui->pushButton_Copy->setEnabled(true); + } + } + // store the input value actValue = quant; } @@ -135,11 +148,6 @@ void DlgUnitsCalculator::copy(void) cb->setText(ui->ValueOutput->text()); } -void DlgUnitsCalculator::help(void) -{ - //TODO: call help page Std_UnitsCalculator -} - void DlgUnitsCalculator::returnPressed(void) { if (ui->pushButton_Copy->isEnabled()) { diff --git a/src/Gui/DlgUnitsCalculatorImp.h b/src/Gui/DlgUnitsCalculatorImp.h index 9d7ef6aa11..745b091399 100644 --- a/src/Gui/DlgUnitsCalculatorImp.h +++ b/src/Gui/DlgUnitsCalculatorImp.h @@ -50,19 +50,17 @@ protected: void reject(); protected Q_SLOTS: - void unitValueChanged(const Base::Quantity&); + void textChanged(const QString); void valueChanged(const Base::Quantity&); void on_unitsBox_activated(int); void copy(void); - void help(void); void returnPressed(void); void parseError(const QString& errorText); private: Base::Quantity actValue; - Base::Quantity actUnit; std::unique_ptr ui; QList units; };