diff --git a/src/app/valentina/mainwindowsnogui.cpp b/src/app/valentina/mainwindowsnogui.cpp index d2cecb66d..c45273cfc 100644 --- a/src/app/valentina/mainwindowsnogui.cpp +++ b/src/app/valentina/mainwindowsnogui.cpp @@ -485,6 +485,7 @@ void MainWindowsNoGUI::PrepareDetailsForLayout(const QHash *de det.SetPatternInfoPoints(geom.GetPos(), geom.GetLabelWidth(), geom.GetLabelHeight(), geom.GetRotation()); } det.setWidth(qApp->toPixel(d.getWidth())); + det.CreateTextItems(); listDetails.append(det); ++i; diff --git a/src/libs/vlayout/vlayoutdetail.cpp b/src/libs/vlayout/vlayoutdetail.cpp index 251fd2269..5209d179e 100644 --- a/src/libs/vlayout/vlayoutdetail.cpp +++ b/src/libs/vlayout/vlayoutdetail.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #if QT_VERSION < QT_VERSION_CHECK(5, 1, 0) # include "../vmisc/vmath.h" @@ -45,12 +46,12 @@ //--------------------------------------------------------------------------------------------------------------------- VLayoutDetail::VLayoutDetail() - :VAbstractDetail(), d(new VLayoutDetailData), m_tmDetail() + :VAbstractDetail(), d(new VLayoutDetailData), m_tmDetail(), m_liPP() {} //--------------------------------------------------------------------------------------------------------------------- VLayoutDetail::VLayoutDetail(const VLayoutDetail &detail) - :VAbstractDetail(detail), d(detail.d), m_tmDetail(detail.m_tmDetail) + :VAbstractDetail(detail), d(detail.d), m_tmDetail(detail.m_tmDetail), m_liPP(detail.m_liPP) {} //--------------------------------------------------------------------------------------------------------------------- @@ -63,6 +64,7 @@ VLayoutDetail &VLayoutDetail::operator=(const VLayoutDetail &detail) VAbstractDetail::operator=(detail); d = detail.d; m_tmDetail = detail.m_tmDetail; + m_liPP = detail.m_liPP; return *this; } @@ -516,41 +518,6 @@ QPainterPath VLayoutDetail::ContourPath() const } path.addPath(pathDet); - - - qreal dAng = qAtan2(points.at(1).y() - points.at(0).y(), points.at(1).x() - points.at(0).x()); - qreal dW = GetDistance(points.at(0), points.at(1)); - qreal dY = 0; - qreal dX; - for (int i = 0; i < m_tmDetail.GetCount(); ++i) - { - const TextLine& tl = m_tmDetail.GetLine(i); - QFont fnt = m_tmDetail.GetFont(); - fnt.setPixelSize(m_tmDetail.GetFont().pixelSize() + tl.m_iFontSize); - fnt.setWeight(tl.m_eFontWeight); - fnt.setStyle(tl.m_eStyle); - dY += tl.m_iHeight; - QMatrix mat; - mat.translate(points.at(0).x(), points.at(0).y()); - mat.rotate(qRadiansToDegrees(dAng)); - QFontMetrics fm(fnt); - if ((tl.m_eAlign & Qt::AlignLeft) > 0) - { - dX = 0; - } - else if ((tl.m_eAlign & Qt::AlignHCenter) > 0) - { - dX = (dW - fm.width(tl.m_qsText))/2; - } - else - { - dX = dW - fm.width(tl.m_qsText); - } - QPainterPath pathText; - pathText.addText(dX, dY - (fm.height() - fm.ascent())/2, fnt, tl.m_qsText); - path.addPath(mat.map(pathText)); - dY += m_tmDetail.GetSpacing(); - } } if (d->patternInfo.count() > 0) @@ -571,6 +538,92 @@ QPainterPath VLayoutDetail::ContourPath() const return path; } +//--------------------------------------------------------------------------------------------------------------------- +void VLayoutDetail::ClearTextItems() +{ + m_liPP.clear(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VLayoutDetail::CreateTextItems() +{ + ClearTextItems(); + if (d->detailLabel.count() > 0) + { + QVector points = Map(Mirror(d->detailLabel)); + points.push_back(points.at(0)); + qreal dAng = qAtan2(points.at(1).y() - points.at(0).y(), points.at(1).x() - points.at(0).x()); + qreal dW = GetDistance(points.at(0), points.at(1)); + qreal dY = 0; + qreal dX; + for (int i = 0; i < m_tmDetail.GetCount(); ++i) + { + const TextLine& tl = m_tmDetail.GetLine(i); + QFont fnt = m_tmDetail.GetFont(); + fnt.setPixelSize(m_tmDetail.GetFont().pixelSize() + tl.m_iFontSize); + fnt.setWeight(tl.m_eFontWeight); + fnt.setStyle(tl.m_eStyle); + dY += tl.m_iHeight; + QMatrix mat; + mat.translate(points.at(0).x(), points.at(0).y()); + mat.rotate(qRadiansToDegrees(dAng)); + + QFontMetrics fm(fnt); + if ((tl.m_eAlign & Qt::AlignLeft) > 0) + { + dX = 0; + } + else if ((tl.m_eAlign & Qt::AlignHCenter) > 0) + { + dX = (dW - fm.width(tl.m_qsText))/2; + } + else + { + dX = dW - fm.width(tl.m_qsText); + } + QPainterPath path; + path.addText(dX, dY - (fm.height() - fm.ascent())/2, fnt, tl.m_qsText); + m_liPP << mat.map(path); + dY += m_tmDetail.GetSpacing(); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +int VLayoutDetail::GetTextItemsCount() const +{ + return m_liPP.count(); +} + +//--------------------------------------------------------------------------------------------------------------------- +QGraphicsItem* VLayoutDetail::GetTextItem(int i) const +{ + QGraphicsPathItem* item = new QGraphicsPathItem(); + QTransform transform = d->matrix; + + QPainterPath path = transform.map(m_liPP[i]); + + if (d->mirror == true) + { + QVector points = Map(Mirror(d->detailLabel)); + QPointF ptCenter = (points.at(1) + points.at(3))/2; + qreal dRot = qRadiansToDegrees(qAtan2(points.at(1).y() - points.at(0).y(), points.at(1).x() - points.at(0).x())); + + // we need to move the center back to the origin, rotate it to align it with x axis, + // then mirror it to obtain the proper text direction, rotate it and translate it back to original position + QTransform t; + t.translate(ptCenter.x(), ptCenter.y()); + t.rotate(dRot); + t.scale(-1, 1); + t.rotate(-dRot); + t.translate(-ptCenter.x(), -ptCenter.y()); + path = t.map(path); + } + item->setPath(path); + item->setBrush(QBrush(Qt::black)); + return item; +} + //--------------------------------------------------------------------------------------------------------------------- QPainterPath VLayoutDetail::LayoutAllowencePath() const { diff --git a/src/libs/vlayout/vlayoutdetail.h b/src/libs/vlayout/vlayoutdetail.h index b639420b9..9c1da46e9 100644 --- a/src/libs/vlayout/vlayoutdetail.h +++ b/src/libs/vlayout/vlayoutdetail.h @@ -85,12 +85,17 @@ public: bool isNull() const; qint64 Square() const; QPainterPath ContourPath() const; + void ClearTextItems(); + void CreateTextItems(); + int GetTextItemsCount() const; + QGraphicsItem* GetTextItem(int i) const; QPainterPath LayoutAllowencePath() const; QGraphicsItem *GetItem() const Q_REQUIRED_RESULT; private: QSharedDataPointer d; VTextManager m_tmDetail; + QList m_liPP; QVector Map(const QVector &points) const; static QVector RoundPoints(const QVector &points); diff --git a/src/libs/vlayout/vlayoutdetail_p.h b/src/libs/vlayout/vlayoutdetail_p.h index d7fe95d53..46ed05d18 100644 --- a/src/libs/vlayout/vlayoutdetail_p.h +++ b/src/libs/vlayout/vlayoutdetail_p.h @@ -52,9 +52,9 @@ public: VLayoutDetailData(const VLayoutDetailData &detail) :QSharedData(detail), contour(detail.contour), seamAllowence(detail.seamAllowence), - layoutAllowence(detail.layoutAllowence), matrix(detail.matrix), layoutWidth(detail.layoutWidth), - mirror(detail.mirror), detailLabel(detail.detailLabel), patternInfo(detail.patternInfo), - detailData(detail.detailData) + layoutAllowence(detail.layoutAllowence), matrix(detail.matrix), + layoutWidth(detail.layoutWidth), mirror(detail.mirror), detailLabel(detail.detailLabel), + patternInfo(detail.patternInfo), detailData(detail.detailData) {} ~VLayoutDetailData() {} diff --git a/src/libs/vlayout/vlayoutpaper.cpp b/src/libs/vlayout/vlayoutpaper.cpp index 91a7213ba..21710bcc5 100644 --- a/src/libs/vlayout/vlayoutpaper.cpp +++ b/src/libs/vlayout/vlayoutpaper.cpp @@ -313,6 +313,10 @@ QList VLayoutPaper::GetItemDetails() const for (int i=0; i < d->details.count(); ++i) { list.append(d->details.at(i).GetItem()); + for (int iT = 0; iT < d->details.at(i).GetTextItemsCount(); ++iT) + { + list.append(d->details.at(i).GetTextItem(iT)); + } } return list; }