diff --git a/ChangeLog.txt b/ChangeLog.txt index eddd706a7..f8dc94429 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -7,6 +7,7 @@ - New option "Don't use the native file dialog". - Improve the layout option "Auto crop unused width". - Improve multisize measurements format. Allow decimal step 0.5. +- Improve restrict dimension dialog. Disable not available combinations. # Version 0.7.41 Dec 4, 2020 - Bug fixes. diff --git a/src/app/tape/dialogs/dialogrestrictdimension.cpp b/src/app/tape/dialogs/dialogrestrictdimension.cpp index 9914365d0..84401cd70 100644 --- a/src/app/tape/dialogs/dialogrestrictdimension.cpp +++ b/src/app/tape/dialogs/dialogrestrictdimension.cpp @@ -387,7 +387,7 @@ void DialogRestrictDimension::InitTable() ui->tableWidget->blockSignals(false); RefreshTable(); - ui->tableWidget->selectRow(0); + ui->tableWidget->selectRow(StartRow()); } //--------------------------------------------------------------------------------------------------------------------- @@ -415,11 +415,11 @@ void DialogRestrictDimension::RefreshTable() { if (m_dimensions.size() >= 3) { - MeasurementDimension_p dimensionA = m_dimensions.at(1); - basesRow = dimensionA->ValidBases(); + MeasurementDimension_p dimensionB = m_dimensions.at(1); + basesRow = dimensionB->ValidBases(); - MeasurementDimension_p dimensionB = m_dimensions.at(2); - basesColumn = dimensionB->ValidBases(); + MeasurementDimension_p dimensionC = m_dimensions.at(2); + basesColumn = dimensionC->ValidBases(); } else { @@ -454,6 +454,7 @@ void DialogRestrictDimension::AddCell(int row, int column, qreal rowValue, qreal qreal base2 = 0; MeasurementDimension_p dimension; QVector bases; + QVector validRows; if (m_oneDimesionRestriction) { @@ -461,6 +462,7 @@ void DialogRestrictDimension::AddCell(int row, int column, qreal rowValue, qreal if (m_dimensions.size() >= 2) { + validRows = m_dimensions.at(0)->ValidBases(); dimension = m_dimensions.at(1); bases = dimension->ValidBases(); } @@ -472,6 +474,7 @@ void DialogRestrictDimension::AddCell(int row, int column, qreal rowValue, qreal if (m_dimensions.size() >= 3) { + validRows = DimensionRestrictedValues(m_dimensions.at(1)); dimension = m_dimensions.at(2); bases = dimension->ValidBases(); } @@ -494,16 +497,27 @@ void DialogRestrictDimension::AddCell(int row, int column, qreal rowValue, qreal } } - const bool leftRestriction = columnValue >= min; - const bool rightRestriction = columnValue <= max; - - if (leftRestriction && rightRestriction) + if (validRows.contains(rowValue)) { - item->setIcon(QIcon(QStringLiteral("://icon/24x24/star.png"))); + const bool leftRestriction = columnValue >= min; + const bool rightRestriction = columnValue <= max; + + if (leftRestriction && rightRestriction) + { + item->setIcon(QIcon(QStringLiteral("://icon/24x24/star.png"))); + } + else + { + item->setIcon(QIcon(QStringLiteral("://icon/24x24/close.png"))); + } } else { item->setIcon(QIcon(QStringLiteral("://icon/24x24/close.png"))); + + Qt::ItemFlags flags = item->flags(); + flags &= ~(Qt::ItemIsEnabled); + item->setFlags(flags); } // set the item non-editable (view only), and non-selectable @@ -653,3 +667,57 @@ auto DialogRestrictDimension::DimensionLabels(const QVector &bases, return labels; } + +//--------------------------------------------------------------------------------------------------------------------- +auto DialogRestrictDimension::DimensionRestrictedValues(const MeasurementDimension_p &dimension) const -> QVector +{ + QPair restriction; + + if (not m_oneDimesionRestriction) + { + qreal base1 = ui->comboBoxDimensionA->currentData().toDouble(); + restriction = m_restrictions.value(VMeasurement::CorrectionHash(base1), QPair(0, 0)); + } + + const QVector bases = dimension->ValidBases(); + + qreal min = bases.indexOf(restriction.first) != -1 ? restriction.first : dimension->MinValue(); + qreal max = bases.indexOf(restriction.second) != -1 ? restriction.second : dimension->MaxValue(); + + if (min > max) + { + min = dimension->MinValue(); + max = dimension->MaxValue(); + } + + return VAbstartMeasurementDimension::ValidBases(min, max, dimension->Step()); +} + +//--------------------------------------------------------------------------------------------------------------------- +auto DialogRestrictDimension::StartRow() const -> int +{ + if (m_oneDimesionRestriction) + { + return 0; + } + + QVector basesRow; + + if (m_dimensions.size() >= 3) + { + MeasurementDimension_p dimensionB = m_dimensions.at(1); + basesRow = dimensionB->ValidBases(); + + QVector validRows = DimensionRestrictedValues(dimensionB); + + for(int i=0; i < basesRow.size(); ++i) + { + if (validRows.contains(basesRow.at(i))) + { + return i; + } + } + } + + return 0; +} diff --git a/src/app/tape/dialogs/dialogrestrictdimension.h b/src/app/tape/dialogs/dialogrestrictdimension.h index 4edd3e6f6..cb7614a10 100644 --- a/src/app/tape/dialogs/dialogrestrictdimension.h +++ b/src/app/tape/dialogs/dialogrestrictdimension.h @@ -84,6 +84,8 @@ private: void FillBases(const QVector &bases, const MeasurementDimension_p &dimension, QComboBox *control) const; auto DimensionLabels(const QVector &bases, const MeasurementDimension_p &dimension) const -> QStringList; + auto DimensionRestrictedValues(const MeasurementDimension_p &dimension) const -> QVector; + auto StartRow() const -> int; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vwidgets/vdecorationaligningdelegate.cpp b/src/libs/vwidgets/vdecorationaligningdelegate.cpp index f81974444..e023be109 100644 --- a/src/libs/vwidgets/vdecorationaligningdelegate.cpp +++ b/src/libs/vwidgets/vdecorationaligningdelegate.cpp @@ -39,10 +39,17 @@ void VDecorationAligningDelegate::paint(QPainter *painter, const QStyleOptionVie { QIcon icon = QIcon(qvariant_cast(index.data(Qt::DecorationRole))); - if (option.state & QStyle::State_Selected) + if ((option.state & QStyle::State_Selected) != 0U) { painter->fillRect(option.rect, option.palette.highlight()); } - icon.paint(painter, option.rect, m_alignment); + if ((index.flags() & Qt::ItemIsEnabled) != 0U) + { + icon.paint(painter, option.rect, m_alignment); + } + else + { + icon.paint(painter, option.rect, m_alignment, QIcon::Disabled); + } }