/************************************************************************ ** ** @file dialogplacelabel.cpp ** @author Roman Telezhynskyi ** @date 14 10, 2017 ** ** @brief ** @copyright ** This source code is part of the Valentina project, a pattern making ** program, whose allow create and modeling patterns of clothing. ** Copyright (C) 2017 Valentina project ** All Rights Reserved. ** ** Valentina 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 3 of the License, or ** (at your option) any later version. ** ** Valentina 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 Valentina. If not, see . ** *************************************************************************/ #include "dialogplacelabel.h" #include "ui_dialogplacelabel.h" #include "visualization/line/vistoolspecialpoint.h" #include "../../../tools/vabstracttool.h" #include "../../../tools/vtoolseamallowance.h" #include "../../support/dialogeditwrongformula.h" #include "../vgeometry/vplacelabelitem.h" #include //--------------------------------------------------------------------------------------------------------------------- DialogPlaceLabel::DialogPlaceLabel(const VContainer *data, quint32 toolId, QWidget *parent) : DialogTool(data, toolId, parent), ui(new Ui::DialogPlaceLabel), m_showMode(false), m_flagPoint(false), m_flagWidth(false), m_flagHeight(false), m_flagAngle(false), m_formulaBaseHeightWidth(0), m_formulaBaseHeightHeight(0), m_formulaBaseHeightAngle(0), timerAngle(new QTimer(this)), timerWidth(new QTimer(this)), timerHeight(new QTimer(this)) { ui->setupUi(this); InitOkCancel(ui); FillComboBoxPoints(ui->comboBoxPoint); FillPlaceLabelTypes(); m_formulaBaseHeightWidth = ui->plainTextEditFormulaWidth->height(); m_formulaBaseHeightHeight = ui->plainTextEditFormulaHeight->height(); m_formulaBaseHeightAngle = ui->plainTextEditFormulaAngle->height(); ui->plainTextEditFormulaWidth->installEventFilter(this); ui->plainTextEditFormulaHeight->installEventFilter(this); ui->plainTextEditFormulaAngle->installEventFilter(this); ui->plainTextEditFormulaWidth->setPlainText(QString::number(UnitConvertor(1, Unit::Cm, qApp->patternUnit()))); ui->plainTextEditFormulaHeight->setPlainText(QString::number(UnitConvertor(1, Unit::Cm, qApp->patternUnit()))); flagError = false; CheckState(); connect(ui->toolButtonExprWidth, &QPushButton::clicked, this, &DialogPlaceLabel::FXWidth); connect(ui->toolButtonExprHeight, &QPushButton::clicked, this, &DialogPlaceLabel::FXHeight); connect(ui->toolButtonExprAngle, &QPushButton::clicked, this, &DialogPlaceLabel::FXAngle); connect(ui->plainTextEditFormulaWidth, &QPlainTextEdit::textChanged, this, &DialogPlaceLabel::FormulaWidthChanged); connect(ui->plainTextEditFormulaHeight, &QPlainTextEdit::textChanged, this, &DialogPlaceLabel::FormulaHeightChanged); connect(ui->plainTextEditFormulaAngle, &QPlainTextEdit::textChanged, this, &DialogPlaceLabel::FormulaAngleChanged); connect(ui->pushButtonGrowWidth, &QPushButton::clicked, this, &DialogPlaceLabel::DeployFormulaWidthEdit); connect(ui->pushButtonGrowHeight, &QPushButton::clicked, this, &DialogPlaceLabel::DeployFormulaHeightEdit); connect(ui->pushButtonGrowAngle, &QPushButton::clicked, this, &DialogPlaceLabel::DeployFormulaAngleEdit); connect(timerWidth, &QTimer::timeout, this, &DialogPlaceLabel::EvalWidth); connect(timerHeight, &QTimer::timeout, this, &DialogPlaceLabel::EvalHeight); connect(timerAngle, &QTimer::timeout, this, &DialogPlaceLabel::EvalAngle); connect(ui->comboBoxPiece, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { CheckPieces(); }); vis = new VisToolSpecialPoint(data); } //--------------------------------------------------------------------------------------------------------------------- DialogPlaceLabel::~DialogPlaceLabel() { delete ui; } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::EnbleShowMode(bool disable) { m_showMode = disable; ui->comboBoxPiece->setDisabled(m_showMode); ui->comboBoxPoint->setDisabled(m_showMode); } //--------------------------------------------------------------------------------------------------------------------- quint32 DialogPlaceLabel::GetCenterPoint() const { return getCurrentObjectId(ui->comboBoxPoint); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetCenterPoint(quint32 id) { setCurrentPointId(ui->comboBoxPoint, id); if (not m_showMode) { VisToolSpecialPoint *point = qobject_cast(vis); SCASSERT(point != nullptr) point->setObject1Id(id); } CheckPoint(); } //--------------------------------------------------------------------------------------------------------------------- PlaceLabelType DialogPlaceLabel::GetLabelType() const { return static_cast(ui->comboBoxLabelType->currentData().toInt()); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetLabelType(PlaceLabelType type) { const qint32 index = ui->comboBoxLabelType->findData(static_cast(type)); if (index != -1) { ui->comboBoxLabelType->setCurrentIndex(index); } } //--------------------------------------------------------------------------------------------------------------------- QString DialogPlaceLabel::GetWidth() const { return qApp->TrVars()->TryFormulaFromUser(ui->plainTextEditFormulaWidth->toPlainText().replace("\n", " "), qApp->Settings()->GetOsSeparator()); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetWidth(const QString &value) { const QString formula = qApp->TrVars()->FormulaToUser(value, qApp->Settings()->GetOsSeparator()); // increase height if needed. TODO : see if I can get the max number of caracters in one line // of this PlainTextEdit to change 80 to this value if (formula.length() > 80) { this->DeployFormulaWidthEdit(); } ui->plainTextEditFormulaWidth->setPlainText(formula); // VisToolPlaceLabel *point = qobject_cast(vis); // SCASSERT(point != nullptr) // point->setObject1Id(id); MoveCursorToEnd(ui->plainTextEditFormulaWidth); } //--------------------------------------------------------------------------------------------------------------------- QString DialogPlaceLabel::GetHeight() const { return qApp->TrVars()->TryFormulaFromUser(ui->plainTextEditFormulaHeight->toPlainText().replace("\n", " "), qApp->Settings()->GetOsSeparator()); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetHeight(const QString &value) { const QString formula = qApp->TrVars()->FormulaToUser(value, qApp->Settings()->GetOsSeparator()); // increase height if needed. TODO : see if I can get the max number of caracters in one line // of this PlainTextEdit to change 80 to this value if (formula.length() > 80) { this->DeployFormulaHeightEdit(); } ui->plainTextEditFormulaHeight->setPlainText(formula); // VisToolPlaceLabel *point = qobject_cast(vis); // SCASSERT(point != nullptr) // point->setObject1Id(id); MoveCursorToEnd(ui->plainTextEditFormulaHeight); } //--------------------------------------------------------------------------------------------------------------------- QString DialogPlaceLabel::GetAngle() const { return qApp->TrVars()->TryFormulaFromUser(ui->plainTextEditFormulaAngle->toPlainText().replace("\n", " "), qApp->Settings()->GetOsSeparator()); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetAngle(const QString &value) { const QString formula = qApp->TrVars()->FormulaToUser(value, qApp->Settings()->GetOsSeparator()); // increase height if needed. TODO : see if I can get the max number of caracters in one line // of this PlainTextEdit to change 80 to this value if (formula.length() > 80) { this->DeployFormulaAngleEdit(); } ui->plainTextEditFormulaAngle->setPlainText(formula); // VisToolPlaceLabel *point = qobject_cast(vis); // SCASSERT(point != nullptr) // point->setObject1Id(id); MoveCursorToEnd(ui->plainTextEditFormulaAngle); } //--------------------------------------------------------------------------------------------------------------------- quint32 DialogPlaceLabel::GetPieceId() const { return getCurrentObjectId(ui->comboBoxPiece); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetPieceId(quint32 id) { if (ui->comboBoxPiece->count() <= 0) { ui->comboBoxPiece->addItem(data->GetPiece(id).GetName(), id); } else { const qint32 index = ui->comboBoxPiece->findData(id); if (index != -1) { ui->comboBoxPiece->setCurrentIndex(index); } else { ui->comboBoxPiece->setCurrentIndex(0); } } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::SetPiecesList(const QVector &list) { FillComboBoxPiecesList(ui->comboBoxPiece, list); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::ChosenObject(quint32 id, const SceneObject &type) { if (not prepare) { if (type == SceneObject::Point) { if (SetObject(id, ui->comboBoxPoint, "")) { vis->VisualMode(id); CheckPoint(); prepare = true; FormulaWidthChanged(); FormulaHeightChanged(); FormulaAngleChanged(); this->setModal(true); this->show(); } } } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::CheckState() { SCASSERT(bOk != nullptr); bOk->setEnabled(m_flagPoint && flagError && m_flagWidth && m_flagHeight && m_flagAngle); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::ShowVisualization() { if (not m_showMode) { AddVisualization(); } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::closeEvent(QCloseEvent *event) { ui->plainTextEditFormulaWidth->blockSignals(true); ui->plainTextEditFormulaHeight->blockSignals(true); ui->plainTextEditFormulaAngle->blockSignals(true); DialogTool::closeEvent(event); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::DeployFormulaWidthEdit() { DeployFormula(ui->plainTextEditFormulaWidth, ui->pushButtonGrowWidth, m_formulaBaseHeightWidth); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::DeployFormulaHeightEdit() { DeployFormula(ui->plainTextEditFormulaHeight, ui->pushButtonGrowHeight, m_formulaBaseHeightHeight); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::DeployFormulaAngleEdit() { DeployFormula(ui->plainTextEditFormulaAngle, ui->pushButtonGrowAngle, m_formulaBaseHeightAngle); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FormulaWidthChanged() { labelEditFormula = ui->labelEditFormulaWidth; labelResultCalculation = ui->labelResultCalculationWidth; const QString postfix = UnitsToStr(qApp->patternUnit(), true); ValFormulaChanged(m_flagWidth, ui->plainTextEditFormulaWidth, timerWidth, postfix); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FormulaHeightChanged() { labelEditFormula = ui->labelEditFormulaHeight; labelResultCalculation = ui->labelResultCalculationHeight; const QString postfix = UnitsToStr(qApp->patternUnit(), true); ValFormulaChanged(m_flagHeight, ui->plainTextEditFormulaHeight, timerHeight, postfix); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FormulaAngleChanged() { labelEditFormula = ui->labelEditFormulaAngle; labelResultCalculation = ui->labelResultCalculationAngle; ValFormulaChanged(m_flagAngle, ui->plainTextEditFormulaAngle, timerAngle, degreeSymbol); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::EvalWidth() { labelEditFormula = ui->labelEditFormulaWidth; const QString postfix = UnitsToStr(qApp->patternUnit(), true); Eval(ui->plainTextEditFormulaWidth->toPlainText(), m_flagWidth, ui->labelResultCalculationWidth, postfix, true, true); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::EvalHeight() { labelEditFormula = ui->labelEditFormulaHeight; const QString postfix = UnitsToStr(qApp->patternUnit(), true); Eval(ui->plainTextEditFormulaHeight->toPlainText(), m_flagHeight, ui->labelResultCalculationHeight, postfix, true, true); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::EvalAngle() { labelEditFormula = ui->labelEditFormulaAngle; Eval(ui->plainTextEditFormulaAngle->toPlainText(), m_flagAngle, ui->labelResultCalculationAngle, degreeSymbol, false); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FXWidth() { QScopedPointer dialog(new DialogEditWrongFormula(data, toolId, this)); dialog->setWindowTitle(tr("Edit rectangle width")); dialog->SetFormula(GetWidth()); dialog->setPostfix(UnitsToStr(qApp->patternUnit(), true)); if (dialog->exec() == QDialog::Accepted) { SetWidth(dialog->GetFormula()); } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FXHeight() { QScopedPointer dialog(new DialogEditWrongFormula(data, toolId, this)); dialog->setWindowTitle(tr("Edit rectangle width")); dialog->SetFormula(GetHeight()); dialog->setPostfix(UnitsToStr(qApp->patternUnit(), true)); if (dialog->exec() == QDialog::Accepted) { SetHeight(dialog->GetFormula()); } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FXAngle() { QScopedPointer dialog(new DialogEditWrongFormula(data, toolId, this)); dialog->setWindowTitle(tr("Edit angle")); dialog->SetFormula(GetAngle()); dialog->setPostfix(degreeSymbol); if (dialog->exec() == QDialog::Accepted) { SetAngle(dialog->GetFormula()); } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::FillPlaceLabelTypes() { ui->comboBoxLabelType->addItem(tr("Segment"), static_cast(PlaceLabelType::Segment)); ui->comboBoxLabelType->addItem(tr("Rectangle"), static_cast(PlaceLabelType::Rectangle)); ui->comboBoxLabelType->addItem(tr("Cross"), static_cast(PlaceLabelType::Cross)); ui->comboBoxLabelType->addItem(tr("T-shaped"), static_cast(PlaceLabelType::Tshaped)); ui->comboBoxLabelType->addItem(tr("Doubletree"), static_cast(PlaceLabelType::Doubletree)); ui->comboBoxLabelType->addItem(tr("Corner"), static_cast(PlaceLabelType::Corner)); ui->comboBoxLabelType->addItem(tr("Triangle"), static_cast(PlaceLabelType::Triangle)); ui->comboBoxLabelType->addItem(tr("H-shaped"), static_cast(PlaceLabelType::Hshaped)); ui->comboBoxLabelType->addItem(tr("Button"), static_cast(PlaceLabelType::Button)); } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::CheckPieces() { if (not m_showMode) { QColor color = okColor; if (ui->comboBoxPiece->count() <= 0 || ui->comboBoxPiece->currentIndex() == -1) { flagError = false; color = errorColor; } else { flagError = true; color = okColor; } ChangeColor(ui->labelPiece, color); CheckState(); } } //--------------------------------------------------------------------------------------------------------------------- void DialogPlaceLabel::CheckPoint() { QColor color = okColor; if (ui->comboBoxPoint->currentIndex() != -1) { m_flagPoint = true; color = okColor; } else { m_flagPoint = false; color = errorColor; } ChangeColor(ui->labelPoint, color); CheckState(); }