From 2dae3816a6c9d21628af4174648ee95dd6114424 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Thu, 19 Oct 2023 17:35:29 +0300 Subject: [PATCH] New feature. Custom measurement name. --- ChangeLog.txt | 1 + src/app/tape/tmainwindow.cpp | 306 +++++++++++++++++- src/app/tape/tmainwindow.h | 15 +- src/app/tape/tmainwindow.ui | 90 +++++- .../dialogs/dialogpatternproperties.cpp | 27 +- src/app/valentina/mainwindow.cpp | 4 +- src/libs/ifc/schema.qrc | 2 + .../schema/individual_measurements/v0.6.0.xsd | 106 ++++++ .../schema/multisize_measurements/v0.6.0.xsd | 159 +++++++++ src/libs/ifc/xml/vvitconverter.cpp | 22 +- src/libs/ifc/xml/vvitconverter.h | 12 +- src/libs/ifc/xml/vvstconverter.cpp | 24 +- src/libs/ifc/xml/vvstconverter.h | 11 +- src/libs/vformat/vmeasurements.cpp | 248 +++++++++----- src/libs/vformat/vmeasurements.h | 64 ++-- src/libs/vmisc/share/resources/icon.qrc | 8 + .../icon/dark/16x16/insert-image.png | Bin 0 -> 405 bytes .../icon/dark/16x16/insert-image@2x.png | Bin 0 -> 605 bytes .../icon/dark/16x16/remove-image.png | Bin 0 -> 528 bytes .../icon/dark/16x16/remove-image@2x.png | Bin 0 -> 994 bytes .../icon/light/16x16/insert-image.png | Bin 0 -> 395 bytes .../icon/light/16x16/insert-image@2x.png | Bin 0 -> 596 bytes .../icon/light/16x16/remove-image.png | Bin 0 -> 529 bytes .../icon/light/16x16/remove-image@2x.png | Bin 0 -> 972 bytes .../resources/icon/svg/dark/insert-image.svg | 44 +++ .../resources/icon/svg/dark/remove-image.svg | 51 +++ .../resources/icon/svg/light/insert-image.svg | 44 +++ .../resources/icon/svg/light/remove-image.svg | 51 +++ src/libs/vmisc/svgfont/vsvgpathtokenizer.cpp | 8 +- src/libs/vmisc/vcommonsettings.cpp | 16 + src/libs/vmisc/vcommonsettings.h | 3 + src/libs/vmisc/vmisc.pri | 6 +- .../vpatterndb/variables/vmeasurement.cpp | 13 + src/libs/vpatterndb/variables/vmeasurement.h | 4 + .../vpatterndb/variables/vmeasurement_p.h | 3 + src/libs/vwidgets/vaspectratiopixmaplabel.cpp | 105 ++++++ src/libs/vwidgets/vaspectratiopixmaplabel.h | 63 ++++ src/libs/vwidgets/vwidgets.qbs | 2 + 38 files changed, 1341 insertions(+), 171 deletions(-) create mode 100644 src/libs/ifc/schema/individual_measurements/v0.6.0.xsd create mode 100644 src/libs/ifc/schema/multisize_measurements/v0.6.0.xsd create mode 100644 src/libs/vmisc/share/resources/icon/dark/16x16/insert-image.png create mode 100644 src/libs/vmisc/share/resources/icon/dark/16x16/insert-image@2x.png create mode 100644 src/libs/vmisc/share/resources/icon/dark/16x16/remove-image.png create mode 100644 src/libs/vmisc/share/resources/icon/dark/16x16/remove-image@2x.png create mode 100644 src/libs/vmisc/share/resources/icon/light/16x16/insert-image.png create mode 100644 src/libs/vmisc/share/resources/icon/light/16x16/insert-image@2x.png create mode 100644 src/libs/vmisc/share/resources/icon/light/16x16/remove-image.png create mode 100644 src/libs/vmisc/share/resources/icon/light/16x16/remove-image@2x.png create mode 100644 src/libs/vmisc/share/resources/icon/svg/dark/insert-image.svg create mode 100644 src/libs/vmisc/share/resources/icon/svg/dark/remove-image.svg create mode 100644 src/libs/vmisc/share/resources/icon/svg/light/insert-image.svg create mode 100644 src/libs/vmisc/share/resources/icon/svg/light/remove-image.svg create mode 100644 src/libs/vwidgets/vaspectratiopixmaplabel.cpp create mode 100644 src/libs/vwidgets/vaspectratiopixmaplabel.h diff --git a/ChangeLog.txt b/ChangeLog.txt index a7c97399e..dcbf19197 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -48,6 +48,7 @@ - Puzzle app. Fix piece position move when update layout data. - Puzzle app. Fix losing selection by piece. - Puzzle app. Fix updating layout when file already opened. +- Tape app. Custom measurement name. # Valentina 0.7.52 September 12, 2022 - Fix crash when default locale is ru. diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp index f49fe12cc..69171de0b 100644 --- a/src/app/tape/tmainwindow.cpp +++ b/src/app/tape/tmainwindow.cpp @@ -28,7 +28,9 @@ #include "tmainwindow.h" #include "../ifc/ifcdef.h" +#include "../ifc/xml/utils.h" #include "../ifc/xml/vpatternconverter.h" +#include "../ifc/xml/vpatternimage.h" #include "../ifc/xml/vvitconverter.h" #include "../ifc/xml/vvstconverter.h" #include "../qmuparser/qmudef.h" @@ -46,6 +48,7 @@ #include "../vpatterndb/variables/vmeasurement.h" #include "../vpatterndb/vcontainer.h" #include "../vtools/dialogs/support/dialogeditwrongformula.h" +#include "../vwidgets/vaspectratiopixmaplabel.h" #include "def.h" #include "dialogs/dialogabouttape.h" #include "dialogs/dialogdimensioncustomnames.h" @@ -78,9 +81,12 @@ #endif #include +#include #include #include #include +#include +#include #include #include #include @@ -269,6 +275,8 @@ TMainWindow::TMainWindow(QWidget *parent) VAbstractApplication::VApp()->Settings()->GetOsSeparator() ? setLocale(QLocale()) : setLocale(QLocale::c()); + ui->labelDiagram->setText(UnknownMeasurementImage()); + ui->lineEditName->setClearButtonEnabled(true); ui->lineEditFullName->setClearButtonEnabled(true); ui->lineEditCustomerName->setClearButtonEnabled(true); @@ -785,6 +793,8 @@ void TMainWindow::changeEvent(QEvent *event) InitMeasurementUnits(); + RetranslateMDiagram(); + if (m_mType == MeasurementsType::Multisize) { ui->labelMType->setText(tr("Multisize measurements")); @@ -1315,7 +1325,7 @@ void TMainWindow::SavePMSystem(int index) //--------------------------------------------------------------------------------------------------------------------- void TMainWindow::Remove() { - ShowMDiagram(QString()); + ShowMDiagram(QSharedPointer()); const int row = ui->tableWidget->currentRow(); if (row == -1) @@ -1524,6 +1534,206 @@ void TMainWindow::Fx() delete dialog; } +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::AddImage() +{ + const int row = ui->tableWidget->currentRow(); + + if (row == -1) + { + ui->toolButtonAddImage->setDisabled(true); + return; + } + + VTapeSettings *settings = MApplication::VApp()->TapeSettings(); + + const QString filePath = + QFileDialog::getOpenFileName(this, tr("Measurement image"), settings->GetPathCustomImage(), + PrepareImageFilters(), nullptr, VAbstractApplication::VApp()->NativeFileDialog()); + + if (!filePath.isEmpty()) + { + if (QFileInfo::exists(filePath)) + { + settings->SetPathCustomImage(QFileInfo(filePath).absolutePath()); + } + + VPatternImage image = VPatternImage::FromFile(filePath); + + if (not image.IsValid()) + { + qCritical() << tr("Invalid image. Error: %1").arg(image.ErrorString()); + return; + } + + const QTableWidgetItem *nameField = ui->tableWidget->item(ui->tableWidget->currentRow(), ColumnName); + m_m->SetMImage(nameField->data(Qt::UserRole).toString(), image); + + MeasurementsWereSaved(false); + + RefreshData(); + m_search->RefreshList(ui->lineEditFind->text()); + + ui->tableWidget->blockSignals(true); + ui->tableWidget->selectRow(row); + ui->tableWidget->blockSignals(false); + + ShowNewMData(false); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::RemoveImage() +{ + const int row = ui->tableWidget->currentRow(); + + if (row == -1) + { + ui->toolButtonRemoveImage->setDisabled(true); + return; + } + + const QTableWidgetItem *nameField = ui->tableWidget->item(ui->tableWidget->currentRow(), ColumnName); + m_m->SetMImage(nameField->data(Qt::UserRole).toString(), VPatternImage()); + + MeasurementsWereSaved(false); + + RefreshData(); + m_search->RefreshList(ui->lineEditFind->text()); + + ui->tableWidget->blockSignals(true); + ui->tableWidget->selectRow(row); + ui->tableWidget->blockSignals(false); + + ShowNewMData(false); +} + +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::SaveImage() +{ + const int row = ui->tableWidget->currentRow(); + + if (row == -1) + { + ui->toolButtonSaveImage->setDisabled(true); + return; + } + + const QTableWidgetItem *nameField = ui->tableWidget->item(ui->tableWidget->currentRow(), ColumnName); // name + SCASSERT(nameField != nullptr) + QSharedPointer meash; + + try + { + // Translate to internal look. + meash = m_data->GetVariable(nameField->data(Qt::UserRole).toString()); + } + catch (const VExceptionBadId &e) + { + Q_UNUSED(e) + qCritical() << "Unable to get measurement"; + return; + } + + const VPatternImage image = meash->GetImage(); + + if (not image.IsValid()) + { + qCritical() << tr("Unable to save image. Error: %1").arg(image.ErrorString()); + return; + } + + VTapeSettings *settings = MApplication::VApp()->TapeSettings(); + + QMimeType mime = image.MimeTypeFromData(); + QString path = settings->GetPathCustomImage() + QDir::separator() + tr("untitled"); + + QStringList suffixes = mime.suffixes(); + if (not suffixes.isEmpty()) + { + path += '.'_L1 + suffixes.at(0); + } + + QString filter = mime.filterString(); + QString filename = QFileDialog::getSaveFileName(this, tr("Save Image"), path, filter, nullptr, + VAbstractApplication::VApp()->NativeFileDialog()); + if (not filename.isEmpty()) + { + if (QFileInfo::exists(filename)) + { + settings->SetPathCustomImage(QFileInfo(filename).absolutePath()); + } + + QFile file(filename); + if (file.open(QIODevice::WriteOnly)) + { + file.write(QByteArray::fromBase64(image.ContentData())); + } + else + { + qCritical() << tr("Unable to save image. Error: %1").arg(file.errorString()); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::ShowImage() +{ + const int row = ui->tableWidget->currentRow(); + + if (row == -1) + { + ui->toolButtonSaveImage->setDisabled(true); + return; + } + + const QTableWidgetItem *nameField = ui->tableWidget->item(ui->tableWidget->currentRow(), ColumnName); // name + SCASSERT(nameField != nullptr) + QSharedPointer meash; + + try + { + // Translate to internal look. + meash = m_data->GetVariable(nameField->data(Qt::UserRole).toString()); + } + catch (const VExceptionBadId &e) + { + Q_UNUSED(e) + qCritical() << "Unable to get measurement"; + return; + } + + const VPatternImage image = meash->GetImage(); + + if (not image.IsValid()) + { + qCritical() << tr("Unable to show image. Error: %1").arg(image.ErrorString()); + return; + } + + QMimeType mime = image.MimeTypeFromData(); + QString name = QDir::tempPath() + QDir::separator() + QStringLiteral("image.XXXXXX"); + + QStringList suffixes = mime.suffixes(); + if (not suffixes.isEmpty()) + { + name += '.'_L1 + suffixes.at(0); + } + + delete m_tmpImage; + m_tmpImage = new QTemporaryFile(name, this); + if (m_tmpImage->open()) + { + m_tmpImage->write(QByteArray::fromBase64(image.ContentData())); + m_tmpImage->flush(); + QDesktopServices::openUrl(QUrl::fromLocalFile(m_tmpImage->fileName())); + } + else + { + qCritical() << "Unable to open temp file"; + } +} + //--------------------------------------------------------------------------------------------------------------------- void TMainWindow::AddCustom() { @@ -1829,7 +2039,11 @@ void TMainWindow::ShowNewMData(bool fresh) return; } - ShowMDiagram(meash->GetName()); + ShowMDiagram(meash); + + ui->toolButtonAddImage->setEnabled(meash->IsCustom()); + ui->toolButtonRemoveImage->setEnabled(meash->IsCustom() && !meash->GetImage().IsNull()); + ui->toolButtonSaveImage->setEnabled(meash->IsCustom() && !meash->GetImage().IsNull()); ui->labelFullName->setVisible(meash->GetType() == VarType::Measurement); ui->lineEditFullName->setVisible(meash->GetType() == VarType::Measurement); @@ -1963,21 +2177,48 @@ void TMainWindow::ShowNewMData(bool fresh) } //--------------------------------------------------------------------------------------------------------------------- -void TMainWindow::ShowMDiagram(const QString &name) +void TMainWindow::ShowMDiagram(const QSharedPointer &m) { - const VTranslateVars *trv = VAbstractApplication::VApp()->TrVars(); - const QString number = trv->MNumber(name); + ui->labelDiagram->setPixmap(QPixmap()); + ui->labelDiagram->setCursor(QCursor()); + ui->labelDiagram->disconnect(); - if (number.isEmpty()) + if (m.isNull()) { - ui->labelDiagram->setText(tr("

