/*************************************************************************** * Copyright (c) 2022 Pierre-Louis Boyer * * * * 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 "PreCompiled.h" #ifndef _PreComp_ #include #include #include #endif #include "ui_SketcherToolDefaultWidget.h" #include #include #include #include #include #include #include #include #include #include "ViewProviderSketch.h" #include "SketcherToolDefaultWidget.h" using namespace SketcherGui; using namespace Gui::TaskView; SketcherToolDefaultWidget::SketcherToolDefaultWidget(QWidget* parent) : QWidget(parent) , ui(new Ui_SketcherToolDefaultWidget) , blockParameterSlots(false) , blockParameterFocusPassing(false) { ui->setupUi(this); // connecting the needed signals setupConnections(); ui->parameterOne->installEventFilter(this); ui->parameterTwo->installEventFilter(this); ui->parameterThree->installEventFilter(this); ui->parameterFour->installEventFilter(this); ui->parameterFive->installEventFilter(this); ui->parameterSix->installEventFilter(this); reset(); } SketcherToolDefaultWidget::~SketcherToolDefaultWidget() = default; void SketcherToolDefaultWidget::setupConnections() { connect(ui->parameterOne, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterOne_valueChanged); connect(ui->parameterTwo, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterTwo_valueChanged); connect(ui->parameterThree, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterThree_valueChanged); connect(ui->parameterFour, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterFour_valueChanged); connect(ui->parameterFive, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterFive_valueChanged); connect(ui->parameterSix, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterSix_valueChanged); connect(ui->parameterSeven, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterSeven_valueChanged); connect(ui->parameterEight, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterEight_valueChanged); connect(ui->parameterNine, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterNine_valueChanged); connect(ui->parameterTen, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &SketcherToolDefaultWidget::parameterTen_valueChanged); connect(ui->checkBoxTS1, &QCheckBox::toggled, this, &SketcherToolDefaultWidget::checkBoxTS1_toggled); connect(ui->checkBoxTS2, &QCheckBox::toggled, this, &SketcherToolDefaultWidget::checkBoxTS2_toggled); connect(ui->checkBoxTS3, &QCheckBox::toggled, this, &SketcherToolDefaultWidget::checkBoxTS3_toggled); connect(ui->checkBoxTS4, &QCheckBox::toggled, this, &SketcherToolDefaultWidget::checkBoxTS4_toggled); connect(ui->comboBox1, qOverload(&QComboBox::currentIndexChanged), this, &SketcherToolDefaultWidget::comboBox1_currentIndexChanged); connect(ui->comboBox2, qOverload(&QComboBox::currentIndexChanged), this, &SketcherToolDefaultWidget::comboBox2_currentIndexChanged); connect(ui->comboBox3, qOverload(&QComboBox::currentIndexChanged), this, &SketcherToolDefaultWidget::comboBox3_currentIndexChanged); } // pre-select the number of the spinbox when it gets the focus. bool SketcherToolDefaultWidget::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::FocusIn) { for (int i = 0; i < nParameters; i++) { auto parameterSpinBox = getParameterSpinBox(i); if (object == parameterSpinBox) { parameterSpinBox->selectNumber(); break; } } } else if (event->type() == QEvent::KeyPress) { QKeyEvent* ke = static_cast(event); if (ke->key() == Qt::Key_Tab || ke->key() == Qt::Key_Return) { for (int i = 0; i < nParameters; i++) { if (object == getParameterSpinBox(i)) { signalParameterTabOrEnterPressed(i); return true; } } } } return false; } void SketcherToolDefaultWidget::reset() { Base::StateLocker lock(blockParameterSlots, true); std::fill(isSet.begin(), isSet.end(), false); for (int i = 0; i < nParameters; i++) { setParameterVisible(i, false); setParameter(i, 0.F); } for (int i = 0; i < nCheckbox; i++) { setCheckboxVisible(i, false); setCheckboxChecked(i, false); setCheckboxPrefEntry(i, ""); } for (int i = 0; i < nCombobox; i++) { setComboboxVisible(i, false); setComboboxIndex(i, 0); getComboBox(i)->clear(); } setNoticeVisible(false); } void SketcherToolDefaultWidget::setNoticeText(const QString& string) { ui->notice->setText(string); } void SketcherToolDefaultWidget::setNoticeVisible(bool visible) { ui->notice->setVisible(visible); } // Spinboxes functions void SketcherToolDefaultWidget::parameterOne_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::First] = true; /*setParameterFontStyle(Parameter::First, FontStyle::Bold); if (!blockParameterFocusPassing) { setParameterFocus(Parameter::Second); }*/ signalParameterValueChanged(Parameter::First, val); } } void SketcherToolDefaultWidget::parameterTwo_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Second] = true; signalParameterValueChanged(Parameter::Second, val); } } void SketcherToolDefaultWidget::parameterThree_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Third] = true; signalParameterValueChanged(Parameter::Third, val); } } void SketcherToolDefaultWidget::parameterFour_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Fourth] = true; signalParameterValueChanged(Parameter::Fourth, val); } } void SketcherToolDefaultWidget::parameterFive_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Fifth] = true; signalParameterValueChanged(Parameter::Fifth, val); } } void SketcherToolDefaultWidget::parameterSix_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Sixth] = true; signalParameterValueChanged(Parameter::Sixth, val); } } void SketcherToolDefaultWidget::parameterSeven_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Seventh] = true; signalParameterValueChanged(Parameter::Seventh, val); } } void SketcherToolDefaultWidget::parameterEight_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Eighth] = true; signalParameterValueChanged(Parameter::Eighth, val); } } void SketcherToolDefaultWidget::parameterNine_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Ninth] = true; signalParameterValueChanged(Parameter::Ninth, val); } } void SketcherToolDefaultWidget::parameterTen_valueChanged(double val) { if (!blockParameterSlots) { isSet[Parameter::Tenth] = true; signalParameterValueChanged(Parameter::Tenth, val); } } void SketcherToolDefaultWidget::initNParameters(int nparameters, QObject* filteringObject) { Base::StateLocker lock(blockParameterSlots, true); isSet.resize(nparameters); std::fill(isSet.begin(), isSet.end(), false); for (int i = 0; i < nParameters; i++) { setParameterVisible(i, (i < nparameters)); setParameter(i, 0.F); setParameterFilteringObject(i, filteringObject); // setParameterFontStyle(i, FontStyle::Italic); } setParameterFocus(Parameter::First); } void SketcherToolDefaultWidget::setParameterVisible(int parameterindex, bool visible) { if (parameterindex < nParameters) { getParameterLabel(parameterindex)->setVisible(visible); getParameterSpinBox(parameterindex)->setVisible(visible); } } void SketcherToolDefaultWidget::setParameterFilteringObject(int parameterindex, QObject* filteringObject) { if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->installEventFilter(filteringObject); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::setParameterLabel(int parameterindex, const QString& string) { if (parameterindex < nParameters) { getParameterLabel(parameterindex)->setText(string); } } void SketcherToolDefaultWidget::setParameter(int parameterindex, double val) { if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setValue(val); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::setParameterWithoutPassingFocus(int parameterindex, double val) { Base::StateLocker lock(blockParameterFocusPassing, true); setParameter(parameterindex, val); } void SketcherToolDefaultWidget::configureParameterInitialValue(int parameterindex, double val) { Base::StateLocker lock(blockParameterSlots, true); setParameter(parameterindex, val); } void SketcherToolDefaultWidget::configureParameterUnit(int parameterindex, const Base::Unit& unit) { // For reference unit can be changed with : // setUnit(Base::Unit::Length); Base::Unit::Angle Base::StateLocker lock(blockParameterSlots, true); if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setUnit(unit); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::configureParameterDecimals(int parameterindex, int val) { Base::StateLocker lock(blockParameterSlots, true); if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setDecimals(val); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::configureParameterMin(int parameterindex, double val) { Base::StateLocker lock(blockParameterSlots, true); if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setMinimum(val); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::configureParameterMax(int parameterindex, double val) { Base::StateLocker lock(blockParameterSlots, true); if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setMaximum(val); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::setParameterEnabled(int parameterindex, bool active) { if (parameterindex < nParameters) { getParameterSpinBox(parameterindex)->setEnabled(active); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::setParameterFocus(int parameterindex) { if (parameterindex < nParameters) { auto parameterSpinBox = getParameterSpinBox(parameterindex); parameterSpinBox->selectNumber(); QMetaObject::invokeMethod(parameterSpinBox, "setFocus", Qt::QueuedConnection); return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } void SketcherToolDefaultWidget::setParameterFontStyle(int parameterindex, FontStyle fontStyle) { if (parameterindex < nParameters) { auto parameterSpinBox = getParameterSpinBox(parameterindex); switch (fontStyle) { case FontStyle::Italic: parameterSpinBox->setStyleSheet(QStringLiteral("font-weight: normal;")); parameterSpinBox->setStyleSheet(QStringLiteral("font-style: italic;")); break; case FontStyle::Bold: parameterSpinBox->setStyleSheet(QStringLiteral("font-style: normal;")); parameterSpinBox->setStyleSheet(QStringLiteral("font-weight: bold;")); break; case FontStyle::Normal: parameterSpinBox->setStyleSheet(QStringLiteral("font-style: normal;")); parameterSpinBox->setStyleSheet(QStringLiteral("font-weight: normal;")); break; } return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } QLabel* SketcherToolDefaultWidget::getParameterLabel(int parameterindex) { switch (parameterindex) { case Parameter::First: return ui->label; break; case Parameter::Second: return ui->label2; break; case Parameter::Third: return ui->label3; break; case Parameter::Fourth: return ui->label4; break; case Parameter::Fifth: return ui->label5; break; case Parameter::Sixth: return ui->label6; break; case Parameter::Seventh: return ui->label7; break; case Parameter::Eighth: return ui->label8; break; case Parameter::Ninth: return ui->label9; break; case Parameter::Tenth: return ui->label10; break; default: THROWM(Base::IndexError, "ToolWidget spinbox index out of range"); } } Gui::PrefQuantitySpinBox* SketcherToolDefaultWidget::getParameterSpinBox(int parameterindex) { switch (parameterindex) { case Parameter::First: return ui->parameterOne; break; case Parameter::Second: return ui->parameterTwo; break; case Parameter::Third: return ui->parameterThree; break; case Parameter::Fourth: return ui->parameterFour; break; case Parameter::Fifth: return ui->parameterFive; break; case Parameter::Sixth: return ui->parameterSix; break; case Parameter::Seventh: return ui->parameterSeven; break; case Parameter::Eighth: return ui->parameterEight; break; case Parameter::Ninth: return ui->parameterNine; break; case Parameter::Tenth: return ui->parameterTen; break; default: THROWM(Base::IndexError, "ToolWidget spinbox index out of range"); } } double SketcherToolDefaultWidget::getParameter(int parameterindex) { if (parameterindex < nParameters) { return getParameterSpinBox(parameterindex)->value().getValue(); } THROWM(Base::IndexError, "ToolWidget parameter index out of range"); } bool SketcherToolDefaultWidget::isParameterSet(int parameterindex) { if (parameterindex < nParameters) { return isSet[parameterindex]; } THROWM(Base::IndexError, "ToolWidget parameter index out of range"); } void SketcherToolDefaultWidget::updateVisualValue(int parameterindex, double val, const Base::Unit& unit) { if (parameterindex < nParameters) { Base::StateLocker lock(blockParameterSlots, true); auto parameterSpinBox = getParameterSpinBox(parameterindex); parameterSpinBox->setValue(Base::Quantity(val, unit)); if (parameterSpinBox->hasFocus()) { parameterSpinBox->selectNumber(); } return; } THROWM(Base::IndexError, QT_TRANSLATE_NOOP("Exceptions", "ToolWidget parameter index out of range")); } // checkbox functions void SketcherToolDefaultWidget::checkBoxTS1_toggled(bool val) { if (!blockParameterSlots) { if (!isCheckBoxPrefEntryEmpty(Checkbox::FirstBox)) { ui->checkBoxTS1->onSave(); } signalCheckboxCheckedChanged(Checkbox::FirstBox, val); } } void SketcherToolDefaultWidget::checkBoxTS2_toggled(bool val) { if (!blockParameterSlots) { if (!isCheckBoxPrefEntryEmpty(Checkbox::SecondBox)) { ui->checkBoxTS2->onSave(); } signalCheckboxCheckedChanged(Checkbox::SecondBox, val); } } void SketcherToolDefaultWidget::checkBoxTS3_toggled(bool val) { if (!blockParameterSlots) { if (!isCheckBoxPrefEntryEmpty(Checkbox::ThirdBox)) { ui->checkBoxTS3->onSave(); } signalCheckboxCheckedChanged(Checkbox::ThirdBox, val); } } void SketcherToolDefaultWidget::checkBoxTS4_toggled(bool val) { if (!blockParameterSlots) { if (!isCheckBoxPrefEntryEmpty(Checkbox::FourthBox)) { ui->checkBoxTS4->onSave(); } signalCheckboxCheckedChanged(Checkbox::FourthBox, val); } } void SketcherToolDefaultWidget::initNCheckboxes(int ncheckbox) { Base::StateLocker lock(blockParameterSlots, true); for (int i = 0; i < nCheckbox; i++) { setCheckboxVisible(i, (i < ncheckbox)); setCheckboxChecked(i, false); } } void SketcherToolDefaultWidget::setCheckboxVisible(int checkboxindex, bool visible) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->setVisible(visible); } } void SketcherToolDefaultWidget::setCheckboxChecked(int checkboxindex, bool checked) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->setChecked(checked); } } void SketcherToolDefaultWidget::setCheckboxLabel(int checkboxindex, const QString& string) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->setText(string); } } void SketcherToolDefaultWidget::setCheckboxToolTip(int checkboxindex, const QString& string) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->setToolTip(string); } } Gui::PrefCheckBox* SketcherToolDefaultWidget::getCheckBox(int checkboxindex) { switch (checkboxindex) { case Checkbox::FirstBox: return ui->checkBoxTS1; break; case Checkbox::SecondBox: return ui->checkBoxTS2; break; case Checkbox::ThirdBox: return ui->checkBoxTS3; break; case Checkbox::FourthBox: return ui->checkBoxTS4; break; default: THROWM(Base::IndexError, "ToolWidget checkbox index out of range"); } } bool SketcherToolDefaultWidget::getCheckboxChecked(int checkboxindex) { if (checkboxindex < nParameters) { return getCheckBox(checkboxindex)->isChecked(); } THROWM(Base::IndexError, "ToolWidget checkbox index out of range"); } void SketcherToolDefaultWidget::setCheckboxPrefEntry(int checkboxindex, const std::string& prefEntry) { if (checkboxindex < nCheckbox) { QByteArray byteArray(prefEntry.c_str(), prefEntry.length()); getCheckBox(checkboxindex)->setEntryName(byteArray); } } void SketcherToolDefaultWidget::restoreCheckBoxPref(int checkboxindex) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->onRestore(); } } void SketcherToolDefaultWidget::setCheckboxIcon(int checkboxindex, QIcon icon) { if (checkboxindex < nCheckbox) { getCheckBox(checkboxindex)->setIcon(icon); } } void SketcherToolDefaultWidget::setComboboxItemIcon(int comboboxindex, int index, QIcon icon) { if (comboboxindex < nCombobox) { getComboBox(comboboxindex)->setItemIcon(index, icon); } } void SketcherToolDefaultWidget::setComboboxPrefEntry(int comboboxindex, const std::string& prefEntry) { if (comboboxindex < nCombobox) { QByteArray byteArray(prefEntry.c_str(), prefEntry.length()); getComboBox(comboboxindex)->setEntryName(byteArray); } } void SketcherToolDefaultWidget::restoreComboboxPref(int comboboxindex) { if (comboboxindex < nCombobox) { getComboBox(comboboxindex)->onRestore(); } } bool SketcherToolDefaultWidget::isCheckBoxPrefEntryEmpty(int checkboxindex) { return getCheckBox(checkboxindex)->entryName().size() == 0; } // Combobox functions void SketcherToolDefaultWidget::comboBox1_currentIndexChanged(int val) { if (!blockParameterSlots) { signalComboboxSelectionChanged(Combobox::FirstCombo, val); } ui->comboBox1->onSave(); } void SketcherToolDefaultWidget::comboBox2_currentIndexChanged(int val) { if (!blockParameterSlots) { signalComboboxSelectionChanged(Combobox::SecondCombo, val); } ui->comboBox2->onSave(); } void SketcherToolDefaultWidget::comboBox3_currentIndexChanged(int val) { if (!blockParameterSlots) { signalComboboxSelectionChanged(Combobox::ThirdCombo, val); } ui->comboBox3->onSave(); } void SketcherToolDefaultWidget::initNComboboxes(int ncombobox) { Base::StateLocker lock(blockParameterSlots, true); for (int i = 0; i < nCombobox; i++) { setComboboxVisible(i, (i < ncombobox)); } } void SketcherToolDefaultWidget::setComboboxVisible(int comboboxindex, bool visible) { if (comboboxindex < nCombobox) { getComboBox(comboboxindex)->setVisible(visible); getComboBoxLabel(comboboxindex)->setVisible(visible); } } void SketcherToolDefaultWidget::setComboboxIndex(int comboboxindex, int value) { if (comboboxindex < nCombobox) { getComboBox(comboboxindex)->setCurrentIndex(value); } } void SketcherToolDefaultWidget::setComboboxLabel(int comboboxindex, const QString& string) { if (comboboxindex < nCombobox) { getComboBoxLabel(comboboxindex)->setText(string); } } void SketcherToolDefaultWidget::setComboboxElements(int comboboxindex, const QStringList& names) { if (comboboxindex < nCombobox) { getComboBox(comboboxindex)->clear(); getComboBox(comboboxindex)->addItems(names); } } Gui::PrefComboBox* SketcherToolDefaultWidget::getComboBox(int comboboxindex) { switch (comboboxindex) { case Combobox::FirstCombo: return ui->comboBox1; break; case Combobox::SecondCombo: return ui->comboBox2; break; case Combobox::ThirdCombo: return ui->comboBox3; break; default: THROWM(Base::IndexError, "ToolWidget combobox index out of range"); } } QLabel* SketcherToolDefaultWidget::getComboBoxLabel(int comboboxindex) { switch (comboboxindex) { case Combobox::FirstCombo: return ui->comboLabel1; break; case Combobox::SecondCombo: return ui->comboLabel2; break; case Combobox::ThirdCombo: return ui->comboLabel3; break; default: THROWM(Base::IndexError, "ToolWidget combobox index out of range"); } } int SketcherToolDefaultWidget::getComboboxIndex(int comboboxindex) { if (comboboxindex < nCombobox) { return getComboBox(comboboxindex)->currentIndex(); } THROWM(Base::IndexError, "ToolWidget combobox index out of range"); } void SketcherToolDefaultWidget::changeEvent(QEvent* ev) { QWidget::changeEvent(ev); if (ev->type() == QEvent::LanguageChange) { ui->retranslateUi(this); } } #include "moc_SketcherToolDefaultWidget.cpp"