// SPDX-License-Identifier: LGPL-2.1-or-later /*************************************************************************** * Copyright (c) 2005 Werner Mayer * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "Dialogs/DlgSettingsColorGradientImp.h" #include "ui_DlgSettingsColorGradient.h" #include "SpinBox.h" #include "Tools.h" using namespace Gui::Dialog; /* TRANSLATOR Gui::Dialog::DlgSettingsColorGradientImp */ /** * Constructs a DlgSettingsColorGradientImp as a child of 'parent', with the * name 'name' and widget flags set to 'f'. */ DlgSettingsColorGradientImp::DlgSettingsColorGradientImp( const App::ColorGradient& cg, QWidget* parent, Qt::WindowFlags fl ) : QDialog(parent, fl) , validator(nullptr) , ui(new Ui_DlgSettingsColorGradient) { ui->setupUi(this); ui->spinBoxLabel->setRange(5, 30); ui->spinBoxDecimals->setMaximum(std::numeric_limits::digits10); // remove the automatic help button in dialog title since we don't use it setWindowFlag(Qt::WindowContextHelpButtonHint, false); // the elementary charge is 1.6e-19, since such values might be the result of // simulations, use this as boundary for a scientific validator validator = new QDoubleValidator(-2e19, 2e19, ui->spinBoxDecimals->maximum(), this); validator->setNotation(QDoubleValidator::ScientificNotation); ui->floatLineEditMax->setValidator(validator); ui->floatLineEditMin->setValidator(validator); // assure that the LineEdit is as wide to contain numbers with 4 digits and 6 decimals QFontMetrics fm(ui->floatLineEditMax->font()); ui->floatLineEditMax->setMinimumWidth( QtTools::horizontalAdvance(fm, QStringLiteral("-8000.000000")) ); setColorModelNames(cg.getColorModelNames()); setProfile(cg.getProfile()); setupConnections(); } /** * Destroys the object and frees any allocated resources */ DlgSettingsColorGradientImp::~DlgSettingsColorGradientImp() = default; void DlgSettingsColorGradientImp::setupConnections() { // clang-format off auto group = new QButtonGroup(this); group->setExclusive(true); group->addButton(ui->radioButtonFlow); group->addButton(ui->radioButtonZero); connect(group, &QButtonGroup::idClicked, this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->comboBoxModel, qOverload(&QComboBox::currentIndexChanged), this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->checkBoxGrayed, &QCheckBox::toggled, this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->checkBoxInvisible, &QCheckBox::toggled, this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->floatLineEditMax, &QLineEdit::editingFinished, this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->floatLineEditMin, &QLineEdit::editingFinished, this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->spinBoxLabel, qOverload(&QSpinBox::valueChanged), this, &DlgSettingsColorGradientImp::colorModelChanged); connect(ui->spinBoxDecimals, qOverload(&QSpinBox::valueChanged), this, &DlgSettingsColorGradientImp::colorModelChanged); // clang-format on } App::ColorGradientProfile DlgSettingsColorGradientImp::getProfile() const { App::ColorGradientProfile profile; profile.tColorModel = colorModel(); profile.tStyle = colorStyle(); profile.visibility.setFlag(App::Visibility::Grayed, isOutGrayed()); profile.visibility.setFlag(App::Visibility::Invisible, isOutInvisible()); profile.ctColors = numberOfLabels(); getRange(profile.fMin, profile.fMax); return profile; } void DlgSettingsColorGradientImp::setProfile(const App::ColorGradientProfile& pro) { setColorModel(pro.tColorModel); setColorStyle(pro.tStyle); setOutGrayed(pro.visibility.testFlag(App::Visibility::Grayed)); setOutInvisible(pro.visibility.testFlag(App::Visibility::Invisible)); setNumberOfLabels(pro.ctColors); setRange(pro.fMin, pro.fMax); } void DlgSettingsColorGradientImp::setColorModel(std::size_t index) { ui->comboBoxModel->setCurrentIndex(index); } std::size_t DlgSettingsColorGradientImp::colorModel() const { return static_cast(ui->comboBoxModel->currentIndex()); } void DlgSettingsColorGradientImp::setColorModelNames(const std::vector& names) { ui->comboBoxModel->clear(); for (const auto& it : names) { ui->comboBoxModel->addItem(QString::fromStdString(it)); } } void DlgSettingsColorGradientImp::setColorStyle(App::ColorBarStyle tStyle) { switch (tStyle) { case App::ColorBarStyle::FLOW: ui->radioButtonFlow->setChecked(true); break; case App::ColorBarStyle::ZERO_BASED: ui->radioButtonZero->setChecked(true); break; } } App::ColorBarStyle DlgSettingsColorGradientImp::colorStyle() const { return ui->radioButtonZero->isChecked() ? App::ColorBarStyle::ZERO_BASED : App::ColorBarStyle::FLOW; } void DlgSettingsColorGradientImp::setOutGrayed(bool grayed) { ui->checkBoxGrayed->setChecked(grayed); } bool DlgSettingsColorGradientImp::isOutGrayed() const { return ui->checkBoxGrayed->isChecked(); } void DlgSettingsColorGradientImp::setOutInvisible(bool invisible) { ui->checkBoxInvisible->setChecked(invisible); } bool DlgSettingsColorGradientImp::isOutInvisible() const { return ui->checkBoxInvisible->isChecked(); } void DlgSettingsColorGradientImp::setRange(float fMin, float fMax) { auto toString = [this](float value, int decimals) { int pos = 0; while (decimals > 0) { QString str = QLocale().toString(value, 'g', decimals--); if (validator->validate(str, pos) == QValidator::Acceptable) { return str; } } return QLocale().toString(value, 'g', 1); }; ui->floatLineEditMax->blockSignals(true); ui->floatLineEditMax->setText(toString(fMax, numberOfDecimals())); ui->floatLineEditMax->blockSignals(false); ui->floatLineEditMin->blockSignals(true); ui->floatLineEditMin->setText(toString(fMin, numberOfDecimals())); ui->floatLineEditMin->blockSignals(false); } void DlgSettingsColorGradientImp::getRange(float& fMin, float& fMax) const { fMax = QLocale().toFloat(ui->floatLineEditMax->text()); fMin = QLocale().toFloat(ui->floatLineEditMin->text()); } void DlgSettingsColorGradientImp::setNumberOfLabels(int val) { ui->spinBoxLabel->setValue(val); } int DlgSettingsColorGradientImp::numberOfLabels() const { return ui->spinBoxLabel->value(); } void DlgSettingsColorGradientImp::setNumberOfDecimals(int val, float fMin, float fMax) { ui->spinBoxDecimals->setValue(val); setRange(fMin, fMax); } int DlgSettingsColorGradientImp::numberOfDecimals() const { return ui->spinBoxDecimals->value(); } void DlgSettingsColorGradientImp::accept() { double fMax = QLocale().toDouble(ui->floatLineEditMax->text()); double fMin = QLocale().toDouble(ui->floatLineEditMin->text()); if (fMax <= fMin) { QMessageBox::warning( this, tr("Wrong parameter"), tr("The maximum value must be higher than the minimum value.") ); } else { QDialog::accept(); } } #include "moc_DlgSettingsColorGradientImp.cpp"