?

" - "

Unknown measurement

")); + ui->labelDiagram->setText(UnknownMeasurementImage()); + return; + } + + if (m->IsCustom()) + { + VPatternImage image = m->GetImage(); + if (image.IsValid()) + { + ui->labelDiagram->setCursor(Qt::PointingHandCursor); + ui->labelDiagram->setPixmap(image.GetPixmap()); + connect(ui->labelDiagram, &VAspectRatioPixmapLabel::clicked, this, &TMainWindow::ShowImage, + Qt::UniqueConnection); + } + else + { + ui->labelDiagram->setText(UnknownMeasurementImage()); + } } else { - ui->labelDiagram->setText(u"

%1

" - u"

%2. %3

"_s.arg( - DialogMDataBase::ImgTag(number), number, trv->GuiText(name))); + const VTranslateVars *trv = VAbstractApplication::VApp()->TrVars(); + const QString number = trv->MNumber(m->GetName()); + + if (number.isEmpty()) + { + ui->labelDiagram->setText(UnknownMeasurementImage()); + } + else + { + ui->labelDiagram->setText(u"

%1

" + u"

%2. %3

"_s.arg( + DialogMDataBase::ImgTag(number), number, trv->GuiText(m->GetName()))); + } } } @@ -2861,6 +3102,14 @@ void TMainWindow::InitWindow() connect(ui->toolButtonDown, &QToolButton::clicked, this, &TMainWindow::MoveDown); connect(ui->toolButtonBottom, &QToolButton::clicked, this, &TMainWindow::MoveBottom); + ui->toolButtonAddImage->setDisabled(true); + ui->toolButtonRemoveImage->setDisabled(true); + ui->toolButtonSaveImage->setDisabled(true); + + connect(ui->toolButtonAddImage, &QToolButton::clicked, this, &TMainWindow::AddImage); + connect(ui->toolButtonRemoveImage, &QToolButton::clicked, this, &TMainWindow::RemoveImage); + connect(ui->toolButtonSaveImage, &QToolButton::clicked, this, &TMainWindow::SaveImage); + connect(ui->lineEditName, &QLineEdit::textEdited, this, &TMainWindow::SaveMName); connect(ui->plainTextEditDescription, &QPlainTextEdit::textChanged, this, &TMainWindow::SaveMDescription); connect(ui->lineEditFullName, &QLineEdit::textEdited, this, &TMainWindow::SaveMFullName); @@ -4408,12 +4657,47 @@ void TMainWindow::InitIcons() { QString iconResource = QStringLiteral("icon"); ui->toolButtonExpr->setIcon(VTheme::GetIconResource(iconResource, QStringLiteral("24x24/fx.png"))); + ui->toolButtonAddImage->setIcon(VTheme::GetIconResource(iconResource, QStringLiteral("16x16/insert-image.png"))); + ui->toolButtonRemoveImage->setIcon(VTheme::GetIconResource(iconResource, QStringLiteral("16x16/remove-image.png"))); QString tapeIconResource = QStringLiteral("tapeicon"); ui->actionMeasurementDiagram->setIcon( VTheme::GetIconResource(tapeIconResource, QStringLiteral("24x24/mannequin.png"))); } +//--------------------------------------------------------------------------------------------------------------------- +auto TMainWindow::UnknownMeasurementImage() -> QString +{ + return u"

?

" + u"

%1

