/**************************************************************************** ** * Options widget for pen transform action Copyright (C) 2024 LibreCAD.org Copyright (C) 2024 sand1024 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **********************************************************************/ #include "lc_pastetransformoptions.h" #include "ui_lc_pastetransformoptions.h" #include "lc_actioneditpastetransform.h" LC_PasteTransformOptions::LC_PasteTransformOptions() : LC_ActionOptionsWidgetBase(RS2::ActionEditPasteTransform, "Edit", "PasteTransform") , ui(new Ui::LC_PasteTransformOptions){ ui->setupUi(this); connect(ui->leAngle, &QLineEdit::editingFinished, this, &LC_PasteTransformOptions::onAngleEditingFinished); connect(ui->leFactor, &QLineEdit::editingFinished, this, &LC_PasteTransformOptions::onFactorEditingFinished); connect(ui->leArraySpacingX, &QLineEdit::editingFinished, this, &LC_PasteTransformOptions::onArraySpacingXEditingFinished); connect(ui->leArraySpacingY, &QLineEdit::editingFinished, this, &LC_PasteTransformOptions::onArraySpacingYEditingFinished); connect(ui->leArrayAngle, &QLineEdit::editingFinished, this, &LC_PasteTransformOptions::onArrayAngleEditingFinished); connect(ui->cbArray, &QCheckBox::clicked, this, &LC_PasteTransformOptions::onArrayClicked); connect(ui->sbArrayX, &QSpinBox::valueChanged, this, &LC_PasteTransformOptions::onArrayXCountChanged); connect(ui->sbArrayY, &QSpinBox::valueChanged, this, &LC_PasteTransformOptions::onArrayYCountChanged); connect(ui->cbSameAngles, &QCheckBox::clicked, this, &LC_PasteTransformOptions::cbSameAnglesClicked); pickDistanceSetup("spacingX", ui->tbPickArraySpacingX, ui->leArraySpacingX); pickDistanceSetup("spacingY", ui->tbPickArraySpacingY, ui->leArraySpacingY); pickAngleSetup("angle", ui->tbPickAngle, ui->leAngle); pickAngleSetup("arrayAngle", ui->tbPickArrayAngle, ui->leArrayAngle); } LC_PasteTransformOptions::~LC_PasteTransformOptions(){delete ui;} void LC_PasteTransformOptions::doSaveSettings() { save("Angle", ui->leAngle->text()); save("ScaleFactor", ui->leFactor->text()); save("IsArray", ui->cbArray->isChecked()); save("ArrayXCount", ui->sbArrayX->value()); save("ArrayYCount", ui->sbArrayY->value()); save("ArrayXSpacing", ui->leArraySpacingX->text()); save("ArrayYSpacing", ui->leArraySpacingY->text()); save("ArrayAngle", ui->leArrayAngle->text()); save("SameAngles", ui->cbSameAngles->isChecked()); } void LC_PasteTransformOptions::doSetAction(RS_ActionInterface *a, bool update) { m_action = dynamic_cast(a); QString angle; QString factor; bool isArray; int arrayXCount; int arrayYCount; QString arrayXSpacing; QString arrayYSpacing; bool sameAngles; QString arrayAngle; if (update){ angle = fromDouble(RS_Math::rad2deg(m_action->getAngle())); factor = fromDouble(m_action->getFactor()); isArray = m_action->isArrayCreated(); arrayXCount = m_action -> getArrayXCount(); arrayYCount = m_action -> getArrayYCount(); arrayXSpacing = fromDouble(m_action->getArraySpacingX()); arrayYSpacing = fromDouble(m_action->getArraySpacingY()); sameAngles = m_action->isSameAngles(); arrayAngle = fromDouble(RS_Math::rad2deg(m_action->getArrayAngle())); } else{ angle = load("Angle", "0.0"); factor = load("ScaleFactor", "1.0"); isArray = loadBool("IsArray", false); arrayXCount = loadInt("ArrayXCount", 1); arrayYCount = loadInt("ArrayYCount", 1); arrayXSpacing = load("ArrayXSpacing", "10.0"); arrayYSpacing = load("ArrayYSpacing", "10.0"); arrayAngle = load("ArrayAngle", "0.0"); sameAngles = loadBool("SameAngles", false); } setAngleToActionAndView(angle); setFactorToActionAndView(factor); setIsArrayToActionAndView(isArray); setArrayXCountToActionAndView(arrayXCount); setArrayYCountToActionAndView(arrayYCount); setArrayXSpacingToActionAndView(arrayXSpacing); setArrayYSpacingToActionAndView(arrayYSpacing); setArrayAngleToActionAndView(arrayAngle); setSameAnglesToActionAndView(sameAngles); } void LC_PasteTransformOptions::setAngleToActionAndView(QString val) { double angle; if (toDoubleAngleDegrees(val, angle, 0.0, false)){ m_action->setAngle(RS_Math::deg2rad(angle)); ui->leAngle->setText(fromDouble(angle)); } } void LC_PasteTransformOptions::setFactorToActionAndView(QString val) { double y; if (toDouble(val, y, 1.0, true)){ m_action->setFactor(y); ui->leFactor->setText(fromDouble(y)); } } void LC_PasteTransformOptions::setIsArrayToActionAndView(bool val) { m_action->setArrayCreated(val); ui->cbArray->setChecked(val); ui->sbArrayX->setEnabled(val); ui->sbArrayY->setEnabled(val); ui->leArraySpacingX->setEnabled(val); ui->leArraySpacingY->setEnabled(val); ui->leArrayAngle->setEnabled(val); ui->cbSameAngles->setEnabled(val); ui->tbPickArraySpacingX->setEnabled(val); ui->tbPickArraySpacingY->setEnabled(val); ui->tbPickArrayAngle->setEnabled(val); if (val){ bool differentAngles = !ui->cbSameAngles->isChecked(); ui->leAngle->setEnabled(differentAngles); ui->tbPickAngle->setEnabled(differentAngles); } else{ ui->leAngle->setEnabled(true); ui->tbPickAngle->setEnabled(true); } } void LC_PasteTransformOptions::setSameAnglesToActionAndView(bool val) { ui->cbSameAngles ->setChecked(val); if (val) { ui->leAngle->setText(ui->leArrayAngle->text()); bool enable = !ui->cbArray->isChecked(); ui->leAngle->setEnabled(enable); } else{ ui->leAngle->setEnabled(true); } m_action->setSameAngles(val); } void LC_PasteTransformOptions::setArrayXCountToActionAndView(int count) { m_action->setArrayXCount(count); ui->sbArrayX->setValue(count); } void LC_PasteTransformOptions::setArrayYCountToActionAndView(int count) { m_action->setArrayYCount(count); ui->sbArrayY->setValue(count); } void LC_PasteTransformOptions::setArrayXSpacingToActionAndView(QString val) { double y; if (toDouble(val, y, 1.0, true)){ m_action->setArraySpacingX(y); ui->leArraySpacingX->setText(fromDouble(y)); } } void LC_PasteTransformOptions::setArrayYSpacingToActionAndView(QString val) { double y; if (toDouble(val, y, 1.0, true)){ m_action->setArraySpacingY(y); ui->leArraySpacingY->setText(fromDouble(y)); } } void LC_PasteTransformOptions::setArrayAngleToActionAndView(QString val) { double angle; if (toDoubleAngleDegrees(val, angle, 0.0, false)){ m_action->setArrayAngle(RS_Math::deg2rad(angle)); const QString &angleStr = fromDouble(angle); ui->leArrayAngle->setText(angleStr); if (ui->cbSameAngles->isChecked()){ ui->leAngle->setText(angleStr); } } } void LC_PasteTransformOptions::onArrayXCountChanged(int value){ setArrayXCountToActionAndView(value); } void LC_PasteTransformOptions::onArrayYCountChanged(int value){ setArrayYCountToActionAndView(value); } void LC_PasteTransformOptions::onAngleEditingFinished(){ setAngleToActionAndView(ui->leAngle->text()); } void LC_PasteTransformOptions::onFactorEditingFinished(){ setFactorToActionAndView(ui->leFactor->text()); } void LC_PasteTransformOptions::onArraySpacingXEditingFinished(){ setArrayXSpacingToActionAndView(ui->leArraySpacingX->text()); } void LC_PasteTransformOptions::onArraySpacingYEditingFinished(){ setArrayYSpacingToActionAndView(ui->leArraySpacingY->text()); } void LC_PasteTransformOptions::onArrayAngleEditingFinished(){ setArrayAngleToActionAndView(ui->leArrayAngle->text()); } void LC_PasteTransformOptions::onArrayClicked(bool clicked){ setIsArrayToActionAndView(clicked); } void LC_PasteTransformOptions::cbSameAnglesClicked(bool value) { setSameAnglesToActionAndView(value); } void LC_PasteTransformOptions::languageChange() { ui->retranslateUi(this); }