diff --git a/src/app/tape/dialogs/dialogrestrictdimension.cpp b/src/app/tape/dialogs/dialogrestrictdimension.cpp index 90004601c..7e66555c7 100644 --- a/src/app/tape/dialogs/dialogrestrictdimension.cpp +++ b/src/app/tape/dialogs/dialogrestrictdimension.cpp @@ -28,6 +28,55 @@ #include "dialogrestrictdimension.h" #include "ui_dialogrestrictdimension.h" +#include + +#include "../vpatterndb/variables/vmeasurement.h" +#include "../vwidgets/vdecorationaligningdelegate.h" + + +namespace +{ +//--------------------------------------------------------------------------------------------------------------------- +QVector FilterByMinimum(const QVector &base, int restriction) +{ + if (restriction <= 0) + { + return base; + } + + QVector filtered; + filtered.reserve(base.size()); + for(auto &b : base) + { + if (b >= restriction) + { + filtered.append(b); + } + } + return filtered; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector FilterByMaximum(const QVector &base, int restriction) +{ + if (restriction <= 0) + { + return base; + } + + QVector filtered; + filtered.reserve(base.size()); + for(auto &b : base) + { + if (b <= restriction) + { + filtered.append(b); + } + } + return filtered; +} +} + //--------------------------------------------------------------------------------------------------------------------- DialogRestrictDimension::DialogRestrictDimension(const QList &dimensions, const QMap> &restrictions, @@ -41,6 +90,22 @@ DialogRestrictDimension::DialogRestrictDimension(const QListsetupUi(this); + + ui->tableWidget->setItemDelegate( + new VDecorationAligningDelegate(Qt::AlignHCenter | Qt::AlignCenter, ui->tableWidget)); + + connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, this, &DialogRestrictDimension::RowSelected); + + connect(ui->comboBoxDimensionA, QOverload::of(&QComboBox::currentIndexChanged), this, + &DialogRestrictDimension::DimensionAChanged); + + connect(ui->comboBoxMin, QOverload::of(&QComboBox::currentIndexChanged), this, + &DialogRestrictDimension::MinRestrictionChanged); + connect(ui->comboBoxMax, QOverload::of(&QComboBox::currentIndexChanged), this, + &DialogRestrictDimension::MaxRestrictionChanged); + + InitDimensionsBaseValues(); + InitTable(); } //--------------------------------------------------------------------------------------------------------------------- @@ -48,3 +113,480 @@ DialogRestrictDimension::~DialogRestrictDimension() { delete ui; } + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::changeEvent(QEvent *event) +{ + if (event->type() == QEvent::LanguageChange) + { + // retranslate designer form (single inheritance approach) + ui->retranslateUi(this); + + auto RetranslateControls = [this](int index, QLabel *name, QComboBox *control) + { + SCASSERT(name != nullptr) + SCASSERT(control != nullptr) + + if (m_dimensions.size() > index) + { + MeasurementDimension_p dimension = m_dimensions.at(index); + + name->setText(VAbstartMeasurementDimension::DimensionName(dimension->Type())+QChar(':')); + name->setToolTip(VAbstartMeasurementDimension::DimensionToolTip(dimension->Type(), + dimension->IsCircumference(), + m_fullCircumference)); + + InitDimensionGradation(dimension, control); + } + }; + + if (not m_oneDimesionRestriction) + { + RetranslateControls(0, ui->labelDimensionA, ui->comboBoxDimensionA); + } + } + + // remember to call base class implementation + QDialog::changeEvent(event); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::RowSelected() +{ + EnableRestrictionControls(false); + + QTableWidgetItem *item = ui->tableWidget->currentItem(); + + if (item) + { + int base1 = 0; + int base2 = 0; + MeasurementDimension_p dimension; + + if (m_oneDimesionRestriction) + { + base1 = item->data(Qt::UserRole).toInt(); + + if (m_dimensions.size() > 1) + { + dimension = m_dimensions.at(1); + } + } + else + { + base1 = ui->comboBoxDimensionA->currentData().toInt(); + base2 = item->data(Qt::UserRole).toInt(); + + if (m_dimensions.size() > 2) + { + dimension = m_dimensions.at(2); + } + } + + QPair restriction = m_restrictions.value(VMeasurement::CorrectionHash(base1, base2), + QPair(0, 0)); + + if (dimension.isNull()) + { + return; + } + + const QVector bases = dimension->ValidBases(); + + ui->comboBoxMin->blockSignals(true); + ui->comboBoxMin->clear(); + QVector filtered = FilterByMaximum(bases, restriction.second); + FillBases(filtered, dimension, ui->comboBoxMin); + int index = ui->comboBoxMin->findData(restriction.first); + ui->comboBoxMin->setCurrentIndex(index != -1 ? index : 0); + ui->comboBoxMin->blockSignals(false); + + ui->comboBoxMax->blockSignals(true); + ui->comboBoxMax->clear(); + filtered = FilterByMinimum(bases, restriction.first); + FillBases(FilterByMinimum(bases, restriction.first), dimension, ui->comboBoxMax); + index = ui->comboBoxMax->findData(restriction.second); + ui->comboBoxMax->setCurrentIndex(index != -1 ? index : ui->comboBoxMax->count() - 1); + ui->comboBoxMax->blockSignals(false); + + EnableRestrictionControls(true); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::DimensionAChanged() +{ + InitTable(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::MinRestrictionChanged() +{ + QTableWidgetItem *item = ui->tableWidget->currentItem(); + + if (item) + { + int base1 = 0; + int base2 = 0; + + if (m_oneDimesionRestriction) + { + base1 = item->data(Qt::UserRole).toInt(); + } + else + { + base1 = ui->comboBoxDimensionA->currentData().toInt(); + base2 = item->data(Qt::UserRole).toInt(); + } + + const QString coordinates = VMeasurement::CorrectionHash(base1, base2); + QPair restriction = m_restrictions.value(coordinates, QPair(0, 0)); + + restriction.first = ui->comboBoxMin->currentData().toInt(); + m_restrictions.insert(coordinates, restriction); + + const int currentRow = ui->tableWidget->currentRow(); + RefreshTable(); + + ui->tableWidget->blockSignals(true); + ui->tableWidget->selectRow(currentRow); + ui->tableWidget->blockSignals(false); + + RowSelected(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::MaxRestrictionChanged() +{ + QTableWidgetItem *item = ui->tableWidget->currentItem(); + + if (item) + { + int base1 = 0; + int base2 = 0; + + if (m_oneDimesionRestriction) + { + base1 = item->data(Qt::UserRole).toInt(); + } + else + { + base1 = ui->comboBoxDimensionA->currentData().toInt(); + base2 = item->data(Qt::UserRole).toInt(); + } + + const QString coordinates = VMeasurement::CorrectionHash(base1, base2); + QPair restriction = m_restrictions.value(coordinates, QPair(0, 0)); + + restriction.second = ui->comboBoxMax->currentData().toInt(); + m_restrictions.insert(coordinates, restriction); + + const int currentRow = ui->tableWidget->currentRow(); + RefreshTable(); + + ui->tableWidget->blockSignals(true); + ui->tableWidget->selectRow(currentRow); + ui->tableWidget->blockSignals(false); + + RowSelected(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::InitDimensionsBaseValues() +{ + auto DimensionsBaseValue = [this](int index, QLabel *name, QComboBox *control) + { + SCASSERT(name != nullptr) + SCASSERT(control != nullptr) + + if (m_dimensions.size() > index) + { + MeasurementDimension_p dimension = m_dimensions.at(index); + const QString unit = UnitsToStr(dimension->Units(), true); + name->setText(VAbstartMeasurementDimension::DimensionName(dimension->Type())+QChar(':')); + name->setToolTip(VAbstartMeasurementDimension::DimensionToolTip(dimension->Type(), + dimension->IsCircumference(), + m_fullCircumference)); + + InitDimensionGradation(dimension, control); + } + }; + + if (not m_oneDimesionRestriction) + { + if (m_dimensions.size() > 0) + { + DimensionsBaseValue(0, ui->labelDimensionA, ui->comboBoxDimensionA); + } + else + { + ui->labelDimensionA->setVisible(false); + ui->comboBoxDimensionA->setVisible(false); + } + } + else + { + ui->labelDimensionA->setVisible(false); + ui->comboBoxDimensionA->setVisible(false); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::InitDimensionGradation(const MeasurementDimension_p &dimension, QComboBox *control) +{ + SCASSERT(control != nullptr) + + int current = -1; + if (control->currentIndex() != -1) + { + current = control->currentData().toInt(); + } + + control->blockSignals(true); + control->clear(); + + FillBases(dimension->ValidBases(), dimension, control); + + int i = control->findData(current); + if (i != -1) + { + control->setCurrentIndex(i); + control->blockSignals(false); + } + else + { + control->blockSignals(false); + control->setCurrentIndex(0); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::InitTable() +{ + ui->tableWidget->blockSignals(true); + ui->tableWidget->clear(); + + auto InitHeaders = [this](int index) + { + if (m_dimensions.size() > index) + { + MeasurementDimension_p dimensionA = m_dimensions.at(index-1); + const QVector basesA = dimensionA->ValidBases(); + ui->tableWidget->setRowCount(basesA.size()); + ui->tableWidget->setVerticalHeaderLabels(DimensionLabels(basesA, dimensionA)); + + MeasurementDimension_p dimensionB = m_dimensions.at(index); + const QVector basesB = dimensionB->ValidBases(); + ui->tableWidget->setColumnCount(basesB.size()); + ui->tableWidget->setHorizontalHeaderLabels(DimensionLabels(basesB, dimensionB)); + } + }; + + InitHeaders(m_oneDimesionRestriction ? 1 : 2); + ui->tableWidget->blockSignals(false); + + RefreshTable(); + ui->tableWidget->selectRow(0); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::RefreshTable() +{ + QVector basesRow; + QVector basesColumn; + + if (m_oneDimesionRestriction) + { + if (m_dimensions.size() >= 2) + { + MeasurementDimension_p dimensionA = m_dimensions.at(0); + basesRow = dimensionA->ValidBases(); + + MeasurementDimension_p dimensionB = m_dimensions.at(1); + basesColumn = dimensionB->ValidBases(); + } + else + { + return; + } + } + else + { + if (m_dimensions.size() >= 3) + { + MeasurementDimension_p dimensionA = m_dimensions.at(1); + basesRow = dimensionA->ValidBases(); + + MeasurementDimension_p dimensionB = m_dimensions.at(2); + basesColumn = dimensionB->ValidBases(); + } + else + { + return; + } + } + + ui->tableWidget->blockSignals(true); + ui->tableWidget->clearContents(); + + for(int row=0; row < basesRow.size(); ++row) + { + for(int column=0; column < basesColumn.size(); ++column) + { + AddCell(row, column, basesRow.at(row), basesColumn.at(column)); + } + } + + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->tableWidget->blockSignals(false); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::AddCell(int row, int column, int rowValue, int columnValue) +{ + auto *item = new QTableWidgetItem(); + item->setData(Qt::UserRole, rowValue); + + int base1 = 0; + int base2 = 0; + + if (m_oneDimesionRestriction) + { + base1 = rowValue; + } + else + { + base1 = ui->comboBoxDimensionA->currentData().toInt(); + base2 = rowValue; + } + + QPair restriction = m_restrictions.value(VMeasurement::CorrectionHash(base1, base2), + QPair(0, 0)); + + bool leftRestriction = true; + if (restriction.first > 0 && restriction.first <= restriction.second) + { + leftRestriction = columnValue >= restriction.first; + } + + bool rightRestriction = true; + if (restriction.second > 0 && restriction.second >= restriction.first) + { + rightRestriction = columnValue <= restriction.second; + } + + if (leftRestriction && rightRestriction) + { + item->setIcon(QIcon("://icon/24x24/star.png")); + } + else + { + item->setIcon(QIcon("://icon/24x24/close.png")); + } + + // set the item non-editable (view only), and non-selectable + Qt::ItemFlags flags = item->flags(); + flags &= ~(Qt::ItemIsEditable); // reset/clear the flag + item->setFlags(flags); + + ui->tableWidget->setItem(row, column, item); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::EnableRestrictionControls(bool enable) +{ + if (not enable) + { + ui->comboBoxMin->blockSignals(true); + ui->comboBoxMin->setCurrentIndex(-1); + ui->comboBoxMin->blockSignals(false); + + ui->comboBoxMax->blockSignals(true); + ui->comboBoxMax->setCurrentIndex(-1); + ui->comboBoxMax->blockSignals(false); + } + + ui->groupBoxRestriction->setEnabled(enable); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogRestrictDimension::FillBases(const QVector &bases, const MeasurementDimension_p &dimension, + QComboBox *control) +{ + SCASSERT(control != nullptr) + + const QString units = UnitsToStr(dimension->Units(), true); + + if (dimension->Type() == MeasurementDimension::X) + { + for(auto base : bases) + { + control->addItem(QString("%1 %2").arg(base).arg(units), base); + } + } + else if (dimension->Type() == MeasurementDimension::Y) + { + for(auto base : bases) + { + if (dimension->IsCircumference()) + { + control->addItem(QString("%1 %2").arg(m_fullCircumference ? base*2 : base).arg(units), base); + } + else + { + control->addItem(QString::number(base), base); + } + } + } + else if (dimension->Type() == MeasurementDimension::W || dimension->Type() == MeasurementDimension::Z) + { + for(auto base : bases) + { + control->addItem(QString("%1 %2").arg(m_fullCircumference ? base*2 : base).arg(units), base); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +QStringList DialogRestrictDimension::DimensionLabels(const QVector &bases, const MeasurementDimension_p &dimension) +{ + const bool showUnits = dimension->IsCircumference() || dimension->Type() == MeasurementDimension::X; + const QString units = showUnits ? UnitsToStr(dimension->Units(), true) : QString(); + + QStringList labels; + + if (dimension->Type() == MeasurementDimension::X) + { + for(auto base : bases) + { + labels.append(QString("%1 %2").arg(base).arg(units)); + } + } + else if (dimension->Type() == MeasurementDimension::Y) + { + for(auto base : bases) + { + if (dimension->IsCircumference()) + { + labels.append(QString("%1 %2").arg(m_fullCircumference ? base*2 : base).arg(units)); + } + else + { + labels.append(QString::number(base)); + } + } + } + else if (dimension->Type() == MeasurementDimension::W || dimension->Type() == MeasurementDimension::Z) + { + for(auto base : bases) + { + labels.append(QString("%1 %2").arg(m_fullCircumference ? base*2 : base).arg(units)); + } + } + + return labels; +} diff --git a/src/app/tape/dialogs/dialogrestrictdimension.h b/src/app/tape/dialogs/dialogrestrictdimension.h index 58d2aca6a..0a3c03335 100644 --- a/src/app/tape/dialogs/dialogrestrictdimension.h +++ b/src/app/tape/dialogs/dialogrestrictdimension.h @@ -35,9 +35,12 @@ namespace Ui { - class DialogRestrictDimension; +class DialogRestrictDimension; } +class QTableWidgetItem; + + class DialogRestrictDimension : public QDialog { Q_OBJECT @@ -50,6 +53,15 @@ public: QMap > Restrictions() const; +protected: + virtual void changeEvent(QEvent* event) override; + +protected slots: + void RowSelected(); + void DimensionAChanged(); + void MinRestrictionChanged(); + void MaxRestrictionChanged(); + private: Q_DISABLE_COPY(DialogRestrictDimension) Ui::DialogRestrictDimension *ui; @@ -58,6 +70,20 @@ private: bool m_fullCircumference; QList m_dimensions; QMap> m_restrictions; + + void InitDimensionsBaseValues(); + void InitDimensionGradation(const MeasurementDimension_p &dimension, QComboBox *control); + void InitTable(); + + void RefreshTable(); + + void AddCell(int row, int column, int rowValue, int columnValue); + + void EnableRestrictionControls(bool enable); + + void FillBases(const QVector &bases, const MeasurementDimension_p &dimension, QComboBox *control); + + QStringList DimensionLabels(const QVector &bases, const MeasurementDimension_p &dimension); }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tape/dialogs/dialogrestrictdimension.ui b/src/app/tape/dialogs/dialogrestrictdimension.ui index 918dd785f..3aefc5815 100644 --- a/src/app/tape/dialogs/dialogrestrictdimension.ui +++ b/src/app/tape/dialogs/dialogrestrictdimension.ui @@ -6,44 +6,22 @@ 0 0 - 844 - 683 + 699 + 566 - Dialog + Restrict dimension + + + + :/tapeicon/64x64/logo.png:/tapeicon/64x64/logo.png - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - Dimension B: - - - - - + + Qt::Horizontal @@ -62,21 +40,11 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - + + - - + + Qt::Horizontal @@ -91,74 +59,73 @@ - - - Qt::Vertical + + + + 0 + 4 + - - - - 0 - 4 - - - - - - false - - - Restriction - - - - - - - - - Min: - - - - - - - Max: - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + + QAbstractItemView::CurrentChanged|QAbstractItemView::SelectedClicked + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + + 24 + 24 + + + + + + + + false + + + Restriction + + + + + + Min: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Max: + + + + + + + @@ -173,7 +140,9 @@ - + + + buttonBox diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp index f404e88d3..de3ec5aca 100644 --- a/src/app/tape/tmainwindow.cpp +++ b/src/app/tape/tmainwindow.cpp @@ -2548,8 +2548,10 @@ void TMainWindow::InitDimensionsBaseValue() if (dimensions.size() > index) { MeasurementDimension_p dimension = dimensions.at(index); - name->setText(DimensionName(dimension->Type())+QChar(':')); - name->setToolTip(DimensionToolTip(dimension->Type(), dimension->IsCircumference())); + name->setText(VAbstartMeasurementDimension::DimensionName(dimension->Type())+QChar(':')); + name->setToolTip(VAbstartMeasurementDimension::DimensionToolTip(dimension->Type(), + dimension->IsCircumference(), + m->IsFullCircumference())); if (dimension->IsCircumference() || dimension->Type() == MeasurementDimension::X) { @@ -2591,10 +2593,10 @@ void TMainWindow::InitDimensionGradation(int index, const MeasurementDimension_p control->blockSignals(true); control->clear(); + const QVector bases = DimensionRestrictedValues(index, dimension); + if (dimension->Type() == MeasurementDimension::X) { - const QVector bases = DimensionRestrictedValues(index, dimension); - for(auto base : bases) { control->addItem(QString("%1 %2").arg(base).arg(unit), base); @@ -2602,8 +2604,6 @@ void TMainWindow::InitDimensionGradation(int index, const MeasurementDimension_p } else if (dimension->Type() == MeasurementDimension::Y) { - const QVector bases = dimension->ValidBases(); - for(auto base : bases) { if (dimension->IsCircumference()) @@ -2618,8 +2618,6 @@ void TMainWindow::InitDimensionGradation(int index, const MeasurementDimension_p } else if (dimension->Type() == MeasurementDimension::W || dimension->Type() == MeasurementDimension::Z) { - const QVector bases = dimension->ValidBases(); - for(auto base : bases) { control->addItem(QString("%1 %2").arg(fc ? base*2 : base).arg(unit), base); @@ -2653,13 +2651,15 @@ void TMainWindow::InitDimensionControls() if (name == nullptr) { - name = new QLabel(DimensionName(dimension->Type())+QChar(':')); + name = new QLabel(VAbstartMeasurementDimension::DimensionName(dimension->Type())+QChar(':')); } else { - name->setText(DimensionName(dimension->Type())+QChar(':')); + name->setText(VAbstartMeasurementDimension::DimensionName(dimension->Type())+QChar(':')); } - name->setToolTip(DimensionToolTip(dimension->Type(), dimension->IsCircumference())); + name->setToolTip(VAbstartMeasurementDimension::DimensionToolTip(dimension->Type(), + dimension->IsCircumference(), + m->IsFullCircumference())); if (control == nullptr) { @@ -2686,8 +2686,10 @@ void TMainWindow::InitDimesionShifts() { MeasurementDimension_p dimension = dimensions.at(index); - name->setText(tr("Shift (%1):").arg(DimensionName(dimension->Type()))); - name->setToolTip(DimensionToolTip(dimension->Type(), dimension->IsCircumference())); + name->setText(tr("Shift (%1):").arg(VAbstartMeasurementDimension::DimensionName(dimension->Type()))); + name->setToolTip(VAbstartMeasurementDimension::DimensionToolTip(dimension->Type(), + dimension->IsCircumference(), + m->IsFullCircumference())); } }; @@ -2709,7 +2711,7 @@ void TMainWindow::InitTable() { MeasurementDimension_p dimension = dimensions.at(0); ui->tableWidget->horizontalHeaderItem(ColumnShiftA)->setText( - tr("%1 shift").arg(DimensionName(dimension->Type()))); + tr("%1 shift").arg(VAbstartMeasurementDimension::DimensionName(dimension->Type()))); } if (dimensions.size() < 2) @@ -2720,7 +2722,7 @@ void TMainWindow::InitTable() { MeasurementDimension_p dimension = dimensions.at(1); ui->tableWidget->horizontalHeaderItem(ColumnShiftB)->setText( - tr("%1 shift").arg(DimensionName(dimension->Type()))); + tr("%1 shift").arg(VAbstartMeasurementDimension::DimensionName(dimension->Type()))); } if (dimensions.size() < 3) @@ -2731,7 +2733,7 @@ void TMainWindow::InitTable() { MeasurementDimension_p dimension = dimensions.at(2); ui->tableWidget->horizontalHeaderItem(ColumnShiftC)->setText( - tr("%1 shift").arg(DimensionName(dimension->Type()))); + tr("%1 shift").arg(VAbstartMeasurementDimension::DimensionName(dimension->Type()))); } } else @@ -3888,51 +3890,6 @@ void TMainWindow::SetCurrentPatternUnit() } } -//--------------------------------------------------------------------------------------------------------------------- -QString TMainWindow::DimensionName(MeasurementDimension type) -{ - switch(type) - { - case MeasurementDimension::X: - return tr("Height"); - case MeasurementDimension::Y: - return tr("Size"); - case MeasurementDimension::W: - return tr("Hip"); - case MeasurementDimension::Z: - return tr("Waist"); - default: - return QString(); - } -} - -//--------------------------------------------------------------------------------------------------------------------- -QString TMainWindow::DimensionToolTip(MeasurementDimension type, bool circumference) -{ - const bool fc = m->IsFullCircumference(); - switch(type) - { - case MeasurementDimension::X: - return tr("Height"); - case MeasurementDimension::Y: - if (circumference) - { - return fc ? tr("Chest full circumference") : tr("Chest half circumference"); - } - else - { - return tr("Size"); - } - return circumference ? tr("Chest circumference") : tr("Size"); - case MeasurementDimension::W: - return fc ? tr("Hip full circumference") : tr("Hip half circumference"); - case MeasurementDimension::Z: - return fc ? tr("Waist full circumference") : tr("Waist half circumference"); - default: - return QString(); - } -} - //--------------------------------------------------------------------------------------------------------------------- void TMainWindow::ShowDimensionControls() { diff --git a/src/app/tape/tmainwindow.h b/src/app/tape/tmainwindow.h index 8388f647a..f35022b9a 100644 --- a/src/app/tape/tmainwindow.h +++ b/src/app/tape/tmainwindow.h @@ -240,9 +240,6 @@ private: void SetCurrentPatternUnit(); - QString DimensionName(MeasurementDimension type); - QString DimensionToolTip(MeasurementDimension type, bool circumference); - void ShowDimensionControls(); void SetDimensionBases(); void SetCurrentDimensionValues(); diff --git a/src/libs/vformat/vdimensions.cpp b/src/libs/vformat/vdimensions.cpp index c5cd70ce5..4c5bbdbec 100644 --- a/src/libs/vformat/vdimensions.cpp +++ b/src/libs/vformat/vdimensions.cpp @@ -155,6 +155,50 @@ bool VAbstartMeasurementDimension::IsUnitsValid() return m_units == Unit::Cm || m_units == Unit::Mm || m_units == Unit::Inch; } +//--------------------------------------------------------------------------------------------------------------------- +QString VAbstartMeasurementDimension::DimensionName(MeasurementDimension type) +{ + switch(type) + { + case MeasurementDimension::X: + return tr("Height"); + case MeasurementDimension::Y: + return tr("Size"); + case MeasurementDimension::W: + return tr("Hip"); + case MeasurementDimension::Z: + return tr("Waist"); + default: + return QString(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +QString VAbstartMeasurementDimension::DimensionToolTip(MeasurementDimension type, bool circumference, bool fc) +{ + switch(type) + { + case MeasurementDimension::X: + return tr("Height"); + case MeasurementDimension::Y: + if (circumference) + { + return fc ? tr("Chest full circumference") : tr("Chest half circumference"); + } + else + { + return tr("Size"); + } + return circumference ? tr("Chest circumference") : tr("Size"); + case MeasurementDimension::W: + return fc ? tr("Hip full circumference") : tr("Hip half circumference"); + case MeasurementDimension::Z: + return fc ? tr("Waist full circumference") : tr("Waist half circumference"); + default: + return QString(); + } +} + // VXMeasurementDimension //--------------------------------------------------------------------------------------------------------------------- VXMeasurementDimension::VXMeasurementDimension(Unit units) diff --git a/src/libs/vformat/vdimensions.h b/src/libs/vformat/vdimensions.h index 2b58e772d..fad7934bb 100644 --- a/src/libs/vformat/vdimensions.h +++ b/src/libs/vformat/vdimensions.h @@ -83,6 +83,9 @@ public: QVector ValidBases() const; QStringList ValidBasesList() const; + static QString DimensionName(MeasurementDimension type); + static QString DimensionToolTip(MeasurementDimension type, bool circumference, bool fc); + protected: Unit m_units{Unit::Cm}; int m_minValue{0}; diff --git a/src/libs/vmisc/share/resources/icon.qrc b/src/libs/vmisc/share/resources/icon.qrc index f4cff9ed5..72ed1fe0f 100644 --- a/src/libs/vmisc/share/resources/icon.qrc +++ b/src/libs/vmisc/share/resources/icon.qrc @@ -89,5 +89,9 @@ icon/32x32/broken_link@2x.png icon/32x32/link.png icon/32x32/link@2x.png + icon/24x24/star.png + icon/24x24/star@2x.png + icon/24x24/close.png + icon/24x24/close@2x.png diff --git a/src/libs/vmisc/share/resources/icon/24x24/close.png b/src/libs/vmisc/share/resources/icon/24x24/close.png new file mode 100644 index 000000000..6847dbcad Binary files /dev/null and b/src/libs/vmisc/share/resources/icon/24x24/close.png differ diff --git a/src/libs/vmisc/share/resources/icon/24x24/close@2x.png b/src/libs/vmisc/share/resources/icon/24x24/close@2x.png new file mode 100644 index 000000000..2b077e626 Binary files /dev/null and b/src/libs/vmisc/share/resources/icon/24x24/close@2x.png differ diff --git a/src/libs/vmisc/share/resources/icon/24x24/star.png b/src/libs/vmisc/share/resources/icon/24x24/star.png new file mode 100644 index 000000000..cfe569427 Binary files /dev/null and b/src/libs/vmisc/share/resources/icon/24x24/star.png differ diff --git a/src/libs/vmisc/share/resources/icon/24x24/star@2x.png b/src/libs/vmisc/share/resources/icon/24x24/star@2x.png new file mode 100644 index 000000000..608044078 Binary files /dev/null and b/src/libs/vmisc/share/resources/icon/24x24/star@2x.png differ diff --git a/src/libs/vpatterndb/variables/vmeasurement.h b/src/libs/vpatterndb/variables/vmeasurement.h index badc40980..2b3a708d1 100644 --- a/src/libs/vpatterndb/variables/vmeasurement.h +++ b/src/libs/vpatterndb/variables/vmeasurement.h @@ -119,7 +119,7 @@ public: static QStringList WholeListSizes(Unit patternUnit); static bool IsGradationSizeValid(const QString &size); static bool IsGradationHeightValid(const QString &height); - static QString CorrectionHash(qreal baseA, qreal baseB, qreal baseC); + static QString CorrectionHash(qreal baseA, qreal baseB=0, qreal baseC=0); private: QSharedDataPointer d; diff --git a/src/libs/vwidgets/vcomboboxdelegate.h b/src/libs/vwidgets/vcomboboxdelegate.h index 1cd27652d..301a39918 100644 --- a/src/libs/vwidgets/vcomboboxdelegate.h +++ b/src/libs/vwidgets/vcomboboxdelegate.h @@ -34,7 +34,7 @@ class VComboBoxDelegate : public QItemDelegate { Q_OBJECT public: - VComboBoxDelegate(const QStringList &items, QObject *parent = nullptr); + explicit VComboBoxDelegate(const QStringList &items, QObject *parent = nullptr); virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; diff --git a/src/libs/vwidgets/vdecorationaligningdelegate.cpp b/src/libs/vwidgets/vdecorationaligningdelegate.cpp new file mode 100644 index 000000000..f81974444 --- /dev/null +++ b/src/libs/vwidgets/vdecorationaligningdelegate.cpp @@ -0,0 +1,48 @@ +/************************************************************************ + ** + ** @file vdecorationaligningdelegate.cpp + ** @author Roman Telezhynskyi + ** @date 6 10, 2020 + ** + ** @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) 2020 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 "vdecorationaligningdelegate.h" + +#include + +//--------------------------------------------------------------------------------------------------------------------- +VDecorationAligningDelegate::VDecorationAligningDelegate(Qt::Alignment alignment, QObject *parent) + : QStyledItemDelegate(parent), m_alignment(alignment) +{} + +//--------------------------------------------------------------------------------------------------------------------- +void VDecorationAligningDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QIcon icon = QIcon(qvariant_cast(index.data(Qt::DecorationRole))); + + if (option.state & QStyle::State_Selected) + { + painter->fillRect(option.rect, option.palette.highlight()); + } + + icon.paint(painter, option.rect, m_alignment); +} diff --git a/src/libs/vwidgets/vdecorationaligningdelegate.h b/src/libs/vwidgets/vdecorationaligningdelegate.h new file mode 100644 index 000000000..2bfb424ac --- /dev/null +++ b/src/libs/vwidgets/vdecorationaligningdelegate.h @@ -0,0 +1,57 @@ +/************************************************************************ + ** + ** @file vdecorationaligningdelegate.h + ** @author Roman Telezhynskyi + ** @date 6 10, 2020 + ** + ** @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) 2020 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 VDECORATIONALIGNINGDELEGATE_H +#define VDECORATIONALIGNINGDELEGATE_H + +#include + + + +class VDecorationAligningDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + explicit VDecorationAligningDelegate(Qt::Alignment alignment, QObject *parent = nullptr); + + Qt::Alignment Alignment() const; + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + +private: + Q_DISABLE_COPY(VDecorationAligningDelegate) + Qt::Alignment const m_alignment; +}; + +//--------------------------------------------------------------------------------------------------------------------- +inline Qt::Alignment VDecorationAligningDelegate::Alignment() const +{ + return m_alignment; +} + +#endif // VDECORATIONALIGNINGDELEGATE_H diff --git a/src/libs/vwidgets/vwidgets.pri b/src/libs/vwidgets/vwidgets.pri index 602602a14..eaf29bd78 100644 --- a/src/libs/vwidgets/vwidgets.pri +++ b/src/libs/vwidgets/vwidgets.pri @@ -3,6 +3,7 @@ SOURCES += \ $$PWD/vcomboboxdelegate.cpp \ + $$PWD/vdecorationaligningdelegate.cpp \ $$PWD/velidedlabel.cpp \ $$PWD/vmaingraphicsscene.cpp \ $$PWD/vmaingraphicsview.cpp \ @@ -33,6 +34,7 @@ SOURCES += \ HEADERS += \ $$PWD/stable.h \ $$PWD/vcomboboxdelegate.h \ + $$PWD/vdecorationaligningdelegate.h \ $$PWD/velidedlabel.h \ $$PWD/vmaingraphicsscene.h \ $$PWD/vmaingraphicsview.h \