"_s.arg(tr("Unknown measurement")); +} + +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::RetranslateMDiagram() +{ + if (ui->tableWidget->rowCount() <= 0 || ui->tableWidget->currentRow() == -1) + { + return; + } + + const QTableWidgetItem *nameField = ui->tableWidget->item(ui->tableWidget->currentRow(), ColumnName); // name + SCASSERT(nameField != nullptr) + QSharedPointer meash; + + try + { + // Translate to internal look. + meash = m_data->GetVariable(nameField->data(Qt::UserRole).toString()); + } + catch (const VExceptionBadId &e) + { + Q_UNUSED(e) + return; + } + + ShowMDiagram(meash); +} + //--------------------------------------------------------------------------------------------------------------------- void TMainWindow::SetDecimals() { diff --git a/src/app/tape/tmainwindow.h b/src/app/tape/tmainwindow.h index 42f5693c8..9b46e986b 100644 --- a/src/app/tape/tmainwindow.h +++ b/src/app/tape/tmainwindow.h @@ -29,7 +29,9 @@ #ifndef TMAINWINDOW_H #define TMAINWINDOW_H +#include #include +#include #include "../vformat/vmeasurements.h" #include "../vmisc/def.h" @@ -108,6 +110,11 @@ private slots: void MoveBottom(); void Fx(); + void AddImage(); + void RemoveImage(); + void SaveImage(); + void ShowImage(); + void AddCustom(); void AddKnown(); void AddSeparator(); @@ -179,6 +186,8 @@ private: QVector m_hackedWidgets{}; + QPointer m_tmpImage{}; + struct MultisizeMeasurement { MultisizeMeasurement() = default; @@ -235,7 +244,7 @@ private: static auto ClearCustomName(const QString &name) -> QString; auto EvalFormula(const QString &formula, bool fromUser, VContainer *data, QLabel *label, bool specialUnits) -> bool; - void ShowMDiagram(const QString &name); + void ShowMDiagram(const QSharedPointer &m); auto Open(const QString &pathTo, const QString &filter) -> QString; void UpdatePadlock(bool ro); @@ -278,6 +287,10 @@ private: auto OrderedMeasurments() const -> QMap>; void InitIcons(); + + static auto UnknownMeasurementImage() -> QString; + + void RetranslateMDiagram(); }; #endif // TMAINWINDOW_H diff --git a/src/app/tape/tmainwindow.ui b/src/app/tape/tmainwindow.ui index c1d8773b4..6facc914c 100644 --- a/src/app/tape/tmainwindow.ui +++ b/src/app/tape/tmainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 1463 + 1102 899 @@ -1142,7 +1142,7 @@ 0 0 - 1463 + 1102 22 @@ -1258,12 +1258,6 @@ 0 - - QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable - - - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea - Measurement diagram @@ -1278,8 +1272,75 @@ - - + + + + + + false + + + Add image + + + ... + + + + :/icon/light/16x16/insert-image.png:/icon/light/16x16/insert-image.png + + + + + + + false + + + Remove image + + + ... + + + + :/icon/light/16x16/remove-image.png:/icon/light/16x16/remove-image.png + + + + + + + false + + + Save image + + + ... + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 @@ -1287,7 +1348,7 @@ - <html><head/><body><p><span style=" font-size:340pt;">?</span></p><p align=\"center\">Unknown measurement</p></body></html> + <html><head/><body><p><span style=" font-size:340pt;">?</span></p><p align=\"center\">Unknown measurement</p></body></html> false @@ -1657,6 +1718,11 @@ QPlainTextEdit
../vwidgets/vplaintextedit.h
+ + VAspectRatioPixmapLabel + QLabel +
../vwidgets/vaspectratiopixmaplabel.h
+
@@ -1665,7 +1731,7 @@ actionMeasurementDiagram - toggled(bool) + triggered(bool) dockWidgetDiagram setVisible(bool) diff --git a/src/app/valentina/dialogs/dialogpatternproperties.cpp b/src/app/valentina/dialogs/dialogpatternproperties.cpp index fdeaa028f..1690adcb7 100644 --- a/src/app/valentina/dialogs/dialogpatternproperties.cpp +++ b/src/app/valentina/dialogs/dialogpatternproperties.cpp @@ -43,6 +43,7 @@ #include #include "../core/vapplication.h" +#include "../vmisc/vabstractvalapplication.h" #include "../vmisc/vvalentinasettings.h" #include "../vpatterndb/vcontainer.h" #include "../xml/vpattern.h" @@ -418,11 +419,18 @@ void DialogPatternProperties::InitImage() //--------------------------------------------------------------------------------------------------------------------- void DialogPatternProperties::ChangeImage() { + VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings(); + const QString fileName = - QFileDialog::getOpenFileName(this, tr("Image for pattern"), QString(), PrepareImageFilters(), nullptr, - VAbstractApplication::VApp()->NativeFileDialog()); + QFileDialog::getOpenFileName(this, tr("Image for pattern"), settings->GetPathCustomImage(), + PrepareImageFilters(), nullptr, VAbstractApplication::VApp()->NativeFileDialog()); if (not fileName.isEmpty()) { + if (QFileInfo::exists(fileName)) + { + settings->SetPathCustomImage(QFileInfo(fileName).absolutePath()); + } + VPatternImage image = VPatternImage::FromFile(fileName); if (not image.IsValid()) @@ -454,13 +462,15 @@ void DialogPatternProperties::SaveImage() return; } + VValentinaSettings *settings = VAbstractValApplication::VApp()->ValentinaSettings(); + QMimeType mime = image.MimeTypeFromData(); - QString path = QDir::homePath() + QDir::separator() + tr("untitled"); + QString path = settings->GetPathCustomImage() + QDir::separator() + tr("untitled"); QStringList suffixes = mime.suffixes(); if (not suffixes.isEmpty()) { - path += '.' + suffixes.at(0); + path += '.'_L1 + suffixes.at(0); } QString filter = mime.filterString(); @@ -468,6 +478,11 @@ void DialogPatternProperties::SaveImage() VAbstractApplication::VApp()->NativeFileDialog()); if (not filename.isEmpty()) { + if (QFileInfo::exists(filename)) + { + settings->SetPathCustomImage(QFileInfo(filename).absolutePath()); + } + QFile file(filename); if (file.open(QIODevice::WriteOnly)) { @@ -497,7 +512,7 @@ void DialogPatternProperties::ShowImage() QStringList suffixes = mime.suffixes(); if (not suffixes.isEmpty()) { - name += '.' + suffixes.at(0); + name += '.'_L1 + suffixes.at(0); } delete m_tmpImage; @@ -510,7 +525,7 @@ void DialogPatternProperties::ShowImage() } else { - qCritical() << tr("Unable to open temp file"); + qCritical() << "Unable to open temp file"; } } diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index 1f4fb2388..fccc55dc1 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -5011,13 +5011,13 @@ void MainWindow::SaveBackgroundImage(const QUuid &id) QStringList suffixes = mime.suffixes(); if (not suffixes.isEmpty()) { - path += '.' + suffixes.at(0); + path += '.'_L1 + suffixes.at(0); } filters.append(mime.filterString()); } - filters.append(tr("All files") + QStringLiteral(" (*.*)")); + filters.append(tr("All files") + " (*.*)"_L1); QString filter = filters.join(QStringLiteral(";;")); diff --git a/src/libs/ifc/schema.qrc b/src/libs/ifc/schema.qrc index 9dfb0bba8..27c49af91 100644 --- a/src/libs/ifc/schema.qrc +++ b/src/libs/ifc/schema.qrc @@ -80,6 +80,7 @@ schema/multisize_measurements/v0.5.2.xsd schema/multisize_measurements/v0.5.3.xsd schema/multisize_measurements/v0.5.4.xsd + schema/multisize_measurements/v0.6.0.xsd schema/individual_measurements/v0.2.0.xsd schema/individual_measurements/v0.3.0.xsd schema/individual_measurements/v0.3.1.xsd @@ -89,6 +90,7 @@ schema/individual_measurements/v0.5.0.xsd schema/individual_measurements/v0.5.1.xsd schema/individual_measurements/v0.5.2.xsd + schema/individual_measurements/v0.6.0.xsd schema/label_template/v1.0.0.xsd schema/watermark/v1.0.0.xsd schema/watermark/v1.1.0.xsd diff --git a/src/libs/ifc/schema/individual_measurements/v0.6.0.xsd b/src/libs/ifc/schema/individual_measurements/v0.6.0.xsd new file mode 100644 index 000000000..db7663f2b --- /dev/null +++ b/src/libs/ifc/schema/individual_measurements/v0.6.0.xsd @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/ifc/schema/multisize_measurements/v0.6.0.xsd b/src/libs/ifc/schema/multisize_measurements/v0.6.0.xsd new file mode 100644 index 000000000..f3e02e9e0 --- /dev/null +++ b/src/libs/ifc/schema/multisize_measurements/v0.6.0.xsd @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/ifc/xml/vvitconverter.cpp b/src/libs/ifc/xml/vvitconverter.cpp index dee9de3de..53038bed7 100644 --- a/src/libs/ifc/xml/vvitconverter.cpp +++ b/src/libs/ifc/xml/vvitconverter.cpp @@ -55,8 +55,8 @@ using namespace Qt::Literals::StringLiterals; */ const QString VVITConverter::MeasurementMinVerStr = QStringLiteral("0.2.0"); -const QString VVITConverter::MeasurementMaxVerStr = QStringLiteral("0.5.2"); -const QString VVITConverter::CurrentSchema = QStringLiteral("://schema/individual_measurements/v0.5.2.xsd"); +const QString VVITConverter::MeasurementMaxVerStr = QStringLiteral("0.6.0"); +const QString VVITConverter::CurrentSchema = QStringLiteral("://schema/individual_measurements/v0.6.0.xsd"); // VVITConverter::MeasurementMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! // VVITConverter::MeasurementMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! @@ -96,7 +96,8 @@ auto VVITConverter::XSDSchemas() -> QHash std::make_pair(FormatVersion(0, 4, 0), QStringLiteral("://schema/individual_measurements/v0.4.0.xsd")), std::make_pair(FormatVersion(0, 5, 0), QStringLiteral("://schema/individual_measurements/v0.5.0.xsd")), std::make_pair(FormatVersion(0, 5, 1), QStringLiteral("://schema/individual_measurements/v0.5.1.xsd")), - std::make_pair(FormatVersion(0, 5, 2), CurrentSchema), + std::make_pair(FormatVersion(0, 5, 2), QStringLiteral("://schema/individual_measurements/v0.5.2.xsd")), + std::make_pair(FormatVersion(0, 6, 0), CurrentSchema), }; return schemas; @@ -125,10 +126,11 @@ void VVITConverter::ApplyPatches() case (FormatVersion(0, 4, 0)): case (FormatVersion(0, 5, 0)): case (FormatVersion(0, 5, 1)): - ToV0_5_2(); + case (FormatVersion(0, 5, 2)): + ToV0_6_0(); ValidateXML(CurrentSchema); Q_FALLTHROUGH(); - case (FormatVersion(0, 5, 2)): + case (FormatVersion(0, 6, 0)): break; default: InvalidVersion(m_ver); @@ -147,7 +149,7 @@ void VVITConverter::DowngradeToCurrentMaxVersion() auto VVITConverter::IsReadOnly() const -> bool { // Check if attribute read-only was not changed in file format - Q_STATIC_ASSERT_X(VVITConverter::MeasurementMaxVer == FormatVersion(0, 5, 2), "Check attribute read-only."); + Q_STATIC_ASSERT_X(VVITConverter::MeasurementMaxVer == FormatVersion(0, 6, 0), "Check attribute read-only."); // Possibly in future attribute read-only will change position etc. // For now position is the same for all supported format versions. @@ -409,11 +411,11 @@ void VVITConverter::ToV0_4_0() } //--------------------------------------------------------------------------------------------------------------------- -void VVITConverter::ToV0_5_2() +void VVITConverter::ToV0_6_0() { - // TODO. Delete if minimal supported version is 0.5.2 - Q_STATIC_ASSERT_X(VVITConverter::MeasurementMinVer < FormatVersion(0, 5, 2), "Time to refactor the code."); + // TODO. Delete if minimal supported version is 0.6.0 + Q_STATIC_ASSERT_X(VVITConverter::MeasurementMinVer < FormatVersion(0, 6, 0), "Time to refactor the code."); - SetVersion(QStringLiteral("0.5.2")); + SetVersion(QStringLiteral("0.6.0")); Save(); } diff --git a/src/libs/ifc/xml/vvitconverter.h b/src/libs/ifc/xml/vvitconverter.h index 6e3aae22e..2878d201e 100644 --- a/src/libs/ifc/xml/vvitconverter.h +++ b/src/libs/ifc/xml/vvitconverter.h @@ -29,19 +29,19 @@ #ifndef VVITCONVERTER_H #define VVITCONVERTER_H - #include #include #include -#include "vabstractmconverter.h" #include "../vmisc/projectversion.h" +#include "vabstractmconverter.h" class QDomElement; class VVITConverter final : public VAbstractMConverter { Q_DECLARE_TR_FUNCTIONS(VVITConverter) // NOLINT + public: explicit VVITConverter(const QString &fileName); virtual ~VVITConverter() = default; @@ -49,9 +49,9 @@ public: static const QString MeasurementMaxVerStr; static const QString CurrentSchema; static Q_DECL_CONSTEXPR const unsigned MeasurementMinVer = FormatVersion(0, 2, 0); - static Q_DECL_CONSTEXPR const unsigned MeasurementMaxVer = FormatVersion(0, 5, 2); + static Q_DECL_CONSTEXPR const unsigned MeasurementMaxVer = FormatVersion(0, 6, 0); - static auto XSDSchemas() -> QHash ; + static auto XSDSchemas() -> QHash; protected: virtual auto MinVer() const -> unsigned override; @@ -64,7 +64,7 @@ protected: virtual void DowngradeToCurrentMaxVersion() override; virtual auto IsReadOnly() const -> bool override; - auto Schemas() const -> QHash override; + auto Schemas() const -> QHash override; private: Q_DISABLE_COPY_MOVE(VVITConverter) // NOLINT @@ -84,7 +84,7 @@ private: void ToV0_3_2(); void ToV0_3_3(); void ToV0_4_0(); - void ToV0_5_2(); + void ToV0_6_0(); }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/ifc/xml/vvstconverter.cpp b/src/libs/ifc/xml/vvstconverter.cpp index 92da2b3f3..79d1b2868 100644 --- a/src/libs/ifc/xml/vvstconverter.cpp +++ b/src/libs/ifc/xml/vvstconverter.cpp @@ -56,8 +56,8 @@ using namespace Qt::Literals::StringLiterals; */ const QString VVSTConverter::MeasurementMinVerStr = QStringLiteral("0.3.0"); -const QString VVSTConverter::MeasurementMaxVerStr = QStringLiteral("0.5.4"); -const QString VVSTConverter::CurrentSchema = QStringLiteral("://schema/multisize_measurements/v0.5.4.xsd"); +const QString VVSTConverter::MeasurementMaxVerStr = QStringLiteral("0.6.0"); +const QString VVSTConverter::CurrentSchema = QStringLiteral("://schema/multisize_measurements/v0.6.0.xsd"); // VVSTConverter::MeasurementMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! // VVSTConverter::MeasurementMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! @@ -96,7 +96,8 @@ auto VVSTConverter::XSDSchemas() -> QHash std::make_pair(FormatVersion(0, 5, 1), QStringLiteral("://schema/multisize_measurements/v0.5.1.xsd")), std::make_pair(FormatVersion(0, 5, 2), QStringLiteral("://schema/multisize_measurements/v0.5.2.xsd")), std::make_pair(FormatVersion(0, 5, 3), QStringLiteral("://schema/multisize_measurements/v0.5.3.xsd")), - std::make_pair(FormatVersion(0, 5, 4), CurrentSchema), + std::make_pair(FormatVersion(0, 5, 4), QStringLiteral("://schema/multisize_measurements/v0.5.4.xsd")), + std::make_pair(FormatVersion(0, 6, 0), CurrentSchema), }; return schemas; @@ -126,9 +127,12 @@ void VVSTConverter::ApplyPatches() case (FormatVersion(0, 5, 2)): case (FormatVersion(0, 5, 3)): ToV0_5_4(); - ValidateXML(CurrentSchema); Q_FALLTHROUGH(); case (FormatVersion(0, 5, 4)): + ToV0_6_0(); + ValidateXML(CurrentSchema); + Q_FALLTHROUGH(); + case (FormatVersion(0, 6, 0)): break; default: InvalidVersion(m_ver); @@ -147,7 +151,7 @@ void VVSTConverter::DowngradeToCurrentMaxVersion() auto VVSTConverter::IsReadOnly() const -> bool { // Check if attribute read-only was not changed in file format - Q_STATIC_ASSERT_X(VVSTConverter::MeasurementMaxVer == FormatVersion(0, 5, 4), "Check attribute read-only."); + Q_STATIC_ASSERT_X(VVSTConverter::MeasurementMaxVer == FormatVersion(0, 6, 0), "Check attribute read-only."); // Possibly in future attribute read-only will change position etc. // For now position is the same for all supported format versions. @@ -493,3 +497,13 @@ void VVSTConverter::ToV0_5_4() ConvertCircumferenceAttreibuteToV0_5_4(); Save(); } + +//--------------------------------------------------------------------------------------------------------------------- +void VVSTConverter::ToV0_6_0() +{ + // TODO. Delete if minimal supported version is 0.6.0 + Q_STATIC_ASSERT_X(VVSTConverter::MeasurementMinVer < FormatVersion(0, 6, 0), "Time to refactor the code."); + + SetVersion(QStringLiteral("0.6.0")); + Save(); +} diff --git a/src/libs/ifc/xml/vvstconverter.h b/src/libs/ifc/xml/vvstconverter.h index 571aacd39..75dddd59f 100644 --- a/src/libs/ifc/xml/vvstconverter.h +++ b/src/libs/ifc/xml/vvstconverter.h @@ -29,19 +29,19 @@ #ifndef VMEASUREMENTCONVERTER_H #define VMEASUREMENTCONVERTER_H - #include #include #include -#include "vabstractmconverter.h" #include "../vmisc/projectversion.h" +#include "vabstractmconverter.h" class QDomElement; class VVSTConverter final : public VAbstractMConverter { Q_DECLARE_TR_FUNCTIONS(VVSTConverter) // NOLINT + public: explicit VVSTConverter(const QString &fileName); virtual ~VVSTConverter() = default; @@ -49,9 +49,9 @@ public: static const QString MeasurementMaxVerStr; static const QString CurrentSchema; static Q_DECL_CONSTEXPR const unsigned MeasurementMinVer = FormatVersion(0, 3, 0); - static Q_DECL_CONSTEXPR const unsigned MeasurementMaxVer = FormatVersion(0, 5, 4); + static Q_DECL_CONSTEXPR const unsigned MeasurementMaxVer = FormatVersion(0, 6, 0); - static auto XSDSchemas() -> QHash ; + static auto XSDSchemas() -> QHash; protected: virtual auto MinVer() const -> unsigned override; @@ -64,7 +64,7 @@ protected: virtual void DowngradeToCurrentMaxVersion() override; virtual auto IsReadOnly() const -> bool override; - auto Schemas() const -> QHash override; + auto Schemas() const -> QHash override; private: Q_DISABLE_COPY_MOVE(VVSTConverter) // NOLINT @@ -88,6 +88,7 @@ private: void ToV0_4_2(); void ToV0_5_0(); void ToV0_5_4(); + void ToV0_6_0(); }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vformat/vmeasurements.cpp b/src/libs/vformat/vmeasurements.cpp index b8029c557..b462d5662 100644 --- a/src/libs/vformat/vmeasurements.cpp +++ b/src/libs/vformat/vmeasurements.cpp @@ -42,6 +42,7 @@ #include "../ifc/exception/vexceptionobjecterror.h" #include "../ifc/ifcdef.h" +#include "../ifc/xml/vpatternimage.h" #include "../ifc/xml/vvitconverter.h" #include "../ifc/xml/vvstconverter.h" #include "../qmuparser/qmuparsererror.h" @@ -80,6 +81,7 @@ const QString VMeasurements::TagCorrections = QStringLiteral("corrections"); const QString VMeasurements::TagCorrection = QStringLiteral("correction"); const QString VMeasurements::TagLabels = QStringLiteral("labels"); const QString VMeasurements::TagLabel = QStringLiteral("label"); +const QString VMeasurements::TagImage = QStringLiteral("image"); const QString VMeasurements::AttrBase = QStringLiteral("base"); const QString VMeasurements::AttrValue = QStringLiteral("value"); @@ -101,6 +103,7 @@ const QString VMeasurements::AttrFullCircumference = QStringLiteral("fullCircumf const QString VMeasurements::AttrLabel = QStringLiteral("label"); const QString VMeasurements::AttrDimension = QStringLiteral("dimension"); const QString VMeasurements::AttrCustomName = QStringLiteral("customName"); +const QString VMeasurements::AttrContentType = QStringLiteral("contentType"); const QString VMeasurements::GenderMale = QStringLiteral("male"); const QString VMeasurements::GenderFemale = QStringLiteral("female"); @@ -351,88 +354,7 @@ void VMeasurements::ReadMeasurements(qreal baseA, qreal baseB, qreal baseC) cons if (varType != MeasurementType::Separator) { - const QString fullName = GetParametrEmptyString(dom, AttrFullName); - const bool specialUnits = GetParametrBool(dom, AttrSpecialUnits, falseStr); - - if (type == MeasurementsType::Multisize) - { - qreal base = GetParametrDouble(dom, AttrBase, QChar('0')); - qreal shiftA = GetParametrDouble(dom, AttrShiftA, QChar('0')); - qreal shiftB = GetParametrDouble(dom, AttrShiftB, QChar('0')); - qreal shiftC = GetParametrDouble(dom, AttrShiftC, QChar('0')); - QMap corrections = ReadCorrections(dom); - - qreal convertedBaseA = DimensionABase(); - qreal convertedBaseB = DimensionBBase(); - qreal convertedBaseC = DimensionCBase(); - qreal convertedStepA = DimensionAStep(); - qreal convertedStepB = DimensionBStep(); - qreal convertedStepC = DimensionCStep(); - - if (not specialUnits) - { - base = UnitConvertor(base, Units(), *data->GetPatternUnit()); - shiftA = UnitConvertor(shiftA, Units(), *data->GetPatternUnit()); - shiftB = UnitConvertor(shiftB, Units(), *data->GetPatternUnit()); - shiftC = UnitConvertor(shiftC, Units(), *data->GetPatternUnit()); - - QMutableMapIterator iterator(corrections); - while (iterator.hasNext()) - { - iterator.next(); - iterator.setValue(UnitConvertor(iterator.value(), Units(), *data->GetPatternUnit())); - } - - convertedBaseA = UnitConvertor(convertedBaseA, Units(), *data->GetPatternUnit()); - convertedBaseB = UnitConvertor(convertedBaseB, Units(), *data->GetPatternUnit()); - convertedBaseC = UnitConvertor(convertedBaseC, Units(), *data->GetPatternUnit()); - - convertedStepA = UnitConvertor(convertedStepA, Units(), *data->GetPatternUnit()); - convertedStepB = UnitConvertor(convertedStepB, Units(), *data->GetPatternUnit()); - convertedStepC = UnitConvertor(convertedStepC, Units(), *data->GetPatternUnit()); - } - - meash = QSharedPointer::create(static_cast(i), name, convertedBaseA, - convertedBaseB, convertedBaseC, base); - meash->SetBaseA(baseA); - meash->SetBaseB(baseB); - meash->SetBaseC(baseC); - - meash->SetShiftA(shiftA); - meash->SetShiftB(shiftB); - meash->SetShiftC(shiftC); - - meash->SetStepA(convertedStepA); - meash->SetStepB(convertedStepB); - meash->SetStepC(convertedStepC); - - meash->SetSpecialUnits(specialUnits); - meash->SetCorrections(corrections); - meash->SetGuiText(fullName); - meash->SetDescription(description); - } - else - { - const IMD dimension = - VMeasurements::StrToIMD(GetParametrString(dom, AttrDimension, VMeasurements::IMDToStr(IMD::N))); - const QString formula = GetParametrString(dom, AttrValue, QChar('0')); - bool ok = false; - qreal value = EvalFormula(tempData.data(), formula, &ok); - - tempMeash = QSharedPointer::create(tempData.data(), static_cast(i), name, value, - formula, ok); - - if (not specialUnits) - { - value = UnitConvertor(value, Units(), *data->GetPatternUnit()); - } - - meash = QSharedPointer::create(data, static_cast(i), name, value, formula, ok); - meash->SetGuiText(fullName); - meash->SetDescription(description); - meash->SetSpecialUnits(specialUnits); - meash->SetDimension(dimension); - } + ReadMeasurement(dom, tempData, meash, tempMeash, i, baseA, baseB, baseC); } else { @@ -888,6 +810,20 @@ void VMeasurements::SetMDimension(const QString &name, IMD type) } } +//--------------------------------------------------------------------------------------------------------------------- +void VMeasurements::SetMImage(const QString &name, const VPatternImage &image) +{ + QDomElement mElement = FindM(name); + if (not mElement.isNull()) + { + WriteImage(mElement, image); + } + else + { + qWarning() << tr("Can't find measurement '%1'").arg(name); + } +} + //--------------------------------------------------------------------------------------------------------------------- auto VMeasurements::MeasurementForDimension(IMD type) const -> QString { @@ -1560,6 +1496,51 @@ void VMeasurements::WriteCorrections(QDomElement &mElement, const QMap VPatternImage +{ + QDomElement imageTag = mElement.firstChildElement(TagImage); + if (imageTag.isNull()) + { + return {}; + } + + VPatternImage image; + if (not imageTag.isNull()) + { + image.SetContentData(imageTag.text().toLatin1(), imageTag.attribute(AttrContentType)); + } + return image; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VMeasurements::WriteImage(QDomElement &mElement, const VPatternImage &image) +{ + QDomElement imageElement = mElement.firstChildElement(TagImage); + if (not image.IsNull()) + { + if (not imageElement.isNull()) + { + setTagText(imageElement, image.ContentData()); + imageElement.setAttribute(AttrContentType, image.ContentType()); + } + else + { + imageElement = createElement(TagImage); + setTagText(imageElement, image.ContentData()); + imageElement.setAttribute(AttrContentType, image.ContentType()); + mElement.appendChild(imageElement); + } + } + else + { + if (not imageElement.isNull()) + { + mElement.removeChild(imageElement); + } + } +} + //--------------------------------------------------------------------------------------------------------------------- void VMeasurements::SaveDimesionLabels(QDomElement &dElement, const DimesionLabels &labels) { @@ -1650,7 +1631,7 @@ void VMeasurements::ClearDimension(IMD type) for (int i = 0; i < list.size(); ++i) { QDomElement domElement = list.at(i).toElement(); - if (domElement.isNull() == false) + if (!domElement.isNull()) { if (domElement.attribute(AttrDimension) == d) { @@ -1659,3 +1640,104 @@ void VMeasurements::ClearDimension(IMD type) } } } + +//--------------------------------------------------------------------------------------------------------------------- +void VMeasurements::ReadMeasurement(const QDomElement &dom, QSharedPointer &tempData, + QSharedPointer &meash, QSharedPointer &tempMeash, int i, + qreal baseA, qreal baseB, qreal baseC) const +{ + const QString fullName = GetParametrEmptyString(dom, AttrFullName); + const bool specialUnits = GetParametrBool(dom, AttrSpecialUnits, falseStr); + const QString name = GetParametrString(dom, AttrName).simplified(); + const QString description = GetParametrEmptyString(dom, AttrDescription); + + if (type == MeasurementsType::Multisize) + { + qreal base = GetParametrDouble(dom, AttrBase, QChar('0')); + qreal shiftA = GetParametrDouble(dom, AttrShiftA, QChar('0')); + qreal shiftB = GetParametrDouble(dom, AttrShiftB, QChar('0')); + qreal shiftC = GetParametrDouble(dom, AttrShiftC, QChar('0')); + QMap corrections = ReadCorrections(dom); + + qreal convertedBaseA = DimensionABase(); + qreal convertedBaseB = DimensionBBase(); + qreal convertedBaseC = DimensionCBase(); + qreal convertedStepA = DimensionAStep(); + qreal convertedStepB = DimensionBStep(); + qreal convertedStepC = DimensionCStep(); + + if (not specialUnits) + { + base = UnitConvertor(base, Units(), *data->GetPatternUnit()); + shiftA = UnitConvertor(shiftA, Units(), *data->GetPatternUnit()); + shiftB = UnitConvertor(shiftB, Units(), *data->GetPatternUnit()); + shiftC = UnitConvertor(shiftC, Units(), *data->GetPatternUnit()); + + QMutableMapIterator iterator(corrections); + while (iterator.hasNext()) + { + iterator.next(); + iterator.setValue(UnitConvertor(iterator.value(), Units(), *data->GetPatternUnit())); + } + + convertedBaseA = UnitConvertor(convertedBaseA, Units(), *data->GetPatternUnit()); + convertedBaseB = UnitConvertor(convertedBaseB, Units(), *data->GetPatternUnit()); + convertedBaseC = UnitConvertor(convertedBaseC, Units(), *data->GetPatternUnit()); + + convertedStepA = UnitConvertor(convertedStepA, Units(), *data->GetPatternUnit()); + convertedStepB = UnitConvertor(convertedStepB, Units(), *data->GetPatternUnit()); + convertedStepC = UnitConvertor(convertedStepC, Units(), *data->GetPatternUnit()); + } + + meash = QSharedPointer::create(static_cast(i), name, convertedBaseA, convertedBaseB, + convertedBaseC, base); + meash->SetBaseA(baseA); + meash->SetBaseB(baseB); + meash->SetBaseC(baseC); + + meash->SetShiftA(shiftA); + meash->SetShiftB(shiftB); + meash->SetShiftC(shiftC); + + meash->SetStepA(convertedStepA); + meash->SetStepB(convertedStepB); + meash->SetStepC(convertedStepC); + + meash->SetSpecialUnits(specialUnits); + meash->SetCorrections(corrections); + meash->SetGuiText(fullName); + meash->SetDescription(description); + + if (meash->IsCustom()) + { + meash->SetImage(ReadImage(dom)); + } + } + else + { + const IMD dimension = + VMeasurements::StrToIMD(GetParametrString(dom, AttrDimension, VMeasurements::IMDToStr(IMD::N))); + const QString formula = GetParametrString(dom, AttrValue, QChar('0')); + bool ok = false; + qreal value = EvalFormula(tempData.data(), formula, &ok); + + tempMeash = + QSharedPointer::create(tempData.data(), static_cast(i), name, value, formula, ok); + + if (not specialUnits) + { + value = UnitConvertor(value, Units(), *data->GetPatternUnit()); + } + + meash = QSharedPointer::create(data, static_cast(i), name, value, formula, ok); + meash->SetGuiText(fullName); + meash->SetDescription(description); + meash->SetSpecialUnits(specialUnits); + meash->SetDimension(dimension); + + if (meash->IsCustom()) + { + meash->SetImage(ReadImage(dom)); + } + } +} diff --git a/src/libs/vformat/vmeasurements.h b/src/libs/vformat/vmeasurements.h index 87f03b6fb..2f27603e7 100644 --- a/src/libs/vformat/vmeasurements.h +++ b/src/libs/vformat/vmeasurements.h @@ -29,7 +29,6 @@ #ifndef VMEASUREMENTS_H #define VMEASUREMENTS_H - #include #include #include @@ -41,23 +40,30 @@ #include "vdimensions.h" class VContainer; +class VPatternImage; +class VMeasurement; -enum class GenderType : qint8 { Male, Female, Unknown }; +enum class GenderType : qint8 +{ + Male, + Female, + Unknown +}; using VDimensions = QMap; class VMeasurements : public VDomDocument { - Q_DECLARE_TR_FUNCTIONS(VMeasurements) // NOLINT + Q_OBJECT // NOLINT + public: explicit VMeasurements(VContainer *data); VMeasurements(Unit unit, VContainer *data); - VMeasurements(Unit unit, const QVector &dimensions, - VContainer *data); - virtual ~VMeasurements() = default; + VMeasurements(Unit unit, const QVector &dimensions, VContainer *data); + ~VMeasurements() override = default; - virtual void setXMLContent(const QString &fileName) override; - virtual auto SaveDocument(const QString &fileName, QString &error) -> bool override; + void setXMLContent(const QString &fileName) override; + auto SaveDocument(const QString &fileName, QString &error) -> bool override; void AddEmpty(const QString &name, const QString &formula = QString()); void AddEmptyAfter(const QString &after, const QString &name, const QString &formula = QString()); @@ -73,7 +79,7 @@ public: void StoreNames(bool store); - void ReadMeasurements(qreal baseA, qreal baseB=0, qreal baseC=0) const; + void ReadMeasurements(qreal baseA, qreal baseB = 0, qreal baseC = 0) const; void ClearForExport(); auto Type() const -> MeasurementsType; @@ -86,28 +92,28 @@ public: auto DimensionCStep() const -> qreal; auto Notes() const -> QString; - void SetNotes(const QString &text); + void SetNotes(const QString &text); auto Customer() const -> QString; - void SetCustomer(const QString &text); + void SetCustomer(const QString &text); auto BirthDate() const -> QDate; - void SetBirthDate(const QDate &date); + void SetBirthDate(const QDate &date); auto Gender() const -> GenderType; - void SetGender(const GenderType &gender); + void SetGender(const GenderType &gender); auto PMSystem() const -> QString; - void SetPMSystem(const QString &system); + void SetPMSystem(const QString &system); auto Email() const -> QString; - void SetEmail(const QString &text); + void SetEmail(const QString &text); auto IsReadOnly() const -> bool; - void SetReadOnly(bool ro); + void SetReadOnly(bool ro); auto IsFullCircumference() const -> bool; - void SetFullCircumference(bool fc); + void SetFullCircumference(bool fc); void SetMName(const QString &name, const QString &text); void SetMValue(const QString &name, const QString &text); @@ -120,14 +126,15 @@ public: void SetMDescription(const QString &name, const QString &text); void SetMFullName(const QString &name, const QString &text); void SetMDimension(const QString &name, IMD type); + void SetMImage(const QString &name, const VPatternImage &image); auto MeasurementForDimension(IMD type) const -> QString; auto Dimensions() const -> VDimensions; - auto GetRestrictions() const -> QMap; - void SetRestrictions(const QMap &restrictions); - auto Restriction(qreal base, qreal base2=0) const -> VDimensionRestriction; + auto GetRestrictions() const -> QMap; + void SetRestrictions(const QMap &restrictions); + auto Restriction(qreal base, qreal base2 = 0) const -> VDimensionRestriction; void SetDimensionLabels(const QMap &labels); void SetDimensionCustomNames(const QMap &names); @@ -152,6 +159,7 @@ public: static const QString TagCorrection; static const QString TagLabels; static const QString TagLabel; + static const QString TagImage; static const QString AttrBase; static const QString AttrValue; @@ -173,6 +181,7 @@ public: static const QString AttrLabel; static const QString AttrDimension; static const QString AttrCustomName; + static const QString AttrContentType; static const QString GenderMale; static const QString GenderFemale; @@ -206,7 +215,7 @@ private: Q_DISABLE_COPY_MOVE(VMeasurements) // NOLINT /** @brief data container with data. */ - VContainer *data; + VContainer *data; MeasurementsType type; // Cache data to quick access @@ -216,7 +225,7 @@ private: /** @brief m_keepNames store names in container to check uniqueness. */ bool m_keepNames{true}; - void CreateEmptyMultisizeFile(Unit unit, const QVector &dimensions); + void CreateEmptyMultisizeFile(Unit unit, const QVector &dimensions); void CreateEmptyIndividualFile(Unit unit); auto CreateDimensions(const QVector &dimensions) -> QDomElement; @@ -234,12 +243,19 @@ private: auto ClearPMCode(const QString &code) const -> QString; auto ReadCorrections(const QDomElement &mElement) const -> QMap; - void WriteCorrections(QDomElement &mElement, const QMap &corrections); + void WriteCorrections(QDomElement &mElement, const QMap &corrections); - void SaveDimesionLabels(QDomElement &dElement, const DimesionLabels &labels); + static auto ReadImage(const QDomElement &mElement) -> VPatternImage; + void WriteImage(QDomElement &mElement, const VPatternImage &image); + + void SaveDimesionLabels(QDomElement &dElement, const DimesionLabels &labels); auto ReadDimensionLabels(const QDomElement &dElement) const -> DimesionLabels; void ClearDimension(IMD type); + + void ReadMeasurement(const QDomElement &dom, QSharedPointer &tempData, + QSharedPointer &meash, QSharedPointer &tempMeash, int i, + qreal baseA, qreal baseB, qreal baseC) const; }; #endif // VMEASUREMENTS_H diff --git a/src/libs/vmisc/share/resources/icon.qrc b/src/libs/vmisc/share/resources/icon.qrc index f1a503361..160d57d95 100644 --- a/src/libs/vmisc/share/resources/icon.qrc +++ b/src/libs/vmisc/share/resources/icon.qrc @@ -201,5 +201,13 @@ icon/light/32x32/put_after.png icon/dark/32x32/put_after@2x.png icon/dark/32x32/put_after.png + icon/light/16x16/remove-image@2x.png + icon/light/16x16/remove-image.png + icon/light/16x16/insert-image@2x.png + icon/light/16x16/insert-image.png + icon/dark/16x16/remove-image@2x.png + icon/dark/16x16/remove-image.png + icon/dark/16x16/insert-image@2x.png + icon/dark/16x16/insert-image.png diff --git a/src/libs/vmisc/share/resources/icon/dark/16x16/insert-image.png b/src/libs/vmisc/share/resources/icon/dark/16x16/insert-image.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f1a6cd9c0b7821e3b5300982409b58e73fe5b2 GIT binary patch literal 405 zcmV;G0c!q8y=z@3zrtkuc-59zsG9gtUcAg-8f-bCdsKf{Z zIr|Af%#nI5NmYeJY2hTx_MQLF_Sq+@YW&0Y%Kjc$?5G_9*A-xqB*_dwRfi%nh~s$K z>-9d{)ZTjlT+MkaBJaSwD2fm7{aM#B)&Nx<0ylt^u6^KfYk-IhHpG=3Zw-j!cnN&f z;`6NmWx_6iSKu4SilP{I0Z>&_)zr-ROLI+7@BLMt=LapZEQB!nb%n}82ovBbilXN{ z&rcc{shJ%%0zwEAGrI#Yvs35XTUQFCtc6S92$1LtkKIOiT# ztJSQWW^B|>1!xrm^!xpnYFyU9x^^00VHf)WxFwHE^EU7W00000NkvXXu0mjf96P6a literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/dark/16x16/insert-image@2x.png b/src/libs/vmisc/share/resources/icon/dark/16x16/insert-image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3f1de9bb0041ce1f9896f775d3c3c122a52f92 GIT binary patch literal 605 zcmV-j0;2tiP)umxf zK+KBG5<+;Ss(a444e!0S1*k2-k@*8aDu#z<_9n}+E1dx3c|N3=d9BPW5s@dI0GQbw zs%L&&X(s@HZx|nU1@Nt5{MSwZoO3%3c@D$hwegdC>mm!2({eJ&dTXO&@-3PW;)r`tI|IMhZ>2#V527|hF zQ7Kg|+OBg4-ut=xM&k^q>L`k$eO0};3;-|&#vz2qRfCNHRCNSAr^wjWDIjXKumo9_ zJrt2m{`Q6l*vj+#mxz3*O6!>cRG7~cnb`|7`wm=g15jH6RUOrs|A7E5wK0d943ui# zq$ST{Qi=svr&Lwv-XL=sIE{H5{gZ(cYQ9h+^3lw;D~4v5mdbZW`6&JjTwT^Yj^h*m rFQvWms4r*W+A_vxrM35h{{X)Mr+c&^T^J)400000NkvXXu0mjfiUJMT literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/dark/16x16/remove-image.png b/src/libs/vmisc/share/resources/icon/dark/16x16/remove-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c3ee06683c32a44295123d0f28f3898f0e7104 GIT binary patch literal 528 zcmV+r0`L8aP)$}+&<5I)Wwqwa{LHz@U)$Z@#3o|Z zTreC4RI+*&-I!?UzM0j#y@^dT>WEDJQ{r(+8XE^@d^C6rbP=nfOkLet`|tXCL(1PG3jtrQJ8n=ew z8a<_|&jZptCL+B+p)rz|R}xURBjMy8-~zj4@A&h_}x8U#fbDuuRbN)s60ijP4tyjcJ@I(_)6JR#NZ>w@-KxVVs9XOq3d;BWWIP_9Z8yI9=wie-bwP8W5uLR*hp}q&c$j<{~0A7E35HUGm8-Spxe^sCp^SUQ@GOC z7Kqug2B1@O0Apo7*cM?dSr|XrFz3VxOV~W#v@z#`0DYaB16;dXz6TZ>=7}$J$DzLF zvtM60AKViGh++`no=(jH9?WK!LEZy?NEGt_Y&awj^jd4CRw2|J29`z5yRylj(`DCn zw>28`2M52IZZ6H5{{gQ}VWnP@Tx z*rN_VDV$Cg^RL0$3eEj2>_26Y^5_Ka7= Q5dZ)H07*qoM6N<$f}(K9mH+?% literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/light/16x16/insert-image.png b/src/libs/vmisc/share/resources/icon/light/16x16/insert-image.png new file mode 100644 index 0000000000000000000000000000000000000000..18bb411ec868b4167ea65965583b97b39da43776 GIT binary patch literal 395 zcmV;60d)R}P)5N?1sGaIFp-c|Kv(=p}%RqdMDH6VFv7kFq55RuM;xVFRA0O#Bk_*_~a zwFcybodGYv7f_{?`kMfF@6CH(ni+p-t_iBD7rkC@Z^c>_LI}UEun=$sJkDmbr=lp1 z8W^RS?Kc9l_%;uZQ%bL!QXsh&&duyVMDCUYVvM4y6;L(->aW}vk<&FB-2=nyS1i;{ p4Ok~8#`s+Oxd!I7)A$P8*f%$NeYY<+#Kiyr002ovPDHLkV1mupp9BB^ literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/light/16x16/insert-image@2x.png b/src/libs/vmisc/share/resources/icon/light/16x16/insert-image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f27160e6674dc05e09c18f396ff6d85b86805df GIT binary patch literal 596 zcmV-a0;~OrP)0Tq8&Dz(PdI(OcvodIiYKS`1kYwg2T0D!!Fp2Zex0a$DMBJv7IMP%US}i&)4x4m zu%+jmo4bR|W#ByKP4rI&7Sw#HMC6nAem}A_?E^&a9bqf}0^C^DTvZqD57HiO^kmwS4C_-WC_V(-G{-U+v(l0z7?>#;r-uv>zTC1ERL2G^q zl>U=V0#8Cgsa!6v066CoA~Il%sT7OFpPgvu902BoGMQWizNl)}dtY_V4WD+6BY|@+ zp{maSX>DBsUUw}Jk%41yn8B_E#+VB5>#y@{*Me4IlfVY>8_0O?XHOGgtyOF7w5oEJ z5ww#!=N<+@uv#b-w!^*Z#Dji4*nf=Z5U>@&ydBJCzMD4iQ{Y{r(a5J#sW`yaX!@cy z_7)KwFa_Lgs()0ylfG`+z%N?M8{Yd(055(X<;sQFej4OWp!M5`>?qCWM*?f@{4qGp z;S*JE0{3@nJquTJD|23=BMM6hx55r)MP#H?(TaW(WHYMuSJknpdwsF`+HS3P9h#Rz zK}Q%sePmf8{)d<7j4DgJwVn@xzDL;mr^I%-md|`uC95#b;U7sfMeFg;A3yy84>Gwy TTvm+Y00000NkvXXu0mjf>cQ#+ literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/light/16x16/remove-image@2x.png b/src/libs/vmisc/share/resources/icon/light/16x16/remove-image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4192f0346fadbb1bf0efd48acf2f07e4af705cba GIT binary patch literal 972 zcmV;-12g=IP)JUN1mQ6+$<(3=Uu#CfHk+EVE#s# zc~NaZ%5j`WLIEf&`(Tya=4dqfPAC8((nsYlFIOTgfLJZbs@fC^fT~`vG5=a90Kim@ z`Co+s5R1hof%8>zZ~4A|C=`IgCDRN1xRyCEFf%jrLnr_Mp66Z6=kx6%@_~rV0k?r) zfK$HjJD%r#a=+#P68Ik&+o)y~)WhG5f^r@vInq3j78!aw&gf z`RnaxCzgU?HLrlRb}$l&%vo#utHmyKCwdpU;tOJY5A-C+arK!rTk3wxyx4c-LeIYX zdjhc54vNS}KvYDA{|h419e*G65K!q~bCW7hZ}I;=JJ;2_wI%>-?SX=Mu{T6SWVoZF z;}zF+JA<+FUGcq&yr#a{DLLHU-rh;+qa%CjxO}T>CZ1C z`Wf(P$vi%!a5PX8jV;s3tZ)4Nz+Vx~eRxk-aWzH#+)z&HW-{GPb2zXOKSWigwPFJQ{zAVoV(gC u@H&uI_!U?Z_#TnNlGE+2XOhFk_ + + + + + + + diff --git a/src/libs/vmisc/share/resources/icon/svg/dark/remove-image.svg b/src/libs/vmisc/share/resources/icon/svg/dark/remove-image.svg new file mode 100644 index 000000000..5a0d64bf4 --- /dev/null +++ b/src/libs/vmisc/share/resources/icon/svg/dark/remove-image.svg @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/src/libs/vmisc/share/resources/icon/svg/light/insert-image.svg b/src/libs/vmisc/share/resources/icon/svg/light/insert-image.svg new file mode 100644 index 000000000..0dc0cd7c1 --- /dev/null +++ b/src/libs/vmisc/share/resources/icon/svg/light/insert-image.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/src/libs/vmisc/share/resources/icon/svg/light/remove-image.svg b/src/libs/vmisc/share/resources/icon/svg/light/remove-image.svg new file mode 100644 index 000000000..d9db0db26 --- /dev/null +++ b/src/libs/vmisc/share/resources/icon/svg/light/remove-image.svg @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/src/libs/vmisc/svgfont/vsvgpathtokenizer.cpp b/src/libs/vmisc/svgfont/vsvgpathtokenizer.cpp index 226f6be34..2f71ab48a 100644 --- a/src/libs/vmisc/svgfont/vsvgpathtokenizer.cpp +++ b/src/libs/vmisc/svgfont/vsvgpathtokenizer.cpp @@ -58,22 +58,22 @@ auto IsCommand(const QChar &ch) -> bool //--------------------------------------------------------------------------------------------------------------------- auto IsSeparator(const QString ¤tToken, const QChar &ch) -> bool { - if (ch.isSpace() || ch == ',') + if (ch.isSpace() || ch == ','_L1) { return true; } - if (ch == '.' && currentToken.contains(ch)) + if (ch == '.'_L1 && currentToken.contains(ch)) { return true; } - if (ch == '-' && !currentToken.isEmpty() && Back(currentToken) != 'e' && Back(currentToken) != 'E') + if (ch == '-'_L1 && !currentToken.isEmpty() && Back(currentToken) != 'e'_L1 && Back(currentToken) != 'E'_L1) { return true; } - if (ch == '+' && !currentToken.isEmpty() && Back(currentToken) != 'e' && Back(currentToken) != 'E') + if (ch == '+'_L1 && !currentToken.isEmpty() && Back(currentToken) != 'e'_L1 && Back(currentToken) != 'E'_L1) { return true; } diff --git a/src/libs/vmisc/vcommonsettings.cpp b/src/libs/vmisc/vcommonsettings.cpp index a61a2c1b9..6bae17484 100644 --- a/src/libs/vmisc/vcommonsettings.cpp +++ b/src/libs/vmisc/vcommonsettings.cpp @@ -92,6 +92,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsIndividualMeasurements, ("p Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsMultisizeMeasurements, ("paths/standard_measurements"_L1)) Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsPattern, ("paths/pattern"_L1)) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsManualLayouts, ("paths/manualLayouts"_L1)) // NOLINT +Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsCustomImage, ("paths/customImage"_L1)) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsSVGFonts, ("paths/svgFonts"_L1)) // NOLINT // NOLINTNEXTLINE Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsFontCorrections, ("paths/fontCorrections"_L1)) @@ -344,6 +345,21 @@ void VCommonSettings::SetPathManualLayouts(const QString &value) settings.sync(); } +//--------------------------------------------------------------------------------------------------------------------- +auto VCommonSettings::GetPathCustomImage() const -> QString +{ + QSettings settings(this->format(), this->scope(), this->organizationName(), *commonIniFilename); + return settings.value(*settingPathsCustomImage, QDir::homePath()).toString(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VCommonSettings::SetPathCustomImage(const QString &value) +{ + QSettings settings(this->format(), this->scope(), this->organizationName(), *commonIniFilename); + settings.setValue(*settingPathsCustomImage, value); + settings.sync(); +} + //--------------------------------------------------------------------------------------------------------------------- auto VCommonSettings::GetDefPathSVGFonts() -> QString { diff --git a/src/libs/vmisc/vcommonsettings.h b/src/libs/vmisc/vcommonsettings.h index 448cb9082..12dde345a 100644 --- a/src/libs/vmisc/vcommonsettings.h +++ b/src/libs/vmisc/vcommonsettings.h @@ -74,6 +74,9 @@ public: auto GetPathManualLayouts() const -> QString; void SetPathManualLayouts(const QString &value); + auto GetPathCustomImage() const -> QString; + void SetPathCustomImage(const QString &value); + static auto GetDefPathSVGFonts() -> QString; auto GetPathSVGFonts() const -> QString; void SetPathSVGFonts(const QString &value); diff --git a/src/libs/vmisc/vmisc.pri b/src/libs/vmisc/vmisc.pri index 14c03f1c5..1f353b9e0 100644 --- a/src/libs/vmisc/vmisc.pri +++ b/src/libs/vmisc/vmisc.pri @@ -30,7 +30,8 @@ SOURCES += \ $$PWD/dialogs/dialogexporttocsv.cpp \ $$PWD/literals.cpp \ $$PWD/vmodifierkey.cpp \ - $$PWD/dialogs/dialogselectlanguage.cpp + $$PWD/dialogs/dialogselectlanguage.cpp \ + $$PWD/vaspectratiopixmaplabel.cpp *msvc*:SOURCES += $$PWD/stable.cpp @@ -123,7 +124,8 @@ HEADERS += \ $$PWD/backport/text.h \ $$PWD/dialogs/dialogselectlanguage.h \ $$PWD/fpm/fixed.hpp \ - $$PWD/fpm/math.hpp + $$PWD/fpm/math.hpp \ + $$PWD/vaspectratiopixmaplabel.h contains(DEFINES, APPIMAGE) { SOURCES += \ diff --git a/src/libs/vpatterndb/variables/vmeasurement.cpp b/src/libs/vpatterndb/variables/vmeasurement.cpp index d71d14454..d004f80f7 100644 --- a/src/libs/vpatterndb/variables/vmeasurement.cpp +++ b/src/libs/vpatterndb/variables/vmeasurement.cpp @@ -33,6 +33,7 @@ #include #include "../ifc/ifcdef.h" +#include "../ifc/xml/vpatternimage.h" #include "vmeasurement_p.h" #include "vvariable.h" @@ -388,3 +389,15 @@ void VMeasurement::SetCorrections(const QMap &corrections) { d->corrections = corrections; } + +//--------------------------------------------------------------------------------------------------------------------- +auto VMeasurement::GetImage() const -> VPatternImage +{ + return d->image; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VMeasurement::SetImage(const VPatternImage &image) +{ + d->image = image; +} diff --git a/src/libs/vpatterndb/variables/vmeasurement.h b/src/libs/vpatterndb/variables/vmeasurement.h index 60c77c85b..5d1515aef 100644 --- a/src/libs/vpatterndb/variables/vmeasurement.h +++ b/src/libs/vpatterndb/variables/vmeasurement.h @@ -41,6 +41,7 @@ class VContainer; class VMeasurementData; +class VPatternImage; /** * @brief The VMeasurement class keep data row of multisize table @@ -117,6 +118,9 @@ public: auto GetCorrections() const -> QMap; void SetCorrections(const QMap &corrections); + auto GetImage() const -> VPatternImage; + void SetImage(const VPatternImage &image); + static auto CorrectionHash(qreal baseA, qreal baseB = 0, qreal baseC = 0) -> QString; private: diff --git a/src/libs/vpatterndb/variables/vmeasurement_p.h b/src/libs/vpatterndb/variables/vmeasurement_p.h index 15358f433..221764f13 100644 --- a/src/libs/vpatterndb/variables/vmeasurement_p.h +++ b/src/libs/vpatterndb/variables/vmeasurement_p.h @@ -31,6 +31,7 @@ #include +#include "../ifc/xml/vpatternimage.h" #include "../vcontainer.h" QT_WARNING_PUSH @@ -78,6 +79,8 @@ public: MeasurementType varType{MeasurementType::Measurement}; // NOLINT(misc-non-private-member-variables-in-classes) + VPatternImage image{}; // NOLINT(misc-non-private-member-variables-in-classes) + private: Q_DISABLE_ASSIGN_MOVE(VMeasurementData) // NOLINT }; diff --git a/src/libs/vwidgets/vaspectratiopixmaplabel.cpp b/src/libs/vwidgets/vaspectratiopixmaplabel.cpp new file mode 100644 index 000000000..5718c23ff --- /dev/null +++ b/src/libs/vwidgets/vaspectratiopixmaplabel.cpp @@ -0,0 +1,105 @@ +/************************************************************************ + ** + ** @file vaspectratiopixmaplabel.cpp + ** @author Roman Telezhynskyi + ** @date 19 10, 2023 + ** + ** @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) 2023 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 "vaspectratiopixmaplabel.h" + +//--------------------------------------------------------------------------------------------------------------------- +VAspectRatioPixmapLabel::VAspectRatioPixmapLabel(QWidget *parent, Qt::WindowFlags f) + : QLabel(parent, f) +{ + setMinimumSize(1, 1); + setScaledContents(false); +} + +//--------------------------------------------------------------------------------------------------------------------- +VAspectRatioPixmapLabel::VAspectRatioPixmapLabel(const QString &text, QWidget *parent, Qt::WindowFlags f) + : QLabel(text, parent, f) +{ + setMinimumSize(1, 1); + setScaledContents(false); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VAspectRatioPixmapLabel::setPixmap(const QPixmap &p) +{ + m_pix = p; + QLabel::setPixmap(ScaledPixmap()); +} + +//--------------------------------------------------------------------------------------------------------------------- +auto VAspectRatioPixmapLabel::heightForWidth(int width) const -> int +{ + if (m_pix.isNull()) + { + return QLabel::heightForWidth(width); + } + + return static_cast((static_cast(m_pix.height()) * width) / m_pix.width()); +} + +//--------------------------------------------------------------------------------------------------------------------- +auto VAspectRatioPixmapLabel::sizeHint() const -> QSize +{ + if (m_pix.isNull()) + { + return QLabel::sizeHint(); + } + + int w = m_pix.width(); + return {w, heightForWidth(w)}; +} + +//--------------------------------------------------------------------------------------------------------------------- +auto VAspectRatioPixmapLabel::ScaledPixmap() const -> QPixmap +{ + if (m_pix.isNull()) + { + return m_pix; + } + + auto scaled = m_pix.scaled(size() * devicePixelRatioF(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + scaled.setDevicePixelRatio(devicePixelRatioF()); + return scaled; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VAspectRatioPixmapLabel::resizeEvent(QResizeEvent *e) +{ + Q_UNUSED(e) + + if (!m_pix.isNull()) + { + QLabel::setPixmap(ScaledPixmap()); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void VAspectRatioPixmapLabel::mousePressEvent(QMouseEvent *event) +{ + Q_UNUSED(event) + emit clicked(); +} diff --git a/src/libs/vwidgets/vaspectratiopixmaplabel.h b/src/libs/vwidgets/vaspectratiopixmaplabel.h new file mode 100644 index 000000000..d779c21da --- /dev/null +++ b/src/libs/vwidgets/vaspectratiopixmaplabel.h @@ -0,0 +1,63 @@ +/************************************************************************ + ** + ** @file vaspectratiopixmaplabel.h + ** @author Roman Telezhynskyi + ** @date 19 10, 2023 + ** + ** @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) 2023 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 VASPECTRATIOPIXMAPLABEL_H +#define VASPECTRATIOPIXMAPLABEL_H + +#include + +class VAspectRatioPixmapLabel : public QLabel +{ + Q_OBJECT // NOLINT + +public: + explicit VAspectRatioPixmapLabel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + explicit VAspectRatioPixmapLabel(const QString &text, QWidget *parent = nullptr, + Qt::WindowFlags f = Qt::WindowFlags()); + ~VAspectRatioPixmapLabel() override = default; + + auto heightForWidth(int width) const -> int override; + auto sizeHint() const -> QSize override; + + auto ScaledPixmap() const -> QPixmap; + +public slots: + void setPixmap(const QPixmap &p); + void resizeEvent(QResizeEvent *e) override; + +signals: + void clicked(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + +private: + Q_DISABLE_COPY_MOVE(VAspectRatioPixmapLabel) // NOLINT + QPixmap m_pix; +}; + +#endif // VASPECTRATIOPIXMAPLABEL_H diff --git a/src/libs/vwidgets/vwidgets.qbs b/src/libs/vwidgets/vwidgets.qbs index c0233d655..2ea3dd0c3 100644 --- a/src/libs/vwidgets/vwidgets.qbs +++ b/src/libs/vwidgets/vwidgets.qbs @@ -14,6 +14,8 @@ VLib { name: "VWidgetsLib" files: [ "qtcolorpicker.cpp", + "vaspectratiopixmaplabel.cpp", + "vaspectratiopixmaplabel.h", "vcomboboxdelegate.cpp", "vdecorationaligningdelegate.cpp", "velidedlabel.cpp",