From 8f961300e65ad6c2c01b480b50d6765e6b07d473 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Wed, 10 Jul 2019 12:42:37 +0300 Subject: [PATCH] Basic structure for new class VPatternRecipe. --HG-- branch : feature --- src/app/tape/mapplication.cpp | 1 + src/app/tape/tmainwindow.cpp | 1 + src/app/valentina/core/vcmdexport.cpp | 1 + src/libs/ifc/xml/vdomdocument.cpp | 8 + src/libs/ifc/xml/vdomdocument.h | 2 + src/libs/vformat/vformat.pri | 6 +- src/libs/vformat/vmeasurements.h | 3 +- src/libs/vformat/vpatternrecipe.cpp | 226 +++++++++++++++++++ src/libs/vformat/vpatternrecipe.h | 63 ++++++ src/test/ValentinaTest/tst_vmeasurements.cpp | 1 + 10 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 src/libs/vformat/vpatternrecipe.cpp create mode 100644 src/libs/vformat/vpatternrecipe.h diff --git a/src/app/tape/mapplication.cpp b/src/app/tape/mapplication.cpp index 9f11396e3..5ae40b36b 100644 --- a/src/app/tape/mapplication.cpp +++ b/src/app/tape/mapplication.cpp @@ -38,6 +38,7 @@ #include "../vmisc/diagnostic.h" #include "../vmisc/qt_dispatch/qt_dispatch.h" #include "../qmuparser/qmuparsererror.h" +#include "../vpatterndb/variables/vmeasurement.h" #include #include diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp index 446c1c416..f6094760b 100644 --- a/src/app/tape/tmainwindow.cpp +++ b/src/app/tape/tmainwindow.cpp @@ -32,6 +32,7 @@ #include "dialogs/dialognewmeasurements.h" #include "dialogs/dialogmdatabase.h" #include "dialogs/dialogtapepreferences.h" +#include "../vpatterndb/vcontainer.h" #include "../vpatterndb/calculator.h" #include "../vpatterndb/pmsystems.h" #include "../vpatterndb/measurements.h" diff --git a/src/app/valentina/core/vcmdexport.cpp b/src/app/valentina/core/vcmdexport.cpp index a5cb85371..176956c0c 100644 --- a/src/app/valentina/core/vcmdexport.cpp +++ b/src/app/valentina/core/vcmdexport.cpp @@ -35,6 +35,7 @@ #include "../vmisc/vsettings.h" #include "../vmisc/dialogs/dialogexporttocsv.h" #include "../vlayout/vlayoutgenerator.h" +#include "../vpatterndb/variables/vmeasurement.h" #include #include diff --git a/src/libs/ifc/xml/vdomdocument.cpp b/src/libs/ifc/xml/vdomdocument.cpp index 43a043e25..231a4e70f 100644 --- a/src/libs/ifc/xml/vdomdocument.cpp +++ b/src/libs/ifc/xml/vdomdocument.cpp @@ -742,6 +742,14 @@ QString VDomDocument::UnitsHelpString() return r; } +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VDomDocument::CreateElementWithText(const QString &tagName, const QString &text) +{ + QDomElement tag = createElement(tagName); + tag.appendChild(createTextNode(text)); + return tag; +} + //--------------------------------------------------------------------------------------------------------------------- bool VDomDocument::SaveDocument(const QString &fileName, QString &error) { diff --git a/src/libs/ifc/xml/vdomdocument.h b/src/libs/ifc/xml/vdomdocument.h index 5049c19b7..751d1493b 100644 --- a/src/libs/ifc/xml/vdomdocument.h +++ b/src/libs/ifc/xml/vdomdocument.h @@ -123,6 +123,8 @@ public: virtual void setXMLContent(const QString &fileName); static QString UnitsHelpString(); + QDomElement CreateElementWithText(const QString& tagName, const QString& text); + virtual bool SaveDocument(const QString &fileName, QString &error); QString Major() const; QString Minor() const; diff --git a/src/libs/vformat/vformat.pri b/src/libs/vformat/vformat.pri index 2d8f8f3ad..f3b883b34 100644 --- a/src/libs/vformat/vformat.pri +++ b/src/libs/vformat/vformat.pri @@ -3,11 +3,13 @@ SOURCES += \ $$PWD/vmeasurements.cpp \ - $$PWD/vlabeltemplate.cpp + $$PWD/vlabeltemplate.cpp \ + $$PWD/vpatternrecipe.cpp *msvc*:SOURCES += $$PWD/stable.cpp HEADERS += \ $$PWD/vmeasurements.h \ $$PWD/stable.h \ - $$PWD/vlabeltemplate.h + $$PWD/vlabeltemplate.h \ + $$PWD/vpatternrecipe.h diff --git a/src/libs/vformat/vmeasurements.h b/src/libs/vformat/vmeasurements.h index dadaec42c..214e00519 100644 --- a/src/libs/vformat/vmeasurements.h +++ b/src/libs/vformat/vmeasurements.h @@ -38,7 +38,8 @@ #include "../ifc/xml/vdomdocument.h" #include "../vmisc/def.h" -#include "../vpatterndb/vcontainer.h" + +class VContainer; enum class GenderType : char { Male, Female, Unknown }; diff --git a/src/libs/vformat/vpatternrecipe.cpp b/src/libs/vformat/vpatternrecipe.cpp new file mode 100644 index 000000000..6de77da81 --- /dev/null +++ b/src/libs/vformat/vpatternrecipe.cpp @@ -0,0 +1,226 @@ +/************************************************************************ + ** + ** @file vpatternrecipe.cpp + ** @author Roman Telezhynskyi + ** @date 8 7, 2019 + ** + ** @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) 2019 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 "vpatternrecipe.h" +#include "../vmisc/projectversion.h" +#include "../vmisc/vabstractapplication.h" +#include "../ifc/xml/vabstractpattern.h" +#include "../vpatterndb/vcontainer.h" + +namespace +{ +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagRecipe, (QLatin1String("recipe"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagPrerequisite, (QLatin1String("prerequisite"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagValentina, (QLatin1String("valentina"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagDescription, (QLatin1String("description"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagNotes, (QLatin1String("notes"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagMeasurements, (QLatin1String("measurements"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagMeasurement, (QLatin1String("measurement"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagIncrements, (QLatin1String("increments"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagIncrement, (QLatin1String("increment"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagPreviewCalculations, (QLatin1String("previewCalculations"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagContent, (QLatin1String("content"))) + +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrRecipeVersion, (QLatin1String("version"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrDescription, (QLatin1String("description"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrFullName, (QLatin1String("fullName"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrFormula, (QLatin1String("formula"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrValue, (QLatin1String("value"))) +Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrIncrementSeparator, (QLatin1String("separator"))) + +Q_GLOBAL_STATIC_WITH_ARGS(const QString, RecipeFormatVersion, (QLatin1String("0.1"))) + +//--------------------------------------------------------------------------------------------------------------------- +inline QString FileComment() +{ + return QStringLiteral("Recipe created with Valentina v%1 (https://valentinaproject.bitbucket.io/).") + .arg(APP_VERSION_STR); +} +} + +//--------------------------------------------------------------------------------------------------------------------- +VPatternRecipe::VPatternRecipe(VContainer *data, VAbstractPattern *pattern, QObject *parent) + : VDomDocument(parent) +{ + SCASSERT(data != nullptr) + SCASSERT(pattern != nullptr) + + QDomElement recipeElement = createElement(*TagRecipe); + recipeElement.appendChild(createComment(FileComment())); + SetAttribute(recipeElement, *AttrRecipeVersion, *RecipeFormatVersion); + + appendChild(Prerequisite(data, pattern)); + appendChild(Content(data, pattern)); + + appendChild(recipeElement); + insertBefore(createProcessingInstruction(QStringLiteral("xml"), + QStringLiteral("version=\"1.0\" encoding=\"UTF-8\"")), firstChild()); +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Prerequisite(VContainer *data, VAbstractPattern *pattern) +{ + /* + + + + + + + + + + + + */ + QDomElement prerequisiteElement = createElement(*TagPrerequisite); + + prerequisiteElement.appendChild(CreateElementWithText(*TagValentina, APP_VERSION_STR)); + prerequisiteElement.appendChild(CreateElementWithText(TagUnit, UnitsToStr(qApp->patternUnit()))); + prerequisiteElement.appendChild(CreateElementWithText(*TagDescription, pattern->GetDescription())); + prerequisiteElement.appendChild(CreateElementWithText(*TagNotes, pattern->GetNotes())); + prerequisiteElement.appendChild(Measurements(data)); + prerequisiteElement.appendChild(Increments(data)); + prerequisiteElement.appendChild(PreviewCalculations(data)); + + return prerequisiteElement; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Measurements(VContainer *data) +{ + QDomElement measurements = createElement(*TagMeasurements); + + QList> patternMeasurements = data->DataMeasurements().values(); + + // Resore order + std::sort(patternMeasurements.begin(), patternMeasurements.end(), + [](const QSharedPointer &a, const QSharedPointer &b) + {return a->Index() > b->Index();}); + + for(auto &m : patternMeasurements) + { + measurements.appendChild(Measurement(m)); + } + + return measurements; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Measurement(const QSharedPointer &m) +{ + /* + * + * + * + */ + QDomElement measurement = createElement(*TagMeasurement); + + SetAttribute(measurement, *AttrDescription, m->GetDescription()); + SetAttribute(measurement, *AttrFullName, m->GetGuiText()); + SetAttribute(measurement, AttrName, m->GetName()); + SetAttribute(measurement, *AttrFormula, m->GetFormula()); // TODO: localize + SetAttribute(measurement, *AttrValue, *m->GetValue()); + + return measurement; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Increments(VContainer *data) +{ + QDomElement increments = createElement(*TagIncrements); + + QList> patternIncrements = data->DataIncrements().values(); + + // Resore order + std::sort(patternIncrements.begin(), patternIncrements.end(), + [](const QSharedPointer &a, const QSharedPointer &b) + {return a->GetIndex() > b->GetIndex();}); + + for(auto &incr : patternIncrements) + { + if (not incr->IsPreviewCalculation()) + { + increments.appendChild(Increment(incr)); + } + } + + return increments; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Increment(const QSharedPointer &incr) +{ + QDomElement measurement = createElement(*TagIncrement); + + SetAttribute(measurement, *AttrDescription, incr->GetDescription()); + SetAttribute(measurement, AttrName, incr->GetName()); + + if (incr->GetType() != VarType::IncrementSeparator) + { + SetAttribute(measurement, *AttrFormula, incr->GetFormula()); // TODO: localize + SetAttribute(measurement, *AttrValue, *incr->GetValue()); + } + else + { + SetAttribute(measurement, *AttrIncrementSeparator, true); + } + + return measurement; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::Content(VContainer *data, VAbstractPattern *pattern) +{ + QDomElement content = createElement(*TagContent); + + return content; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternRecipe::PreviewCalculations(VContainer *data) +{ + QDomElement previewCalculations = createElement(*TagPreviewCalculations); + + QList> patternIncrements = data->DataIncrements().values(); + + // Resore order + std::sort(patternIncrements.begin(), patternIncrements.end(), + [](const QSharedPointer &a, const QSharedPointer &b) + {return a->GetIndex() > b->GetIndex();}); + + for(auto &incr : patternIncrements) + { + if (incr->IsPreviewCalculation()) + { + previewCalculations.appendChild(Increment(incr)); + } + } + + return previewCalculations; +} diff --git a/src/libs/vformat/vpatternrecipe.h b/src/libs/vformat/vpatternrecipe.h new file mode 100644 index 000000000..960694be3 --- /dev/null +++ b/src/libs/vformat/vpatternrecipe.h @@ -0,0 +1,63 @@ +/************************************************************************ + ** + ** @file vpatternrecipe.h + ** @author Roman Telezhynskyi + ** @date 8 7, 2019 + ** + ** @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) 2019 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 . + ** + *************************************************************************/ +#ifndef VPATTERNRECIPE_H +#define VPATTERNRECIPE_H + +#include + +#include "../ifc/xml/vdomdocument.h" + +class VContainer; +class VAbstractPattern; +class VMeasurement; +class VIncrement; + +class VPatternRecipe : public VDomDocument +{ + Q_DECLARE_TR_FUNCTIONS(VPatternRecipe) +public: + VPatternRecipe(VContainer *data, VAbstractPattern *pattern, QObject *parent = nullptr); + virtual ~VPatternRecipe() Q_DECL_EQ_DEFAULT; + +private: + Q_DISABLE_COPY(VPatternRecipe) + + QDomElement Prerequisite(VContainer *data, VAbstractPattern *pattern); + + QDomElement Measurements(VContainer *data); + QDomElement Measurement(const QSharedPointer &m); + + QDomElement Increments(VContainer *data); + QDomElement PreviewCalculations(VContainer *data); + QDomElement Increment(const QSharedPointer &incr); + + QDomElement Content(VContainer *data, VAbstractPattern *pattern); + +}; + +#endif // VPATTERNRECIPE_H diff --git a/src/test/ValentinaTest/tst_vmeasurements.cpp b/src/test/ValentinaTest/tst_vmeasurements.cpp index 69fd07b35..96068026e 100644 --- a/src/test/ValentinaTest/tst_vmeasurements.cpp +++ b/src/test/ValentinaTest/tst_vmeasurements.cpp @@ -30,6 +30,7 @@ #include "../vformat/vmeasurements.h" #include "../ifc/xml/vvstconverter.h" #include "../ifc/xml/vvitconverter.h" +#include "../vpatterndb/vcontainer.h" #include "../vpatterndb/pmsystems.h" #include