Piece labels line break.
This commit is contained in:
parent
1dbd0c7c56
commit
7410d188ce
|
@ -28,6 +28,7 @@
|
||||||
- New notch type - Check Notch.
|
- New notch type - Check Notch.
|
||||||
- Control a notch width and angle with formulas.
|
- Control a notch width and angle with formulas.
|
||||||
- Independent translation for piece labels.
|
- Independent translation for piece labels.
|
||||||
|
- Piece labels line break.
|
||||||
|
|
||||||
# Valentina 0.7.52 September 12, 2022
|
# Valentina 0.7.52 September 12, 2022
|
||||||
- Fix crash when default locale is ru.
|
- Fix crash when default locale is ru.
|
||||||
|
|
|
@ -104,24 +104,12 @@ inline auto LineMatrix(const VPPiecePtr &piece, const QPointF &topLeft, qreal an
|
||||||
inline auto LineFont(const TextLine &tl, const QFont &base) -> QFont
|
inline auto LineFont(const TextLine &tl, const QFont &base) -> QFont
|
||||||
{
|
{
|
||||||
QFont fnt = base;
|
QFont fnt = base;
|
||||||
fnt.setPixelSize(base.pixelSize() + tl.m_iFontSize);
|
fnt.setPointSize(base.pointSize() + tl.m_iFontSize);
|
||||||
fnt.setBold(tl.m_bold);
|
fnt.setBold(tl.m_bold);
|
||||||
fnt.setItalic(tl.m_italic);
|
fnt.setItalic(tl.m_italic);
|
||||||
return fnt;
|
return fnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
inline auto LineText(const TextLine &tl, const QFontMetrics &fm, qreal width) -> QString
|
|
||||||
{
|
|
||||||
QString qsText = tl.m_qsText;
|
|
||||||
if (TextWidth(fm, qsText) > width)
|
|
||||||
{
|
|
||||||
qsText = fm.elidedText(qsText, Qt::ElideMiddle, static_cast<int>(width));
|
|
||||||
}
|
|
||||||
|
|
||||||
return qsText;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
inline auto LineAlign(const TextLine &tl, const QString &text, const QFontMetrics &fm, qreal width) -> qreal
|
inline auto LineAlign(const TextLine &tl, const QString &text, const QFontMetrics &fm, qreal width) -> qreal
|
||||||
{
|
{
|
||||||
|
@ -404,23 +392,31 @@ void VPGraphicsPiece::InitPieceLabel(const QVector<QPointF> &labelShape, const V
|
||||||
|
|
||||||
qreal dY = 0;
|
qreal dY = 0;
|
||||||
|
|
||||||
for (int i = 0; i < tm.GetSourceLinesCount(); ++i)
|
const QVector<TextLine> labelLines = tm.GetLabelSourceLines(qFloor(dW), tm.GetFont());
|
||||||
|
|
||||||
|
for (const auto &tl : labelLines)
|
||||||
{
|
{
|
||||||
const TextLine& tl = tm.GetSourceLine(i);
|
|
||||||
const QFont fnt = LineFont(tl, tm.GetFont());
|
const QFont fnt = LineFont(tl, tm.GetFont());
|
||||||
const QFontMetrics fm(fnt);
|
const QFontMetrics fm(fnt);
|
||||||
|
|
||||||
if (m_textAsPaths)
|
if (m_textAsPaths)
|
||||||
{
|
{
|
||||||
dY += fm.height();
|
dY += fm.height();
|
||||||
}
|
|
||||||
|
|
||||||
if (dY > dH)
|
if (dY > dH)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (dY + fm.height() > dH)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const QString qsText = LineText(tl, fm, dW);
|
const QString qsText = tl.m_qsText;
|
||||||
const qreal dX = LineAlign(tl, qsText, fm, dW);
|
const qreal dX = LineAlign(tl, qsText, fm, dW);
|
||||||
// set up the rotation around top-left corner matrix
|
// set up the rotation around top-left corner matrix
|
||||||
const QTransform lineMatrix = LineMatrix(piece, labelShape.at(0), angle, QPointF(dX, dY), maxLineWidth);
|
const QTransform lineMatrix = LineMatrix(piece, labelShape.at(0), angle, QPointF(dX, dY), maxLineWidth);
|
||||||
|
|
|
@ -900,7 +900,8 @@ auto VPLayoutFileReader::ReadLabelLine() -> TextLine
|
||||||
|
|
||||||
QXmlStreamAttributes attribs = attributes();
|
QXmlStreamAttributes attribs = attributes();
|
||||||
|
|
||||||
line.m_iFontSize = ReadAttributeInt(attribs, ML::AttrFontSize, QString::number(MIN_FONT_SIZE));
|
line.m_iFontSize =
|
||||||
|
ReadAttributeInt(attribs, ML::AttrFontSize, QString::number(VCommonSettings::MinPieceLabelFontPointSize()));
|
||||||
line.m_bold = ReadAttributeBool(attribs, ML::AttrBold, falseStr);
|
line.m_bold = ReadAttributeBool(attribs, ML::AttrBold, falseStr);
|
||||||
line.m_italic = ReadAttributeBool(attribs, ML::AttrItalic, falseStr);
|
line.m_italic = ReadAttributeBool(attribs, ML::AttrItalic, falseStr);
|
||||||
int alignment = ReadAttributeInt(attribs, ML::AttrAlignment, QString::number(static_cast<int>(Qt::AlignCenter)));
|
int alignment = ReadAttributeInt(attribs, ML::AttrAlignment, QString::number(static_cast<int>(Qt::AlignCenter)));
|
||||||
|
|
|
@ -112,7 +112,19 @@ PreferencesPatternPage::PreferencesPatternPage(QWidget *parent)
|
||||||
ui->checkBoxSewLineOnDrawing->setChecked(settings->GetSewLineOnDrawing());
|
ui->checkBoxSewLineOnDrawing->setChecked(settings->GetSewLineOnDrawing());
|
||||||
ui->doublePassmarkCheck->setChecked(settings->IsDoublePassmark());
|
ui->doublePassmarkCheck->setChecked(settings->IsDoublePassmark());
|
||||||
ui->checkBoxHideMainPath->setChecked(settings->IsHideMainPath());
|
ui->checkBoxHideMainPath->setChecked(settings->IsHideMainPath());
|
||||||
ui->fontComboBoxLabelFont->setCurrentFont(settings->GetLabelFont());
|
|
||||||
|
QFont labelFont = settings->GetLabelFont();
|
||||||
|
int pointSize = settings->GetPieceLabelFontPointSize();
|
||||||
|
labelFont.setPointSize(pointSize);
|
||||||
|
|
||||||
|
ui->fontComboBoxLabelFont->setCurrentFont(labelFont);
|
||||||
|
|
||||||
|
InitLabelFontSizes();
|
||||||
|
const qint32 indexSize = ui->comboBoxLabelFontSize->findData(pointSize);
|
||||||
|
if (indexSize != -1)
|
||||||
|
{
|
||||||
|
ui->comboBoxLabelFontSize->setCurrentIndex(indexSize);
|
||||||
|
}
|
||||||
|
|
||||||
ui->checkBoxRemeberPatternMaterials->setChecked(settings->IsRememberPatternMaterials());
|
ui->checkBoxRemeberPatternMaterials->setChecked(settings->IsRememberPatternMaterials());
|
||||||
m_knownMaterials = settings->GetKnownMaterials();
|
m_knownMaterials = settings->GetKnownMaterials();
|
||||||
|
@ -167,6 +179,7 @@ auto PreferencesPatternPage::Apply() -> QStringList
|
||||||
settings->SetSewLineOnDrawing(ui->checkBoxSewLineOnDrawing->isChecked());
|
settings->SetSewLineOnDrawing(ui->checkBoxSewLineOnDrawing->isChecked());
|
||||||
settings->SetHideMainPath(ui->checkBoxHideMainPath->isChecked());
|
settings->SetHideMainPath(ui->checkBoxHideMainPath->isChecked());
|
||||||
settings->SetLabelFont(ui->fontComboBoxLabelFont->currentFont());
|
settings->SetLabelFont(ui->fontComboBoxLabelFont->currentFont());
|
||||||
|
settings->SetPieceLabelFontPointSize(ui->comboBoxLabelFontSize->currentData().toInt());
|
||||||
|
|
||||||
if (settings->IsDoublePassmark() != ui->doublePassmarkCheck->isChecked())
|
if (settings->IsDoublePassmark() != ui->doublePassmarkCheck->isChecked())
|
||||||
{
|
{
|
||||||
|
@ -255,6 +268,21 @@ void PreferencesPatternPage::InitLabelDateTimeFormats()
|
||||||
connect(ui->pushButtonEditTimeFormats, &QPushButton::clicked, this, &PreferencesPatternPage::EditDateTimeFormats);
|
connect(ui->pushButtonEditTimeFormats, &QPushButton::clicked, this, &PreferencesPatternPage::EditDateTimeFormats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void PreferencesPatternPage::InitLabelFontSizes()
|
||||||
|
{
|
||||||
|
ui->comboBoxLabelFontSize->clear();
|
||||||
|
|
||||||
|
// Get the available font sizes
|
||||||
|
for (auto size : QFontDatabase::standardSizes())
|
||||||
|
{
|
||||||
|
if (size >= VCommonSettings::MinPieceLabelFontPointSize())
|
||||||
|
{
|
||||||
|
ui->comboBoxLabelFontSize->addItem(QString::number(size), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void PreferencesPatternPage::InitComboBoxFormats(QComboBox *box, const QStringList &items, const QString ¤tFormat)
|
void PreferencesPatternPage::InitComboBoxFormats(QComboBox *box, const QStringList &items, const QString ¤tFormat)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,7 @@ private:
|
||||||
Unit m_oldLineUnit{Unit::Mm};
|
Unit m_oldLineUnit{Unit::Mm};
|
||||||
|
|
||||||
void InitLabelDateTimeFormats();
|
void InitLabelDateTimeFormats();
|
||||||
|
void InitLabelFontSizes();
|
||||||
static void InitComboBoxFormats(QComboBox *box, const QStringList &items, const QString ¤tFormat);
|
static void InitComboBoxFormats(QComboBox *box, const QStringList &items, const QString ¤tFormat);
|
||||||
void InitUnits();
|
void InitUnits();
|
||||||
void RetranslateUi();
|
void RetranslateUi();
|
||||||
|
|
|
@ -238,6 +238,29 @@ This option will take an affect after restart.</string>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFontComboBox" name="fontComboBoxLabelFont"/>
|
<widget class="QFontComboBox" name="fontComboBoxLabelFont"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>Size:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="comboBoxLabelFontSize"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -2975,7 +2975,7 @@ void MainWindow::ToolBarTools()
|
||||||
connect(ui->actionIncreaseLabelFont, &QAction::triggered, this, [this]()
|
connect(ui->actionIncreaseLabelFont, &QAction::triggered, this, [this]()
|
||||||
{
|
{
|
||||||
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
||||||
settings->SetLabelFontSize(settings->GetLabelFontSize() + 1);
|
settings->SetPatternLabelFontSize(settings->GetPatternLabelFontSize() + 1);
|
||||||
if (m_sceneDraw)
|
if (m_sceneDraw)
|
||||||
{
|
{
|
||||||
m_sceneDraw->update();
|
m_sceneDraw->update();
|
||||||
|
@ -2996,7 +2996,7 @@ void MainWindow::ToolBarTools()
|
||||||
connect(ui->actionDecreaseLabelFont, &QAction::triggered, this, [this]()
|
connect(ui->actionDecreaseLabelFont, &QAction::triggered, this, [this]()
|
||||||
{
|
{
|
||||||
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
||||||
settings->SetLabelFontSize(settings->GetLabelFontSize() - 1);
|
settings->SetPatternLabelFontSize(settings->GetPatternLabelFontSize() - 1);
|
||||||
if (m_sceneDraw)
|
if (m_sceneDraw)
|
||||||
{
|
{
|
||||||
m_sceneDraw->update();
|
m_sceneDraw->update();
|
||||||
|
@ -3017,7 +3017,7 @@ void MainWindow::ToolBarTools()
|
||||||
connect(ui->actionOriginalLabelFont, &QAction::triggered, this, [this]()
|
connect(ui->actionOriginalLabelFont, &QAction::triggered, this, [this]()
|
||||||
{
|
{
|
||||||
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings();
|
||||||
settings->SetLabelFontSize(VCommonSettings::GetDefLabelFontSize());
|
settings->SetPatternLabelFontSize(VCommonSettings::GetDefPatternLabelFontSize());
|
||||||
if (m_sceneDraw)
|
if (m_sceneDraw)
|
||||||
{
|
{
|
||||||
m_sceneDraw->update();
|
m_sceneDraw->update();
|
||||||
|
|
|
@ -886,11 +886,15 @@ void VLayoutPiece::SetPieceText(const QString &qsName, const VPieceLabelData &da
|
||||||
|
|
||||||
// generate text
|
// generate text
|
||||||
d->m_tmDetail.SetFont(font);
|
d->m_tmDetail.SetFont(font);
|
||||||
d->m_tmDetail.SetFontSize(data.GetFontSize());
|
|
||||||
|
int fntSize = data.GetFontSize();
|
||||||
|
if (fntSize == 0)
|
||||||
|
{
|
||||||
|
fntSize = VAbstractApplication::VApp()->Settings()->GetPieceLabelFontPointSize();
|
||||||
|
}
|
||||||
|
d->m_tmDetail.SetFontSize(fntSize);
|
||||||
|
|
||||||
d->m_tmDetail.Update(qsName, data, pattern);
|
d->m_tmDetail.Update(qsName, data, pattern);
|
||||||
// this will generate the lines of text
|
|
||||||
d->m_tmDetail.SetFontSize(data.GetFontSize());
|
|
||||||
d->m_tmDetail.FitFontSize(labelWidth, labelHeight);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -962,13 +966,15 @@ void VLayoutPiece::SetPatternInfo(VAbstractPattern *pDoc, const VPatternLabelDat
|
||||||
|
|
||||||
// Generate text
|
// Generate text
|
||||||
d->m_tmPattern.SetFont(font);
|
d->m_tmPattern.SetFont(font);
|
||||||
d->m_tmPattern.SetFontSize(geom.GetFontSize());
|
|
||||||
|
int fntSize = geom.GetFontSize();
|
||||||
|
if (fntSize == 0)
|
||||||
|
{
|
||||||
|
fntSize = VAbstractApplication::VApp()->Settings()->GetPieceLabelFontPointSize();
|
||||||
|
}
|
||||||
|
d->m_tmPattern.SetFontSize(fntSize);
|
||||||
|
|
||||||
d->m_tmPattern.Update(pDoc, pattern);
|
d->m_tmPattern.Update(pDoc, pattern);
|
||||||
|
|
||||||
// generate lines of text
|
|
||||||
d->m_tmPattern.SetFontSize(geom.GetFontSize());
|
|
||||||
d->m_tmPattern.FitFontSize(labelWidth, labelHeight);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1568,11 +1574,12 @@ void VLayoutPiece::CreateLabelStrings(QGraphicsItem *parent, const QVector<QPoin
|
||||||
const qreal angle = -QLineF(labelShape.at(0), labelShape.at(1)).angle();
|
const qreal angle = -QLineF(labelShape.at(0), labelShape.at(1)).angle();
|
||||||
qreal dY = 0;
|
qreal dY = 0;
|
||||||
|
|
||||||
for (int i = 0; i < tm.GetSourceLinesCount(); ++i)
|
const QVector<TextLine> labelLines = tm.GetLabelSourceLines(qFloor(dW), tm.GetFont());
|
||||||
|
|
||||||
|
for (const auto &tl : labelLines)
|
||||||
{
|
{
|
||||||
const TextLine &tl = tm.GetSourceLine(i);
|
|
||||||
QFont fnt = tm.GetFont();
|
QFont fnt = tm.GetFont();
|
||||||
fnt.setPixelSize(tm.GetFont().pixelSize() + tl.m_iFontSize);
|
fnt.setPointSize(tm.GetFont().pointSize() + tl.m_iFontSize);
|
||||||
fnt.setBold(tl.m_bold);
|
fnt.setBold(tl.m_bold);
|
||||||
fnt.setItalic(tl.m_italic);
|
fnt.setItalic(tl.m_italic);
|
||||||
|
|
||||||
|
@ -1581,19 +1588,21 @@ void VLayoutPiece::CreateLabelStrings(QGraphicsItem *parent, const QVector<QPoin
|
||||||
if (textAsPaths)
|
if (textAsPaths)
|
||||||
{
|
{
|
||||||
dY += fm.height();
|
dY += fm.height();
|
||||||
}
|
|
||||||
|
|
||||||
if (dY > dH)
|
if (dY > dH)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
QString qsText = tl.m_qsText;
|
else
|
||||||
if (TextWidth(fm, qsText) > dW)
|
|
||||||
{
|
{
|
||||||
qsText = fm.elidedText(qsText, Qt::ElideMiddle, static_cast<int>(dW));
|
if (dY + fm.height() > dH)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString qsText = tl.m_qsText;
|
||||||
qreal dX = 0;
|
qreal dX = 0;
|
||||||
if (tl.m_eAlign == 0 || (tl.m_eAlign & Qt::AlignLeft) > 0)
|
if (tl.m_eAlign == 0 || (tl.m_eAlign & Qt::AlignLeft) > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,7 +38,9 @@
|
||||||
#include <QtMath>
|
#include <QtMath>
|
||||||
|
|
||||||
#include "../ifc/xml/vabstractpattern.h"
|
#include "../ifc/xml/vabstractpattern.h"
|
||||||
|
#include "../vmisc/compatibility.h"
|
||||||
#include "../vmisc/vabstractvalapplication.h"
|
#include "../vmisc/vabstractvalapplication.h"
|
||||||
|
#include "../vmisc/vcommonsettings.h"
|
||||||
#include "../vpatterndb/floatItemData/vpiecelabeldata.h"
|
#include "../vpatterndb/floatItemData/vpiecelabeldata.h"
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)
|
#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)
|
||||||
|
@ -50,6 +52,49 @@
|
||||||
#include "../vpatterndb/vcontainer.h"
|
#include "../vpatterndb/vcontainer.h"
|
||||||
#include "vtextmanager.h"
|
#include "vtextmanager.h"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
auto SplitTextByWidth(const QString &text, const QFont &font, int maxWidth) -> QStringList
|
||||||
|
{
|
||||||
|
QFontMetrics fontMetrics(font);
|
||||||
|
if (TextWidth(fontMetrics, text) <= maxWidth)
|
||||||
|
{
|
||||||
|
return {text};
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList substrings;
|
||||||
|
substrings.reserve(2);
|
||||||
|
|
||||||
|
const int textLength = static_cast<int>(text.length());
|
||||||
|
int lineWidth = 0;
|
||||||
|
|
||||||
|
for (int endIndex = 0; endIndex < textLength; ++endIndex)
|
||||||
|
{
|
||||||
|
QChar currentChar = text.at(endIndex);
|
||||||
|
const int charWidth = TextWidth(fontMetrics, currentChar);
|
||||||
|
|
||||||
|
if (lineWidth + charWidth > maxWidth)
|
||||||
|
{
|
||||||
|
if (endIndex > 0)
|
||||||
|
{
|
||||||
|
substrings.append(text.mid(0, endIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endIndex < textLength)
|
||||||
|
{
|
||||||
|
substrings.append(text.mid(endIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineWidth += charWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
return substrings;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
const quint32 TextLine::streamHeader = 0xA3881E49; // CRC-32Q string "TextLine"
|
const quint32 TextLine::streamHeader = 0xA3881E49; // CRC-32Q string "TextLine"
|
||||||
const quint16 TextLine::classVersion = 1;
|
const quint16 TextLine::classVersion = 1;
|
||||||
|
|
||||||
|
@ -487,7 +532,9 @@ auto VTextManager::GetFont() const -> const QFont &
|
||||||
*/
|
*/
|
||||||
void VTextManager::SetFontSize(int iFS)
|
void VTextManager::SetFontSize(int iFS)
|
||||||
{
|
{
|
||||||
iFS < MIN_FONT_SIZE ? m_font.setPixelSize(MIN_FONT_SIZE) : m_font.setPixelSize(iFS);
|
iFS < VCommonSettings::MinPieceLabelFontPointSize()
|
||||||
|
? m_font.setPointSize(VCommonSettings::MinPieceLabelFontPointSize())
|
||||||
|
: m_font.setPointSize(iFS);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -525,6 +572,40 @@ auto VTextManager::GetSourceLine(vsizetype i) const -> const TextLine &
|
||||||
return m_liLines.at(i);
|
return m_liLines.at(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
auto VTextManager::GetLabelSourceLines(int width, const QFont &font) const -> QVector<TextLine>
|
||||||
|
{
|
||||||
|
QVector<TextLine> lines;
|
||||||
|
lines.reserve(m_liLines.size());
|
||||||
|
QFont fnt = font;
|
||||||
|
int fSize = m_font.pointSize();
|
||||||
|
|
||||||
|
for (const auto &tl : m_liLines)
|
||||||
|
{
|
||||||
|
fnt.setPointSize(fSize + tl.m_iFontSize);
|
||||||
|
fnt.setBold(tl.m_bold);
|
||||||
|
fnt.setItalic(tl.m_italic);
|
||||||
|
|
||||||
|
QString qsText = tl.m_qsText;
|
||||||
|
QFontMetrics fm(fnt);
|
||||||
|
if (TextWidth(fm, qsText) > width)
|
||||||
|
{
|
||||||
|
const QStringList brokeLines = BreakTextIntoLines(qsText, fnt, width);
|
||||||
|
for (const auto &lineText : brokeLines)
|
||||||
|
{
|
||||||
|
TextLine line = tl;
|
||||||
|
line.m_qsText = lineText;
|
||||||
|
lines.append(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lines.append(tl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
auto VTextManager::MaxLineWidth(int width) const -> int
|
auto VTextManager::MaxLineWidth(int width) const -> int
|
||||||
{
|
{
|
||||||
|
@ -534,7 +615,7 @@ auto VTextManager::MaxLineWidth(int width) const -> int
|
||||||
const TextLine &tl = m_liLines.at(i);
|
const TextLine &tl = m_liLines.at(i);
|
||||||
|
|
||||||
QFont fnt = m_font;
|
QFont fnt = m_font;
|
||||||
fnt.setPixelSize(fnt.pixelSize() + tl.m_iFontSize);
|
fnt.setPointSize(fnt.pointSize() + tl.m_iFontSize);
|
||||||
fnt.setBold(tl.m_bold);
|
fnt.setBold(tl.m_bold);
|
||||||
fnt.setItalic(tl.m_italic);
|
fnt.setItalic(tl.m_italic);
|
||||||
|
|
||||||
|
@ -553,64 +634,6 @@ auto VTextManager::MaxLineWidth(int width) const -> int
|
||||||
return maxWidth;
|
return maxWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief VTextManager::FitFontSize sets the font size just big enough, so that the text fits into rectangle of
|
|
||||||
* size (fW, fH)
|
|
||||||
* @param fW rectangle width
|
|
||||||
* @param fH rectangle height
|
|
||||||
*/
|
|
||||||
void VTextManager::FitFontSize(qreal fW, qreal fH)
|
|
||||||
{
|
|
||||||
int iFS = 0;
|
|
||||||
if (GetSourceLinesCount() > 0)
|
|
||||||
{ // division by zero
|
|
||||||
iFS = 3 * qFloor(fH / static_cast<int>(GetSourceLinesCount())) / 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iFS < MIN_FONT_SIZE)
|
|
||||||
{
|
|
||||||
iFS = MIN_FONT_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get ratio between char width and height
|
|
||||||
|
|
||||||
int iMaxLen = 0;
|
|
||||||
TextLine maxLine;
|
|
||||||
QFont fnt;
|
|
||||||
for (vsizetype i = 0; i < GetSourceLinesCount(); ++i)
|
|
||||||
{
|
|
||||||
const TextLine &tl = GetSourceLine(i);
|
|
||||||
fnt = m_font;
|
|
||||||
fnt.setPixelSize(iFS + tl.m_iFontSize);
|
|
||||||
fnt.setBold(tl.m_bold);
|
|
||||||
fnt.setItalic(tl.m_italic);
|
|
||||||
QFontMetrics fm(fnt);
|
|
||||||
const int iTW = TextWidth(fm, tl.m_qsText);
|
|
||||||
if (iTW > iMaxLen)
|
|
||||||
{
|
|
||||||
iMaxLen = iTW;
|
|
||||||
maxLine = tl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (iMaxLen > fW)
|
|
||||||
{
|
|
||||||
QFont fnt = m_font;
|
|
||||||
fnt.setBold(maxLine.m_bold);
|
|
||||||
fnt.setItalic(maxLine.m_italic);
|
|
||||||
|
|
||||||
int lineLength = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
--iFS;
|
|
||||||
fnt.setPixelSize(iFS + maxLine.m_iFontSize);
|
|
||||||
QFontMetrics fm(fnt);
|
|
||||||
lineLength = TextWidth(fm, maxLine.m_qsText);
|
|
||||||
} while (lineLength > fW && iFS > MIN_FONT_SIZE);
|
|
||||||
}
|
|
||||||
SetFontSize(iFS);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief VTextManager::Update updates the text lines with detail data
|
* @brief VTextManager::Update updates the text lines with detail data
|
||||||
|
@ -665,3 +688,93 @@ void VTextManager::Update(VAbstractPattern *pDoc, const VContainer *pattern)
|
||||||
|
|
||||||
m_liLines = *m_patternLabelLinesCache;
|
m_liLines = *m_patternLabelLinesCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
auto VTextManager::BreakTextIntoLines(const QString &text, const QFont &font, int maxWidth) const -> QStringList
|
||||||
|
{
|
||||||
|
QFontMetrics fontMetrics(font);
|
||||||
|
QStringList words = text.split(' ');
|
||||||
|
|
||||||
|
QString currentLine;
|
||||||
|
int currentLineWidth = 0;
|
||||||
|
const int spaceWidth = TextWidth(fontMetrics, QChar(' '));
|
||||||
|
const float tolerance = 0.3F;
|
||||||
|
|
||||||
|
QStringList lines;
|
||||||
|
lines.reserve(words.size());
|
||||||
|
QMutableListIterator<QString> iterator(words);
|
||||||
|
|
||||||
|
auto AppendWord = [¤tLine, ¤tLineWidth](const QString &word, int totalWidth)
|
||||||
|
{
|
||||||
|
if (!currentLine.isEmpty())
|
||||||
|
{
|
||||||
|
currentLine += QChar(' ');
|
||||||
|
}
|
||||||
|
currentLine += word;
|
||||||
|
currentLineWidth = totalWidth;
|
||||||
|
};
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
const QString &word = iterator.next();
|
||||||
|
int wordWidth = TextWidth(fontMetrics, word);
|
||||||
|
int totalWidth = !currentLine.isEmpty() ? currentLineWidth + spaceWidth + wordWidth : wordWidth;
|
||||||
|
|
||||||
|
if (totalWidth <= maxWidth)
|
||||||
|
{
|
||||||
|
// Append the word to the current line
|
||||||
|
AppendWord(word, totalWidth);
|
||||||
|
}
|
||||||
|
else if ((maxWidth - currentLineWidth) <= qRound(static_cast<float>(maxWidth) * tolerance) &&
|
||||||
|
maxWidth >= wordWidth)
|
||||||
|
{
|
||||||
|
// Start a new line with the word if it doesn't exceed the tolerance
|
||||||
|
lines.append(currentLine);
|
||||||
|
currentLine = word;
|
||||||
|
currentLineWidth = wordWidth;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Word is too long, force line break
|
||||||
|
if (currentLineWidth + spaceWidth + TextWidth(fontMetrics, word.at(0)) > maxWidth)
|
||||||
|
{
|
||||||
|
lines.append(currentLine);
|
||||||
|
currentLine.clear();
|
||||||
|
currentLineWidth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int subWordWidth = !currentLine.isEmpty() ? maxWidth - (currentLineWidth + spaceWidth) : maxWidth;
|
||||||
|
const QStringList subWords = SplitTextByWidth(word, font, subWordWidth);
|
||||||
|
|
||||||
|
if (subWords.isEmpty() || subWords.size() > 2)
|
||||||
|
{
|
||||||
|
AppendWord(word, totalWidth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int width = TextWidth(fontMetrics, ConstFirst(subWords));
|
||||||
|
const int tWidth = !currentLine.isEmpty() ? currentLineWidth + spaceWidth + width : width;
|
||||||
|
AppendWord(ConstFirst(subWords), tWidth);
|
||||||
|
lines.append(currentLine);
|
||||||
|
|
||||||
|
if (subWords.size() == 2)
|
||||||
|
{
|
||||||
|
currentLine.clear();
|
||||||
|
currentLineWidth = 0;
|
||||||
|
|
||||||
|
// Insert the item after the current item
|
||||||
|
iterator.insert(ConstLast(subWords));
|
||||||
|
iterator.previous();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the last line
|
||||||
|
if (!currentLine.isEmpty())
|
||||||
|
{
|
||||||
|
lines.append(currentLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
|
@ -45,16 +45,13 @@ class VPieceLabelData;
|
||||||
class VAbstractPattern;
|
class VAbstractPattern;
|
||||||
class VContainer;
|
class VContainer;
|
||||||
|
|
||||||
#define MIN_FONT_SIZE 5
|
|
||||||
#define MAX_FONT_SIZE 128
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The TextLine struct holds the information about one text line
|
* @brief The TextLine struct holds the information about one text line
|
||||||
*/
|
*/
|
||||||
struct TextLine
|
struct TextLine
|
||||||
{
|
{
|
||||||
QString m_qsText{};
|
QString m_qsText{};
|
||||||
int m_iFontSize{MIN_FONT_SIZE}; // 0 means default
|
int m_iFontSize{0}; // 0 means default
|
||||||
bool m_bold{false};
|
bool m_bold{false};
|
||||||
bool m_italic{false};
|
bool m_italic{false};
|
||||||
Qt::Alignment m_eAlign{Qt::AlignCenter};
|
Qt::Alignment m_eAlign{Qt::AlignCenter};
|
||||||
|
@ -92,13 +89,14 @@ public:
|
||||||
void SetFont(const QFont &font);
|
void SetFont(const QFont &font);
|
||||||
auto GetFont() const -> const QFont &;
|
auto GetFont() const -> const QFont &;
|
||||||
void SetFontSize(int iFS);
|
void SetFontSize(int iFS);
|
||||||
void FitFontSize(qreal fW, qreal fH);
|
|
||||||
|
|
||||||
auto GetAllSourceLines() const -> QVector<TextLine>;
|
auto GetAllSourceLines() const -> QVector<TextLine>;
|
||||||
void SetAllSourceLines(const QVector<TextLine> &lines);
|
void SetAllSourceLines(const QVector<TextLine> &lines);
|
||||||
auto GetSourceLinesCount() const -> vsizetype;
|
auto GetSourceLinesCount() const -> vsizetype;
|
||||||
auto GetSourceLine(vsizetype i) const -> const TextLine &;
|
auto GetSourceLine(vsizetype i) const -> const TextLine &;
|
||||||
|
|
||||||
|
auto GetLabelSourceLines(int width, const QFont &font) const -> QVector<TextLine>;
|
||||||
|
|
||||||
auto MaxLineWidth(int width) const -> int;
|
auto MaxLineWidth(int width) const -> int;
|
||||||
|
|
||||||
void Update(const QString &qsName, const VPieceLabelData &data, const VContainer *pattern);
|
void Update(const QString &qsName, const VPieceLabelData &data, const VContainer *pattern);
|
||||||
|
@ -113,6 +111,8 @@ private:
|
||||||
|
|
||||||
static const quint32 streamHeader;
|
static const quint32 streamHeader;
|
||||||
static const quint16 classVersion;
|
static const quint16 classVersion;
|
||||||
|
|
||||||
|
auto BreakTextIntoLines(const QString &text, const QFont &font, int maxWidth) const -> QStringList;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VTEXTMANAGER_H
|
#endif // VTEXTMANAGER_H
|
||||||
|
|
|
@ -129,6 +129,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingDoublePassmark, (QLatin1String("
|
||||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternDefaultSeamAllowance,
|
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternDefaultSeamAllowance,
|
||||||
(QLatin1String("pattern/defaultSeamAllowance"))) // NOLINT
|
(QLatin1String("pattern/defaultSeamAllowance"))) // NOLINT
|
||||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternLabelFont, (QLatin1String("pattern/labelFont"))) // NOLINT
|
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternLabelFont, (QLatin1String("pattern/labelFont"))) // NOLINT
|
||||||
|
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPieceLabelFontPointSize, // NOLINT
|
||||||
|
(QLatin1String("pattern/pieceLabelFontPointSize")))
|
||||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternLineWidth, (QLatin1String("pattern/lineWidth"))) // NOLINT
|
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternLineWidth, (QLatin1String("pattern/lineWidth"))) // NOLINT
|
||||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternCurveApproximationScale,
|
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPatternCurveApproximationScale,
|
||||||
(QLatin1String("pattern/curveApproximationScale"))) // NOLINT
|
(QLatin1String("pattern/curveApproximationScale"))) // NOLINT
|
||||||
|
@ -1188,15 +1190,49 @@ void VCommonSettings::SetLabelFont(const QFont &f)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
auto VCommonSettings::GetLabelFontSize() const -> int
|
auto VCommonSettings::GetPieceLabelFontPointSize() const -> int
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
int val = value(*settingPieceLabelFontPointSize, VCommonSettings::MinPieceLabelFontPointSize()).toInt(&ok);
|
||||||
|
if (not ok)
|
||||||
|
{
|
||||||
|
qDebug() << "Could not convert value"
|
||||||
|
<< value(*settingPieceLabelFontPointSize, VCommonSettings::MinPieceLabelFontPointSize())
|
||||||
|
<< "to int. Return default value for label font size.";
|
||||||
|
val = 12;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (val < VCommonSettings::MinPieceLabelFontPointSize())
|
||||||
|
{
|
||||||
|
return VCommonSettings::MinPieceLabelFontPointSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VCommonSettings::SetPieceLabelFontPointSize(int size)
|
||||||
|
{
|
||||||
|
setValue(*settingPieceLabelFontPointSize, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
auto VCommonSettings::MinPieceLabelFontPointSize() -> int
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
auto VCommonSettings::GetPatternLabelFontSize() const -> int
|
||||||
{
|
{
|
||||||
if (labelFontSizeCached <= 0)
|
if (labelFontSizeCached <= 0)
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
labelFontSizeCached = value(*settingPatternLabelFontSize, GetDefLabelFontSize()).toInt(&ok);
|
labelFontSizeCached = value(*settingPatternLabelFontSize, GetDefPatternLabelFontSize()).toInt(&ok);
|
||||||
if (not ok)
|
if (not ok)
|
||||||
{
|
{
|
||||||
labelFontSizeCached = GetDefLabelFontSize();
|
labelFontSizeCached = GetDefPatternLabelFontSize();
|
||||||
}
|
}
|
||||||
labelFontSizeCached = qBound(minLabelFontSize, labelFontSizeCached, maxLabelFontSize);
|
labelFontSizeCached = qBound(minLabelFontSize, labelFontSizeCached, maxLabelFontSize);
|
||||||
}
|
}
|
||||||
|
@ -1204,7 +1240,7 @@ auto VCommonSettings::GetLabelFontSize() const -> int
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VCommonSettings::SetLabelFontSize(int size)
|
void VCommonSettings::SetPatternLabelFontSize(int size)
|
||||||
{
|
{
|
||||||
size = qBound(minLabelFontSize, size, maxLabelFontSize);
|
size = qBound(minLabelFontSize, size, maxLabelFontSize);
|
||||||
setValue(*settingPatternLabelFontSize, size);
|
setValue(*settingPatternLabelFontSize, size);
|
||||||
|
@ -1212,7 +1248,7 @@ void VCommonSettings::SetLabelFontSize(int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
auto VCommonSettings::GetDefLabelFontSize() -> int
|
auto VCommonSettings::GetDefPatternLabelFontSize() -> int
|
||||||
{
|
{
|
||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,9 +213,13 @@ public:
|
||||||
auto GetLabelFont() const -> QFont;
|
auto GetLabelFont() const -> QFont;
|
||||||
void SetLabelFont(const QFont &f);
|
void SetLabelFont(const QFont &f);
|
||||||
|
|
||||||
auto GetLabelFontSize() const -> int;
|
auto GetPieceLabelFontPointSize() const -> int;
|
||||||
void SetLabelFontSize(int size);
|
void SetPieceLabelFontPointSize(int size);
|
||||||
static auto GetDefLabelFontSize() -> int;
|
static auto MinPieceLabelFontPointSize() -> int;
|
||||||
|
|
||||||
|
auto GetPatternLabelFontSize() const -> int;
|
||||||
|
void SetPatternLabelFontSize(int size);
|
||||||
|
static auto GetDefPatternLabelFontSize() -> int;
|
||||||
|
|
||||||
auto GetHideLabels() const -> bool;
|
auto GetHideLabels() const -> bool;
|
||||||
void SetHideLabels(bool value);
|
void SetHideLabels(bool value);
|
||||||
|
|
|
@ -363,6 +363,11 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece)
|
||||||
uiTabLabels->checkBoxFold->setChecked(ppData.IsOnFold());
|
uiTabLabels->checkBoxFold->setChecked(ppData.IsOnFold());
|
||||||
m_templateLines = ppData.GetLabelTemplate();
|
m_templateLines = ppData.GetLabelTemplate();
|
||||||
|
|
||||||
|
{
|
||||||
|
const int piceFontSizeIndex = uiTabLabels->comboBoxPieceLabelSize->findData(ppData.GetFontSize());
|
||||||
|
uiTabLabels->comboBoxPieceLabelSize->setCurrentIndex(piceFontSizeIndex != -1 ? piceFontSizeIndex : 0);
|
||||||
|
}
|
||||||
|
|
||||||
uiTabLabels->groupBoxDetailLabel->setEnabled(not m_templateLines.isEmpty());
|
uiTabLabels->groupBoxDetailLabel->setEnabled(not m_templateLines.isEmpty());
|
||||||
|
|
||||||
int index = uiTabGrainline->comboBoxArrow->findData(static_cast<int>(piece.GetGrainlineGeometry().GetArrowType()));
|
int index = uiTabGrainline->comboBoxArrow->findData(static_cast<int>(piece.GetGrainlineGeometry().GetArrowType()));
|
||||||
|
@ -390,6 +395,11 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece)
|
||||||
SetPLHeight(patternInfo.GetLabelHeight());
|
SetPLHeight(patternInfo.GetLabelHeight());
|
||||||
SetPLAngle(patternInfo.GetRotation());
|
SetPLAngle(patternInfo.GetRotation());
|
||||||
|
|
||||||
|
{
|
||||||
|
const int patternFontSizeIndex = uiTabLabels->comboBoxPatternLabelSize->findData(patternInfo.GetFontSize());
|
||||||
|
uiTabLabels->comboBoxPatternLabelSize->setCurrentIndex(patternFontSizeIndex != -1 ? patternFontSizeIndex : 0);
|
||||||
|
}
|
||||||
|
|
||||||
const VGrainlineData &grainlineGeometry = piece.GetGrainlineGeometry();
|
const VGrainlineData &grainlineGeometry = piece.GetGrainlineGeometry();
|
||||||
uiTabGrainline->groupBoxGrainline->setChecked(grainlineGeometry.IsVisible());
|
uiTabGrainline->groupBoxGrainline->setChecked(grainlineGeometry.IsVisible());
|
||||||
ChangeCurrentData(uiTabGrainline->comboBoxGrainlineCenterPin, grainlineGeometry.CenterPin());
|
ChangeCurrentData(uiTabGrainline->comboBoxGrainlineCenterPin, grainlineGeometry.CenterPin());
|
||||||
|
@ -2725,6 +2735,7 @@ auto DialogSeamAllowance::CreatePiece() const -> VPiece
|
||||||
piece.GetPieceLabelData().SetLabelTemplate(m_templateLines);
|
piece.GetPieceLabelData().SetLabelTemplate(m_templateLines);
|
||||||
piece.GetPieceLabelData().SetRotation(GetFormulaFromUser(uiTabLabels->lineEditDLAngleFormula));
|
piece.GetPieceLabelData().SetRotation(GetFormulaFromUser(uiTabLabels->lineEditDLAngleFormula));
|
||||||
piece.GetPieceLabelData().SetVisible(uiTabLabels->groupBoxDetailLabel->isChecked());
|
piece.GetPieceLabelData().SetVisible(uiTabLabels->groupBoxDetailLabel->isChecked());
|
||||||
|
piece.GetPieceLabelData().SetFontSize(uiTabLabels->comboBoxPieceLabelSize->currentData().toInt());
|
||||||
|
|
||||||
if (not flagDPin)
|
if (not flagDPin)
|
||||||
{
|
{
|
||||||
|
@ -2745,6 +2756,7 @@ auto DialogSeamAllowance::CreatePiece() const -> VPiece
|
||||||
|
|
||||||
piece.GetPatternLabelData().SetVisible(uiTabLabels->groupBoxPatternLabel->isChecked());
|
piece.GetPatternLabelData().SetVisible(uiTabLabels->groupBoxPatternLabel->isChecked());
|
||||||
piece.GetPatternLabelData().SetRotation(GetFormulaFromUser(uiTabLabels->lineEditPLAngleFormula));
|
piece.GetPatternLabelData().SetRotation(GetFormulaFromUser(uiTabLabels->lineEditPLAngleFormula));
|
||||||
|
piece.GetPatternLabelData().SetFontSize(uiTabLabels->comboBoxPatternLabelSize->currentData().toInt());
|
||||||
|
|
||||||
if (not flagPPin)
|
if (not flagPPin)
|
||||||
{
|
{
|
||||||
|
@ -3387,6 +3399,9 @@ void DialogSeamAllowance::InitPatternPieceDataTab()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogSeamAllowance::InitLabelsTab()
|
void DialogSeamAllowance::InitLabelsTab()
|
||||||
{
|
{
|
||||||
|
InitLabelFontSize(uiTabLabels->comboBoxPatternLabelSize);
|
||||||
|
InitLabelFontSize(uiTabLabels->comboBoxPieceLabelSize);
|
||||||
|
|
||||||
uiTabLabels->lineEditDLWidthFormula->setPlainText(m_defLabelValue);
|
uiTabLabels->lineEditDLWidthFormula->setPlainText(m_defLabelValue);
|
||||||
uiTabLabels->lineEditDLHeightFormula->setPlainText(m_defLabelValue);
|
uiTabLabels->lineEditDLHeightFormula->setPlainText(m_defLabelValue);
|
||||||
uiTabLabels->lineEditPLWidthFormula->setPlainText(m_defLabelValue);
|
uiTabLabels->lineEditPLWidthFormula->setPlainText(m_defLabelValue);
|
||||||
|
@ -3665,6 +3680,23 @@ void DialogSeamAllowance::InitAllPinComboboxes()
|
||||||
InitPinPoint(uiTabLabels->comboBoxPLBottomRightPin);
|
InitPinPoint(uiTabLabels->comboBoxPLBottomRightPin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogSeamAllowance::InitLabelFontSize(QComboBox *box)
|
||||||
|
{
|
||||||
|
SCASSERT(box != nullptr);
|
||||||
|
box->clear();
|
||||||
|
box->addItem(tr("Default"), 0);
|
||||||
|
|
||||||
|
// Get the available font sizes
|
||||||
|
for (auto size : QFontDatabase::standardSizes())
|
||||||
|
{
|
||||||
|
if (size >= VCommonSettings::MinPieceLabelFontPointSize())
|
||||||
|
{
|
||||||
|
box->addItem(QString::number(size), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
auto DialogSeamAllowance::GetFormulaSAWidth() const -> QString
|
auto DialogSeamAllowance::GetFormulaSAWidth() const -> QString
|
||||||
{
|
{
|
||||||
|
|
|
@ -301,6 +301,7 @@ private:
|
||||||
void InitPassmarksTab();
|
void InitPassmarksTab();
|
||||||
void InitPlaceLabelsTab();
|
void InitPlaceLabelsTab();
|
||||||
void InitAllPinComboboxes();
|
void InitAllPinComboboxes();
|
||||||
|
void InitLabelFontSize(QComboBox *box);
|
||||||
|
|
||||||
void SetFormulaSAWidth(const QString &formula);
|
void SetFormulaSAWidth(const QString &formula);
|
||||||
void SetFormulaPassmarkLength(const QString &formula);
|
void SetFormulaPassmarkLength(const QString &formula);
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>628</width>
|
<width>550</width>
|
||||||
<height>516</height>
|
<height>534</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -28,8 +28,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>608</width>
|
<width>530</width>
|
||||||
<height>496</height>
|
<height>514</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
@ -455,7 +455,28 @@
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||||
|
<item>
|
||||||
|
<layout class="QFormLayout" name="formLayout_8">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_19">
|
||||||
|
<property name="text">
|
||||||
|
<string>Font size:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxPieceLabelSize"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_18">
|
<layout class="QHBoxLayout" name="horizontalLayout_18">
|
||||||
<item alignment="Qt::AlignLeft">
|
<item alignment="Qt::AlignLeft">
|
||||||
|
@ -987,7 +1008,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item alignment="Qt::AlignRight">
|
<item>
|
||||||
<widget class="QLabel" name="labelDLAngle">
|
<widget class="QLabel" name="labelDLAngle">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||||
|
@ -1112,7 +1133,28 @@
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_14">
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||||
|
<item>
|
||||||
|
<layout class="QFormLayout" name="formLayout_13">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_20">
|
||||||
|
<property name="text">
|
||||||
|
<string>Font size:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxPatternLabelSize"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_25">
|
<layout class="QHBoxLayout" name="horizontalLayout_25">
|
||||||
<item alignment="Qt::AlignLeft">
|
<item alignment="Qt::AlignLeft">
|
||||||
|
|
|
@ -505,7 +505,8 @@ void VToolSeamAllowance::AddPatternPieceData(VAbstractPattern *doc, QDomElement
|
||||||
doc->SetAttribute(domData, AttrMy, data.GetPos().y());
|
doc->SetAttribute(domData, AttrMy, data.GetPos().y());
|
||||||
doc->SetAttribute(domData, AttrWidth, data.GetLabelWidth());
|
doc->SetAttribute(domData, AttrWidth, data.GetLabelWidth());
|
||||||
doc->SetAttribute(domData, AttrHeight, data.GetLabelHeight());
|
doc->SetAttribute(domData, AttrHeight, data.GetLabelHeight());
|
||||||
doc->SetAttribute(domData, AttrFont, data.GetFontSize());
|
doc->SetAttributeOrRemoveIf<int>(domData, AttrFont, data.GetFontSize(),
|
||||||
|
[](int size) noexcept { return size == 0; });
|
||||||
doc->SetAttribute(domData, VAbstractPattern::AttrRotation, data.GetRotation());
|
doc->SetAttribute(domData, VAbstractPattern::AttrRotation, data.GetRotation());
|
||||||
doc->SetAttributeOrRemoveIf<quint32>(domData, AttrCenterPin, data.CenterPin(),
|
doc->SetAttributeOrRemoveIf<quint32>(domData, AttrCenterPin, data.CenterPin(),
|
||||||
[](quint32 pin) noexcept { return pin == NULL_ID; });
|
[](quint32 pin) noexcept { return pin == NULL_ID; });
|
||||||
|
@ -528,7 +529,8 @@ void VToolSeamAllowance::AddPatternInfo(VAbstractPattern *doc, QDomElement &domE
|
||||||
doc->SetAttribute(domData, AttrMy, geom.GetPos().y());
|
doc->SetAttribute(domData, AttrMy, geom.GetPos().y());
|
||||||
doc->SetAttribute(domData, AttrWidth, geom.GetLabelWidth());
|
doc->SetAttribute(domData, AttrWidth, geom.GetLabelWidth());
|
||||||
doc->SetAttribute(domData, AttrHeight, geom.GetLabelHeight());
|
doc->SetAttribute(domData, AttrHeight, geom.GetLabelHeight());
|
||||||
doc->SetAttribute(domData, AttrFont, geom.GetFontSize());
|
doc->SetAttributeOrRemoveIf<int>(domData, AttrFont, geom.GetFontSize(),
|
||||||
|
[](int size) noexcept { return size == 0; });
|
||||||
doc->SetAttribute(domData, VAbstractPattern::AttrRotation, geom.GetRotation());
|
doc->SetAttribute(domData, VAbstractPattern::AttrRotation, geom.GetRotation());
|
||||||
doc->SetAttributeOrRemoveIf<quint32>(domData, AttrCenterPin, geom.CenterPin(),
|
doc->SetAttributeOrRemoveIf<quint32>(domData, AttrCenterPin, geom.CenterPin(),
|
||||||
[](quint32 pin) noexcept { return pin <= NULL_ID; });
|
[](quint32 pin) noexcept { return pin <= NULL_ID; });
|
||||||
|
@ -767,6 +769,7 @@ void VToolSeamAllowance::UpdateDetailLabel()
|
||||||
|
|
||||||
if (PrepareLabelData(labelData, pins, m_dataLabel, pos, labelAngle))
|
if (PrepareLabelData(labelData, pins, m_dataLabel, pos, labelAngle))
|
||||||
{
|
{
|
||||||
|
m_dataLabel->SetPieceName(detail.GetName());
|
||||||
m_dataLabel->UpdateData(detail.GetName(), labelData, getData());
|
m_dataLabel->UpdateData(detail.GetName(), labelData, getData());
|
||||||
UpdateLabelItem(m_dataLabel, pos, labelAngle);
|
UpdateLabelItem(m_dataLabel, pos, labelAngle);
|
||||||
}
|
}
|
||||||
|
@ -794,6 +797,7 @@ void VToolSeamAllowance::UpdatePatternInfo()
|
||||||
|
|
||||||
if (PrepareLabelData(geom, pins, m_patternInfo, pos, labelAngle))
|
if (PrepareLabelData(geom, pins, m_patternInfo, pos, labelAngle))
|
||||||
{
|
{
|
||||||
|
m_patternInfo->SetPieceName(detail.GetName());
|
||||||
m_patternInfo->UpdateData(doc, getData());
|
m_patternInfo->UpdateData(doc, getData());
|
||||||
UpdateLabelItem(m_patternInfo, pos, labelAngle);
|
UpdateLabelItem(m_patternInfo, pos, labelAngle);
|
||||||
}
|
}
|
||||||
|
@ -872,7 +876,7 @@ void VToolSeamAllowance::SaveMoveDetail(const QPointF &ptPos)
|
||||||
/**
|
/**
|
||||||
* @brief SaveResizeDetail saves the resize detail label operation to the undo stack
|
* @brief SaveResizeDetail saves the resize detail label operation to the undo stack
|
||||||
*/
|
*/
|
||||||
void VToolSeamAllowance::SaveResizeDetail(qreal dLabelW, int iFontSize)
|
void VToolSeamAllowance::SaveResizeDetail(qreal dLabelW)
|
||||||
{
|
{
|
||||||
VPiece oldDet = VAbstractTool::data.GetPiece(m_id);
|
VPiece oldDet = VAbstractTool::data.GetPiece(m_id);
|
||||||
VPiece newDet = oldDet;
|
VPiece newDet = oldDet;
|
||||||
|
@ -881,7 +885,6 @@ void VToolSeamAllowance::SaveResizeDetail(qreal dLabelW, int iFontSize)
|
||||||
newDet.GetPieceLabelData().SetLabelWidth(QString().setNum(dLabelW));
|
newDet.GetPieceLabelData().SetLabelWidth(QString().setNum(dLabelW));
|
||||||
const qreal height = FromPixel(m_dataLabel->boundingRect().height(), *VDataTool::data.GetPatternUnit());
|
const qreal height = FromPixel(m_dataLabel->boundingRect().height(), *VDataTool::data.GetPatternUnit());
|
||||||
newDet.GetPieceLabelData().SetLabelHeight(QString().setNum(height));
|
newDet.GetPieceLabelData().SetLabelHeight(QString().setNum(height));
|
||||||
newDet.GetPieceLabelData().SetFontSize(iFontSize);
|
|
||||||
|
|
||||||
auto *resizeCommand = new SavePieceOptions(oldDet, newDet, doc, m_id);
|
auto *resizeCommand = new SavePieceOptions(oldDet, newDet, doc, m_id);
|
||||||
resizeCommand->setText(tr("resize pattern piece label"));
|
resizeCommand->setText(tr("resize pattern piece label"));
|
||||||
|
@ -928,7 +931,7 @@ void VToolSeamAllowance::SaveMovePattern(const QPointF &ptPos)
|
||||||
/**
|
/**
|
||||||
* @brief: SaveResizePattern saves the pattern label width and font size
|
* @brief: SaveResizePattern saves the pattern label width and font size
|
||||||
*/
|
*/
|
||||||
void VToolSeamAllowance::SaveResizePattern(qreal dLabelW, int iFontSize)
|
void VToolSeamAllowance::SaveResizePattern(qreal dLabelW)
|
||||||
{
|
{
|
||||||
VPiece oldDet = VAbstractTool::data.GetPiece(m_id);
|
VPiece oldDet = VAbstractTool::data.GetPiece(m_id);
|
||||||
VPiece newDet = oldDet;
|
VPiece newDet = oldDet;
|
||||||
|
@ -937,7 +940,6 @@ void VToolSeamAllowance::SaveResizePattern(qreal dLabelW, int iFontSize)
|
||||||
newDet.GetPatternLabelData().SetLabelWidth(QString().setNum(dLabelW));
|
newDet.GetPatternLabelData().SetLabelWidth(QString().setNum(dLabelW));
|
||||||
qreal height = FromPixel(m_patternInfo->boundingRect().height(), *VDataTool::data.GetPatternUnit());
|
qreal height = FromPixel(m_patternInfo->boundingRect().height(), *VDataTool::data.GetPatternUnit());
|
||||||
newDet.GetPatternLabelData().SetLabelHeight(QString().setNum(height));
|
newDet.GetPatternLabelData().SetLabelHeight(QString().setNum(height));
|
||||||
newDet.GetPatternLabelData().SetFontSize(iFontSize);
|
|
||||||
|
|
||||||
auto *resizeCommand = new SavePieceOptions(oldDet, newDet, doc, m_id);
|
auto *resizeCommand = new SavePieceOptions(oldDet, newDet, doc, m_id);
|
||||||
resizeCommand->setText(tr("resize pattern info label"));
|
resizeCommand->setText(tr("resize pattern info label"));
|
||||||
|
@ -1372,8 +1374,8 @@ VToolSeamAllowance::VToolSeamAllowance(const VToolSeamAllowanceInitData &initDat
|
||||||
m_sceneDetails(initData.scene),
|
m_sceneDetails(initData.scene),
|
||||||
m_drawName(initData.drawName),
|
m_drawName(initData.drawName),
|
||||||
m_seamAllowance(new VNoBrushScalePathItem(this)),
|
m_seamAllowance(new VNoBrushScalePathItem(this)),
|
||||||
m_dataLabel(new VTextGraphicsItem(this)),
|
m_dataLabel(new VTextGraphicsItem(VTextGraphicsItem::ItemType::PieceLabel, this)),
|
||||||
m_patternInfo(new VTextGraphicsItem(this)),
|
m_patternInfo(new VTextGraphicsItem(VTextGraphicsItem::ItemType::PatternLabel, this)),
|
||||||
m_grainLine(new VGrainlineItem(this)),
|
m_grainLine(new VGrainlineItem(this)),
|
||||||
m_passmarks(new QGraphicsPathItem(this)),
|
m_passmarks(new QGraphicsPathItem(this)),
|
||||||
m_placeLabels(new QGraphicsPathItem(this))
|
m_placeLabels(new QGraphicsPathItem(this))
|
||||||
|
@ -2116,10 +2118,12 @@ auto VToolSeamAllowance::PrepareLabelData(const VPatternLabelData &labelData, co
|
||||||
}
|
}
|
||||||
labelItem->SetMoveType(type);
|
labelItem->SetMoveType(type);
|
||||||
|
|
||||||
QFont fnt = VAbstractApplication::VApp()->Settings()->GetLabelFont();
|
VCommonSettings *settings = VAbstractApplication::VApp()->Settings();
|
||||||
|
QFont fnt = settings->GetLabelFont();
|
||||||
{
|
{
|
||||||
const int iFS = labelData.GetFontSize();
|
const int iFS = labelData.GetFontSize();
|
||||||
iFS < MIN_FONT_SIZE ? fnt.setPixelSize(MIN_FONT_SIZE) : fnt.setPixelSize(iFS);
|
iFS < VCommonSettings::MinPieceLabelFontPointSize() ? fnt.setPointSize(settings->GetPieceLabelFontPointSize())
|
||||||
|
: fnt.setPointSize(iFS);
|
||||||
}
|
}
|
||||||
labelItem->SetFont(fnt);
|
labelItem->SetFont(fnt);
|
||||||
labelItem->SetSize(ToPixel(labelWidth, *VDataTool::data.GetPatternUnit()),
|
labelItem->SetSize(ToPixel(labelWidth, *VDataTool::data.GetPatternUnit()),
|
||||||
|
|
|
@ -136,10 +136,10 @@ public slots:
|
||||||
protected slots:
|
protected slots:
|
||||||
void UpdateGrainline();
|
void UpdateGrainline();
|
||||||
void SaveMoveDetail(const QPointF &ptPos);
|
void SaveMoveDetail(const QPointF &ptPos);
|
||||||
void SaveResizeDetail(qreal dLabelW, int iFontSize);
|
void SaveResizeDetail(qreal dLabelW);
|
||||||
void SaveRotationDetail(qreal dRot);
|
void SaveRotationDetail(qreal dRot);
|
||||||
void SaveMovePattern(const QPointF &ptPos);
|
void SaveMovePattern(const QPointF &ptPos);
|
||||||
void SaveResizePattern(qreal dLabelW, int iFontSize);
|
void SaveResizePattern(qreal dLabelW);
|
||||||
void SaveRotationPattern(qreal dRot);
|
void SaveRotationPattern(qreal dRot);
|
||||||
void SaveMoveGrainline(const QPointF &ptPos);
|
void SaveMoveGrainline(const QPointF &ptPos);
|
||||||
void SaveResizeGrainline(qreal dLength);
|
void SaveResizeGrainline(qreal dLength);
|
||||||
|
|
|
@ -92,9 +92,9 @@ void VGraphicsSimpleTextItem::paint(QPainter *painter, const QStyleOptionGraphic
|
||||||
};
|
};
|
||||||
|
|
||||||
QFont font = this->font();
|
QFont font = this->font();
|
||||||
if (font.pointSize() != VAbstractApplication::VApp()->Settings()->GetLabelFontSize())
|
if (font.pointSize() != VAbstractApplication::VApp()->Settings()->GetPatternLabelFontSize())
|
||||||
{
|
{
|
||||||
font.setPointSize(VAbstractApplication::VApp()->Settings()->GetLabelFontSize());
|
font.setPointSize(VAbstractApplication::VApp()->Settings()->GetPatternLabelFontSize());
|
||||||
setFont(font);
|
setFont(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,8 +373,8 @@ void VGraphicsSimpleTextItem::Init()
|
||||||
this->setFlag(QGraphicsItem::ItemIsFocusable, true);// For keyboard input focus
|
this->setFlag(QGraphicsItem::ItemIsFocusable, true);// For keyboard input focus
|
||||||
this->setAcceptHoverEvents(true);
|
this->setAcceptHoverEvents(true);
|
||||||
QFont font = this->font();
|
QFont font = this->font();
|
||||||
font.setPointSize(VAbstractApplication::VApp()->Settings()->GetLabelFontSize());
|
font.setPointSize(VAbstractApplication::VApp()->Settings()->GetPatternLabelFontSize());
|
||||||
setFont(font);
|
setFont(font);
|
||||||
m_oldScale = minVisibleFontSize / VAbstractApplication::VApp()->Settings()->GetLabelFontSize();
|
m_oldScale = minVisibleFontSize / VAbstractApplication::VApp()->Settings()->GetPatternLabelFontSize();
|
||||||
setScale(m_oldScale);
|
setScale(m_oldScale);
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ void VScenePoint::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings->GetLabelFontSize()*scale < minVisibleFontSize || settings->GetHideLabels())
|
if (settings->GetPatternLabelFontSize()*scale < minVisibleFontSize || settings->GetHideLabels())
|
||||||
{
|
{
|
||||||
m_namePoint->setVisible(false);
|
m_namePoint->setVisible(false);
|
||||||
m_lineName->setVisible(false);
|
m_lineName->setVisible(false);
|
||||||
|
|
|
@ -39,9 +39,10 @@
|
||||||
#include <QStyleOptionGraphicsItem>
|
#include <QStyleOptionGraphicsItem>
|
||||||
#include <Qt>
|
#include <Qt>
|
||||||
|
|
||||||
#include "../vmisc/compatibility.h"
|
#include "../ifc/exception/vexception.h"
|
||||||
#include "../vmisc/def.h"
|
#include "../vmisc/def.h"
|
||||||
#include "../vmisc/literals.h"
|
#include "../vmisc/literals.h"
|
||||||
|
#include "../vmisc/vabstractvalapplication.h"
|
||||||
#include "vtextgraphicsitem.h"
|
#include "vtextgraphicsitem.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
@ -116,8 +117,9 @@ auto GetBoundingRect(const QRectF &rectBB, qreal dRot) -> QRectF
|
||||||
* @brief VTextGraphicsItem::VTextGraphicsItem constructor
|
* @brief VTextGraphicsItem::VTextGraphicsItem constructor
|
||||||
* @param pParent pointer to the parent item
|
* @param pParent pointer to the parent item
|
||||||
*/
|
*/
|
||||||
VTextGraphicsItem::VTextGraphicsItem(QGraphicsItem *pParent)
|
VTextGraphicsItem::VTextGraphicsItem(ItemType type, QGraphicsItem *pParent)
|
||||||
: VPieceItem(pParent)
|
: VPieceItem(pParent),
|
||||||
|
m_itemType(type)
|
||||||
{
|
{
|
||||||
m_inactiveZ = 2;
|
m_inactiveZ = 2;
|
||||||
SetSize(minW, minH);
|
SetSize(minW, minH);
|
||||||
|
@ -147,38 +149,9 @@ void VTextGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
|
||||||
Q_UNUSED(option)
|
Q_UNUSED(option)
|
||||||
painter->fillRect(m_rectBoundingBox, QColor(251, 251, 175, 128 /*50% opacity*/));
|
painter->fillRect(m_rectBoundingBox, QColor(251, 251, 175, 128 /*50% opacity*/));
|
||||||
painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
|
painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
|
||||||
|
|
||||||
painter->setPen(Qt::black);
|
painter->setPen(Qt::black);
|
||||||
QFont fnt = m_tm.GetFont();
|
|
||||||
int iW = qFloor(boundingRect().width());
|
|
||||||
// draw text lines
|
|
||||||
int iY = 0;
|
|
||||||
for (int i = 0; i < m_tm.GetSourceLinesCount(); ++i)
|
|
||||||
{
|
|
||||||
const TextLine &tl = m_tm.GetSourceLine(i);
|
|
||||||
|
|
||||||
fnt.setPixelSize(m_tm.GetFont().pixelSize() + tl.m_iFontSize);
|
PaintLabel(painter);
|
||||||
fnt.setBold(tl.m_bold);
|
|
||||||
fnt.setItalic(tl.m_italic);
|
|
||||||
|
|
||||||
QString qsText = tl.m_qsText;
|
|
||||||
QFontMetrics fm(fnt);
|
|
||||||
|
|
||||||
// check if the next line will go out of bounds
|
|
||||||
if (iY + fm.height() > boundingRect().height())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TextWidth(fm, qsText) > iW)
|
|
||||||
{
|
|
||||||
qsText = fm.elidedText(qsText, Qt::ElideMiddle, iW);
|
|
||||||
}
|
|
||||||
|
|
||||||
painter->setFont(fnt);
|
|
||||||
painter->drawText(0, iY, iW, fm.height(), static_cast<int>(tl.m_eAlign), qsText);
|
|
||||||
iY += fm.height() + m_tm.GetSpacing();
|
|
||||||
}
|
|
||||||
|
|
||||||
// now draw the features specific to non-normal modes
|
// now draw the features specific to non-normal modes
|
||||||
if (m_eMode != mNormal)
|
if (m_eMode != mNormal)
|
||||||
|
@ -329,6 +302,12 @@ auto VTextGraphicsItem::GetTextLines() const -> vsizetype
|
||||||
return m_tm.GetSourceLinesCount();
|
return m_tm.GetSourceLinesCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VTextGraphicsItem::SetPieceName(const QString &name)
|
||||||
|
{
|
||||||
|
m_pieceName = name;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief VTextGraphicsItem::GetFontSize returns the currently used text base font size
|
* @brief VTextGraphicsItem::GetFontSize returns the currently used text base font size
|
||||||
|
@ -496,7 +475,7 @@ void VTextGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *pME)
|
||||||
}
|
}
|
||||||
else if (m_moveType & IsResizable)
|
else if (m_moveType & IsResizable)
|
||||||
{
|
{
|
||||||
emit SignalResized(m_rectBoundingBox.width(), m_tm.GetFont().pixelSize());
|
emit SignalResized(m_rectBoundingBox.width());
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -573,7 +552,6 @@ void VTextGraphicsItem::CorrectLabel()
|
||||||
// put the label inside the pattern
|
// put the label inside the pattern
|
||||||
setPos(pos().x() + dX, pos().y() + dY);
|
setPos(pos().x() + dX, pos().y() + dY);
|
||||||
}
|
}
|
||||||
m_tm.FitFontSize(m_rectBoundingBox.width(), m_rectBoundingBox.height());
|
|
||||||
UpdateBox();
|
UpdateBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -724,3 +702,59 @@ void VTextGraphicsItem::RotateLabel(QGraphicsSceneMouseEvent *pME)
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VTextGraphicsItem::PaintLabel(QPainter *painter)
|
||||||
|
{
|
||||||
|
const QRectF boundingRect = this->boundingRect();
|
||||||
|
const int iW = qFloor(boundingRect.width());
|
||||||
|
QFont fnt = m_tm.GetFont();
|
||||||
|
const QVector<TextLine> labelLines = m_tm.GetLabelSourceLines(iW, fnt);
|
||||||
|
|
||||||
|
// draw text lines
|
||||||
|
int iY = 0;
|
||||||
|
for (const auto &tl : labelLines)
|
||||||
|
{
|
||||||
|
fnt.setPointSize(m_tm.GetFont().pointSize() + tl.m_iFontSize);
|
||||||
|
fnt.setBold(tl.m_bold);
|
||||||
|
fnt.setItalic(tl.m_italic);
|
||||||
|
|
||||||
|
QString qsText = tl.m_qsText;
|
||||||
|
QFontMetrics fm(fnt);
|
||||||
|
|
||||||
|
int lineHeight = fm.height();
|
||||||
|
if (iY + fm.height() > boundingRect.height())
|
||||||
|
{
|
||||||
|
lineHeight = qFloor(boundingRect.height()) - iY;
|
||||||
|
}
|
||||||
|
|
||||||
|
painter->setFont(fnt);
|
||||||
|
painter->drawText(0, iY, iW, lineHeight, static_cast<int>(tl.m_eAlign), qsText);
|
||||||
|
|
||||||
|
// check if the next line will go out of bounds
|
||||||
|
if (iY + fm.height() > boundingRect.height())
|
||||||
|
{
|
||||||
|
QString errorMsg;
|
||||||
|
switch (m_itemType)
|
||||||
|
{
|
||||||
|
case PatternLabel:
|
||||||
|
errorMsg = tr("Piece '%1'. Not enough space for pattern info label.").arg(m_pieceName);
|
||||||
|
break;
|
||||||
|
case PieceLabel:
|
||||||
|
errorMsg = tr("Piece '%1'. Not enough space for piece info label.").arg(m_pieceName);
|
||||||
|
break;
|
||||||
|
case Unknown:
|
||||||
|
default:
|
||||||
|
errorMsg = tr("Piece '%1'. Not enough space for label.").arg(m_pieceName);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
VAbstractApplication::VApp()->IsPedantic()
|
||||||
|
? throw VException(errorMsg)
|
||||||
|
: qWarning() << VAbstractValApplication::warningMessageSignature + errorMsg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
iY += fm.height() + m_tm.GetSpacing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -53,7 +53,14 @@ class VTextGraphicsItem final : public VPieceItem
|
||||||
Q_OBJECT // NOLINT
|
Q_OBJECT // NOLINT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit VTextGraphicsItem(QGraphicsItem *pParent = nullptr);
|
enum ItemType
|
||||||
|
{
|
||||||
|
PatternLabel,
|
||||||
|
PieceLabel,
|
||||||
|
Unknown
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit VTextGraphicsItem(ItemType type, QGraphicsItem *pParent = nullptr);
|
||||||
~VTextGraphicsItem() override = default;
|
~VTextGraphicsItem() override = default;
|
||||||
|
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||||
|
@ -72,6 +79,7 @@ public:
|
||||||
void UpdateData(const QString &qsName, const VPieceLabelData &data, const VContainer *pattern);
|
void UpdateData(const QString &qsName, const VPieceLabelData &data, const VContainer *pattern);
|
||||||
void UpdateData(VAbstractPattern *pDoc, const VContainer *pattern);
|
void UpdateData(VAbstractPattern *pDoc, const VContainer *pattern);
|
||||||
auto GetTextLines() const -> vsizetype;
|
auto GetTextLines() const -> vsizetype;
|
||||||
|
void SetPieceName(const QString &name);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QGraphicsSceneMouseEvent *pME) override;
|
void mousePressEvent(QGraphicsSceneMouseEvent *pME) override;
|
||||||
|
@ -84,7 +92,7 @@ protected:
|
||||||
void CorrectLabel();
|
void CorrectLabel();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void SignalResized(qreal iTW, int iFontSize);
|
void SignalResized(qreal iTW);
|
||||||
void SignalRotated(qreal dAng);
|
void SignalRotated(qreal dAng);
|
||||||
void SignalShrink();
|
void SignalShrink();
|
||||||
|
|
||||||
|
@ -97,6 +105,8 @@ private:
|
||||||
double m_dAngle{0};
|
double m_dAngle{0};
|
||||||
QRectF m_rectResize{};
|
QRectF m_rectResize{};
|
||||||
VTextManager m_tm{};
|
VTextManager m_tm{};
|
||||||
|
QString m_pieceName{};
|
||||||
|
ItemType m_itemType{Unknown};
|
||||||
|
|
||||||
void AllUserModifications(const QPointF &pos);
|
void AllUserModifications(const QPointF &pos);
|
||||||
void UserRotateAndMove();
|
void UserRotateAndMove();
|
||||||
|
@ -105,6 +115,8 @@ private:
|
||||||
void MoveLabel(QGraphicsSceneMouseEvent *pME);
|
void MoveLabel(QGraphicsSceneMouseEvent *pME);
|
||||||
void ResizeLabel(QGraphicsSceneMouseEvent *pME);
|
void ResizeLabel(QGraphicsSceneMouseEvent *pME);
|
||||||
void RotateLabel(QGraphicsSceneMouseEvent *pME);
|
void RotateLabel(QGraphicsSceneMouseEvent *pME);
|
||||||
|
|
||||||
|
void PaintLabel(QPainter *painter);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VTEXTGRAPHICSITEM_H
|
#endif // VTEXTGRAPHICSITEM_H
|
||||||
|
|
Loading…
Reference in New Issue
Block a user