diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 68f47ab629..25c0733dd6 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -62,16 +62,33 @@ #include #include - +// NOLINTBEGIN(cppcoreguidelines-pro-*,cppcoreguidelines-prefer-member-initializer) using namespace Gui::PropertyEditor; using namespace Gui::Dialog; +namespace { +constexpr const int lowPrec = 2; +constexpr const int highPrec = 16; + +int toPercent(float value) +{ + return static_cast(100 * value); // NOLINT +} + +float fromPercent(int value) +{ + return static_cast(value) / 100.0F; // NOLINT +} + +} + Gui::PropertyEditor::PropertyItemFactory* Gui::PropertyEditor::PropertyItemFactory::_singleton = nullptr; PropertyItemFactory& PropertyItemFactory::instance() { - if (!_singleton) + if (!_singleton) { _singleton = new PropertyItemFactory; + } return *_singleton; } @@ -83,15 +100,14 @@ void PropertyItemFactory::destruct () PropertyItem* PropertyItemFactory::createPropertyItem (const char* sName) const { - auto w = static_cast(Produce(sName)); - return w; + return static_cast(Produce(sName)); } // ---------------------------------------------------- -QVariant PropertyItemAttorney::toString(PropertyItem* item, const QVariant& v) +QVariant PropertyItemAttorney::toString(PropertyItem* item, const QVariant& value) { - return item->toString(v); + return item->toString(value); } // ---------------------------------------------------- @@ -100,9 +116,13 @@ Q_DECLARE_METATYPE(Py::Object) PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyItem) -PropertyItem::PropertyItem() : parentItem(nullptr), readonly(false), linked(false), expanded(false) +PropertyItem::PropertyItem() + : parentItem(nullptr) + , readonly(false) + , precision(Base::UnitsApi::getDecimals()) + , linked(false) + , expanded(false) { - precision = Base::UnitsApi::getDecimals(); setAutoApply(true); } @@ -123,24 +143,28 @@ void PropertyItem::reset() void PropertyItem::onChange() { - if(hasExpression()) { + if (hasExpression()) { for(auto child : qAsConst(childItems)) { - if(child && child->hasExpression()) + if(child && child->hasExpression()) { child->setExpression(std::shared_ptr()); + } } for(auto item=parentItem;item;item=item->parentItem) { - if(item->hasExpression()) + if(item->hasExpression()) { item->setExpression(std::shared_ptr()); + } } } } bool PropertyItem::hasAnyExpression() const { - if(ExpressionBinding::hasExpression()) + if(ExpressionBinding::hasExpression()) { return true; - if(parentItem) + } + if(parentItem) { return parentItem->hasExpression(); + } return false; } @@ -148,19 +172,20 @@ void PropertyItem::setPropertyData(const std::vector& items) { //if we have a single property we can bind it for expression handling if (items.size() == 1) { - const App::Property& p = *items.front(); + const App::Property& prop = *items.front(); try { // Check for 'DocumentObject' as parent because otherwise 'ObjectIdentifier' raises an exception - auto * docObj = Base::freecad_dynamic_cast(p.getContainer()); - if (docObj && !docObj->isReadOnly(&p)) { - App::ObjectIdentifier id(p); + auto * docObj = Base::freecad_dynamic_cast(prop.getContainer()); + if (docObj && !docObj->isReadOnly(&prop)) { + App::ObjectIdentifier id(prop); std::vector paths; - p.getPaths(paths); + prop.getPaths(paths); //there may be no paths available in this property (for example an empty constraint list) - if (id.getProperty() && !paths.empty()) + if (id.getProperty() && !paths.empty()) { bind(id); + } } } //it may happen that setting properties is not possible @@ -178,8 +203,9 @@ void PropertyItem::updateData() bool ro = true; for (auto it : propertyItems) { App::PropertyContainer* parent = it->getContainer(); - if (parent) + if (parent) { ro &= (parent->isReadOnly(it) || it->testStatus(App::Property::ReadOnly)); + } } this->setReadOnly(ro); } @@ -191,20 +217,18 @@ const std::vector& PropertyItem::getPropertyData() const bool PropertyItem::hasProperty(const App::Property* prop) const { - std::vector::const_iterator it = std::find(propertyItems.begin(), propertyItems.end(), prop); - if (it != propertyItems.end()) - return true; - else - return false; + auto it = std::find(propertyItems.begin(), propertyItems.end(), prop); + return (it != propertyItems.end()); } -void PropertyItem::assignProperty(const App::Property*) +void PropertyItem::assignProperty(const App::Property* prop) { + Q_UNUSED(prop) } bool PropertyItem::removeProperty(const App::Property* prop) { - std::vector::iterator it = std::find(propertyItems.begin(), propertyItems.end(), prop); + auto it = std::find(propertyItems.begin(), propertyItems.end(), prop); if (it != propertyItems.end()) { propertyItems.erase(it); } @@ -214,15 +238,17 @@ bool PropertyItem::removeProperty(const App::Property* prop) App::Property* PropertyItem::getFirstProperty() { - if (propertyItems.empty()) + if (propertyItems.empty()) { return nullptr; + } return propertyItems.front(); } const App::Property* PropertyItem::getFirstProperty() const { - if (propertyItems.empty()) + if (propertyItems.empty()) { return nullptr; + } return propertyItems.front(); } @@ -293,8 +319,9 @@ int PropertyItem::columnCount() const void PropertyItem::setReadOnly(bool ro) { readonly = ro; - for (auto it : childItems) + for (auto it : qAsConst(childItems)) { it->setReadOnly(ro); + } } bool PropertyItem::isReadOnly() const @@ -305,8 +332,9 @@ bool PropertyItem::isReadOnly() const void PropertyItem::setLinked(bool value) { linked = value; - for (auto it : childItems) + for (auto it : qAsConst(childItems)) { it->setLinked(value); + } } bool PropertyItem::isLinked() const @@ -328,8 +356,9 @@ bool PropertyItem::testStatus(App::Property::Status pos) const { std::vector::const_iterator it; for (it = propertyItems.begin(); it != propertyItems.end(); ++it) { - if ((*it)->testStatus(pos)) + if ((*it)->testStatus(pos)) { return true; + } } return false; } @@ -356,72 +385,113 @@ QVariant PropertyItem::toolTip(const App::Property* prop) const return {str}; } -QVariant PropertyItem::decoration(const QVariant&) const +QVariant PropertyItem::decoration(const QVariant& value) const { + Q_UNUSED(value) return {}; } +QString PropertyItem::asNone(const Py::Object& pyobj) const +{ + Q_UNUSED(pyobj) + return QString::fromUtf8(""); +} + +QString PropertyItem::asString(const Py::Object& pyobj) const +{ + return QString::fromStdString(pyobj.as_string()); +} + +QString PropertyItem::asSequence(const Py::Object& pyobj) const +{ + std::ostringstream ss; + ss << '['; + Py::Sequence seq(pyobj); + bool first = true; + Py_ssize_t i = 0; + for (i=0; i < 2 && i < seq.size(); ++i) { + if (first) { + first = false; + } + else { + ss << ", "; + } + ss << Py::Object(seq[i]).as_string(); + } + + if (i < seq.size()) { + ss << "..."; + } + ss << ']'; + return QString::fromUtf8(ss.str().c_str()); +} + +QString PropertyItem::asMapping(const Py::Object& pyobj) const +{ + std::ostringstream ss; + ss << '{'; + Py::Mapping map(pyobj); + bool first = true; + auto it = map.begin(); + for (int i = 0; i < 2 && it != map.end(); ++it, ++i) { + if (first) { + first = false; + } + else { + ss << ", "; + } + const auto &v = *it; + ss << Py::Object(v.first).as_string() << ':' << Py::Object(v.second).as_string(); + } + + if (it != map.end()) { + ss << "..."; + } + ss << '}'; + return QString::fromUtf8(ss.str().c_str()); +} + +QString PropertyItem::toString(const Py::Object& pyobj) const +{ + if (pyobj.isNone()) { + return asNone(pyobj); + } + if (pyobj.isSequence()) { + return asSequence(pyobj); + } + if (pyobj.isMapping()) { + return asMapping(pyobj); + } + + return asString(pyobj); +} + QVariant PropertyItem::toString(const QVariant& prop) const { - if (prop != QVariant() || propertyItems.size()!=1) + if (prop != QVariant() || propertyItems.size()!=1) { return prop; + } std::ostringstream ss; Base::PyGILStateLocker lock; try { - Py::Object pyobj(propertyItems[0]->getPyObject(),true); - if(pyobj.isNone()) { - ss << ""; - } - else if(pyobj.isSequence()) { - ss << '['; - Py::Sequence seq(pyobj); - bool first = true; - Py_ssize_t i=0; - for (i=0; i<2 && i < seq.size(); ++i) { - if (first) - first = false; - else - ss << ", "; - ss << Py::Object(seq[i]).as_string(); - } - - if (i < seq.size()) - ss << "..."; - ss << ']'; - } - else if (pyobj.isMapping()) { - ss << '{'; - Py::Mapping map(pyobj); - bool first = true; - auto it = map.begin(); - for(int i=0; i<2 && it != map.end(); ++it, ++i) { - if (first) - first = false; - else - ss << ", "; - const auto &v = *it; - ss << Py::Object(v.first).as_string() << ':' << Py::Object(v.second).as_string(); - } - - if (it != map.end()) - ss << "..."; - ss << '}'; - } - else - ss << pyobj.as_string(); - - } catch (Py::Exception &) { + Py::Object pyobj(propertyItems[0]->getPyObject(), true); + return toString(pyobj); + } + catch (Py::Exception &) { Base::PyException e; ss.str(""); ss << "ERR: " << e.what(); - } catch (Base::Exception &e) { + } + catch (Base::Exception &e) { ss.str(""); ss << "ERR: " << e.what(); - } catch (std::exception &e) { + } + catch (std::exception &e) { ss.str(""); ss << "ERR: " << e.what(); - } catch (...) { + } + catch (...) { ss.str(""); ss << "ERR!"; } @@ -454,12 +524,13 @@ QVariant PropertyItem::editorData(QWidget * /*editor*/) const QWidget* PropertyItem::createExpressionEditor(QWidget* parent, const QObject* receiver, const char* method) const { - if(!isBound()) + if(!isBound()) { return nullptr; + } auto le = new ExpLineEdit(parent,true); le->setFrame(false); le->setReadOnly(true); - QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method); + QObject::connect(le, SIGNAL(textChanged(QString)), receiver, method); le->bind(getPath()); le->setAutoApply(autoApply()); return le; @@ -468,15 +539,17 @@ QWidget* PropertyItem::createExpressionEditor(QWidget* parent, const QObject* re void PropertyItem::setExpressionEditorData(QWidget *editor, const QVariant& data) const { auto le = qobject_cast(editor); - if(le) + if (le) { le->setText(data.toString()); + } } QVariant PropertyItem::expressionEditorData(QWidget *editor) const { auto le = qobject_cast(editor); - if(le) + if(le) { return {le->text()}; + } return {}; } @@ -488,8 +561,7 @@ PropertyEditorWidget* PropertyItem::createPropertyEditorWidget(QWidget* parent) if (!props.empty() && props[0]->getName() && props[0]->testStatus(App::Property::UserEdit) - && props[0]->getContainer()) - { + && props[0]->getContainer()) { props[0]->getContainer()->editProperty(props[0]->getName()); } }); @@ -498,17 +570,20 @@ PropertyEditorWidget* PropertyItem::createPropertyEditorWidget(QWidget* parent) QString PropertyItem::propertyName() const { - if (propName.isEmpty()) + if (propName.isEmpty()) { return QLatin1String(QT_TRANSLATE_NOOP("App::Property", "")); + } return propName; } -void PropertyItem::setPropertyName(QString name, QString realName) +void PropertyItem::setPropertyName(const QString& name, const QString& realName) { - if(realName.size()) + if (realName.size()) { propName = realName; - else + } + else { propName = name; + } setObjectName(propName); @@ -519,8 +594,9 @@ void PropertyItem::setPropertyName(QString name, QString realName) // if there is a sequence of capital letters do not insert spaces if (!upper) { QChar last = display.at(display.length()-1); - if (!last.isSpace()) + if (!last.isSpace()) { display += QLatin1String(" "); + } } } upper = i.isUpper(); @@ -541,8 +617,9 @@ void PropertyItem::setPropertyValue(const QString& value) std::ostringstream ss; for (auto prop : propertyItems) { App::PropertyContainer* parent = prop->getContainer(); - if (!parent || parent->isReadOnly(prop) || prop->testStatus(App::Property::ReadOnly)) + if (!parent || parent->isReadOnly(prop) || prop->testStatus(App::Property::ReadOnly)) { continue; + } if (parent->isDerivedFrom(App::Document::getClassTypeId())) { auto doc = static_cast(parent); @@ -569,8 +646,9 @@ void PropertyItem::setPropertyValue(const QString& value) } std::string cmd = ss.str(); - if (cmd.empty()) + if (cmd.empty()) { return; + } try { Gui::Command::runCommand(Gui::Command::App, cmd.c_str()); @@ -587,92 +665,105 @@ void PropertyItem::setPropertyValue(const QString& value) } } +QVariant PropertyItem::dataProperty(int role) const +{ + if (role == Qt::ForegroundRole && linked) { + return QVariant::fromValue(QColor(0x20, 0xaa, 0x20)); // NOLINT + } + + if (role == Qt::BackgroundRole || role == Qt::ForegroundRole) { + if (PropertyView::showAll() + && propertyItems.size() == 1 + && propertyItems.front()->testStatus(App::Property::PropDynamic) + && !propertyItems.front()->testStatus(App::Property::LockDynamic)) { + return role == Qt::BackgroundRole + ? QVariant::fromValue(QColor(0xFF, 0xFF, 0x99)) // NOLINT + : QVariant::fromValue(QColor(0, 0, 0)); + } + return {}; + } + if (role == Qt::DisplayRole) { + return displayName(); + } + // no properties set + if (propertyItems.empty()) { + return {}; + } + if (role == Qt::ToolTipRole) { + QString type = QString::fromLatin1("Type: %1\nName: %2").arg( + QString::fromLatin1(propertyItems[0]->getTypeId().getName()), objectName()); + + QString doc = PropertyItem::toolTip(propertyItems[0]).toString(); + if (doc.isEmpty()) { + doc = toolTip(propertyItems[0]).toString(); + } + if (doc.size()) { + return type + QLatin1String("\n\n") + doc; + } + return type; + } + + return {}; +} + +QVariant PropertyItem::dataValue(int role) const +{ + // no properties set + if (propertyItems.empty()) { + PropertyItem* parent = this->parent(); + if (!parent || !parent->parent()) { + return {}; + } + if (role == Qt::EditRole) { + return parent->property(qPrintable(objectName())); + } + if (role == Qt::DecorationRole) { + QVariant val = parent->property(qPrintable(objectName())); + return decoration(val); + } + if (role == Qt::DisplayRole) { + QVariant val = parent->property(qPrintable(objectName())); + return toString(val); + } + if (role == Qt::ForegroundRole) { + if (hasExpression()) { + return QVariant::fromValue(QApplication::palette().color(QPalette::Link)); + } + return {}; + } + + return {}; + } + if (role == Qt::EditRole) { + return value(propertyItems[0]); + } + if (role == Qt::DecorationRole) { + return decoration(value(propertyItems[0])); + } + if (role == Qt::DisplayRole) { + return toString(value(propertyItems[0])); + } + if (role == Qt::ToolTipRole) { + return toolTip(propertyItems[0]); + } + if (role == Qt::ForegroundRole) { + if (hasExpression()) { + return QVariant::fromValue(QApplication::palette().color(QPalette::Link)); + } + return {}; + } + + return {}; +} + QVariant PropertyItem::data(int column, int role) const { // property name if (column == 0) { - if (role == Qt::ForegroundRole && linked) - return QVariant::fromValue(QColor(0x20,0xaa,0x20)); - - if (role == Qt::BackgroundRole || role == Qt::ForegroundRole) { - if(PropertyView::showAll() - && propertyItems.size() == 1 - && propertyItems.front()->testStatus(App::Property::PropDynamic) - && !propertyItems.front()->testStatus(App::Property::LockDynamic)) - { - return role==Qt::BackgroundRole - ? QVariant::fromValue(QColor(0xFF,0xFF,0x99)) - : QVariant::fromValue(QColor(0,0,0)); - } - return {}; - } - if (role == Qt::DisplayRole) { - return displayName(); - } - // no properties set - if (propertyItems.empty()) { - return {}; - } - else if (role == Qt::ToolTipRole) { - QString type = QString::fromLatin1("Type: %1\nName: %2").arg( - QString::fromLatin1(propertyItems[0]->getTypeId().getName()), objectName()); - - QString doc = PropertyItem::toolTip(propertyItems[0]).toString(); - if(doc.isEmpty()) - doc = toolTip(propertyItems[0]).toString(); - if(doc.size()) - return type + QLatin1String("\n\n") + doc; - return type; - } - - return {}; + return dataProperty(role); } - else { - // no properties set - if (propertyItems.empty()) { - PropertyItem* parent = this->parent(); - if (!parent || !parent->parent()) { - return {}; - } - if (role == Qt::EditRole) { - return parent->property(qPrintable(objectName())); - } - else if (role == Qt::DecorationRole) { - QVariant val = parent->property(qPrintable(objectName())); - return decoration(val); - } - else if (role == Qt::DisplayRole) { - QVariant val = parent->property(qPrintable(objectName())); - return toString(val); - } - else if (role == Qt::ForegroundRole) { - if (hasExpression()) - return QVariant::fromValue(QApplication::palette().color(QPalette::Link)); - return {}; - } - return {}; - } - if (role == Qt::EditRole) { - return value(propertyItems[0]); - } - else if (role == Qt::DecorationRole) { - return decoration(value(propertyItems[0])); - } - else if (role == Qt::DisplayRole) { - return toString(value(propertyItems[0])); - } - else if (role == Qt::ToolTipRole) { - return toolTip(propertyItems[0]); - } - else if( role == Qt::ForegroundRole) { - if (hasExpression()) - return QVariant::fromValue(QApplication::palette().color(QPalette::Link)); - return {}; - } - - return {}; - } + return dataValue(role); } bool PropertyItem::setData (const QVariant& value) @@ -683,30 +774,33 @@ bool PropertyItem::setData (const QVariant& value) // property or delegates again to its parent... if (propertyItems.empty()) { PropertyItem* parent = this->parent(); - if (!parent || !parent->parent() || hasAnyExpression()) + if (!parent || !parent->parent() || hasAnyExpression()) { return false; + } + parent->setProperty(qPrintable(objectName()),value); return true; } - else { - setValue(value); - return true; - } + + setValue(value); + return true; } Qt::ItemFlags PropertyItem::flags(int column) const { Qt::ItemFlags basicFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - if (column == 1 && !isReadOnly()) + if (column == 1 && !isReadOnly()) { return basicFlags | Qt::ItemIsEditable; - else - return basicFlags; + } + + return basicFlags; } int PropertyItem::row() const { - if (parentItem) - return parentItem->childItems.indexOf(const_cast(this)); + if (parentItem) { + return parentItem->childItems.indexOf(const_cast(this)); // NOLINT + } return 0; } @@ -755,8 +849,9 @@ QVariant PropertyStringItem::value(const App::Property* prop) const void PropertyStringItem::setValue(const QVariant& value) { if(!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QString val = value.toString(); val = QString::fromUtf8(Base::Interpreter().strToPython(val.toUtf8()).c_str()); QString data = QString::fromLatin1("\"%1\"").arg(val); @@ -769,7 +864,7 @@ QWidget* PropertyStringItem::createEditor(QWidget* parent, const QObject* receiv auto le = new ExpLineEdit(parent); le->setFrame(false); le->setReadOnly(isReadOnly()); - QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method); + QObject::connect(le, SIGNAL(textChanged(QString)), receiver, method); if(isBound()) { le->bind(getPath()); le->setAutoApply(autoApply()); @@ -806,8 +901,10 @@ QVariant PropertyFontItem::value(const App::Property* prop) const void PropertyFontItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } + QString val = value.toString(); QString data = QString::fromLatin1("\"%1\"").arg(val); setPropertyValue(data); @@ -818,7 +915,7 @@ QWidget* PropertyFontItem::createEditor(QWidget* parent, const QObject* receiver auto cb = new QComboBox(parent); cb->setFrame(false); cb->setDisabled(isReadOnly()); - QObject::connect(cb, SIGNAL(activated(const QString&)), receiver, method); + QObject::connect(cb, SIGNAL(activated(QString)), receiver, method); return cb; } @@ -871,8 +968,9 @@ void PropertyIntegerItem::setValue(const QVariant& value) { //if the item has an expression it issues the python code if (!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } int val = value.toInt(); QString data = QString::fromLatin1("%1").arg(val); setPropertyValue(data); @@ -911,8 +1009,9 @@ QVariant PropertyIntegerItem::toString(const QVariant& v) const { QString string(PropertyItem::toString(v).toString()); - if (hasExpression()) + if (hasExpression()) { string += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {string}; } @@ -936,8 +1035,9 @@ void PropertyIntegerConstraintItem::setValue(const QVariant& value) { //if the item has an expression it issues the python code if (!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } int val = value.toInt(); QString data = QString::fromLatin1("%1").arg(val); setPropertyValue(data); @@ -971,9 +1071,9 @@ void PropertyIntegerConstraintItem::setEditorData(QWidget *editor, const QVarian auto sb = qobject_cast(editor); if (c) { - sb->setMinimum(c->LowerBound); - sb->setMaximum(c->UpperBound); - sb->setSingleStep(c->StepSize); + sb->setMinimum(int(c->LowerBound)); + sb->setMaximum(int(c->UpperBound)); + sb->setSingleStep(int(c->StepSize)); } else { sb->setMinimum(min); @@ -994,8 +1094,9 @@ QVariant PropertyIntegerConstraintItem::toString(const QVariant& v) const { QString string(PropertyItem::toString(v).toString()); - if (hasExpression()) + if (hasExpression()) { string += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {string}; } @@ -1012,8 +1113,9 @@ QVariant PropertyFloatItem::toString(const QVariant& prop) const double value = prop.toDouble(); QString data = QLocale().toString(value, 'f', decimals()); - if (hasExpression()) + if (hasExpression()) { data += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {data}; } @@ -1030,10 +1132,11 @@ void PropertyFloatItem::setValue(const QVariant& value) { //if the item has an expression it issues the python code if (!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } double val = value.toDouble(); - QString data = QString::fromLatin1("%1").arg(val, 0, 'g', 16); + QString data = QString::fromLatin1("%1").arg(val, 0, 'g', highPrec); setPropertyValue(data); } } @@ -1078,8 +1181,9 @@ QVariant PropertyUnitItem::toString(const QVariant& prop) const { const Base::Quantity& unit = prop.value(); QString string = unit.getUserString(); - if (hasExpression()) + if (hasExpression()) { string += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {string}; } @@ -1096,11 +1200,12 @@ void PropertyUnitItem::setValue(const QVariant& value) { //if the item has an expression it handles the python code if (!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } const Base::Quantity& val = value.value(); - Base::QuantityFormat format(Base::QuantityFormat::Default, 16); + Base::QuantityFormat format(Base::QuantityFormat::Default, highPrec); QString unit = Base::UnitsApi::toString(val, format); setPropertyValue(unit); } @@ -1200,10 +1305,11 @@ void PropertyFloatConstraintItem::setValue(const QVariant& value) { //if the item has an expression it issues the python code if (!hasExpression()) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } double val = value.toDouble(); - QString data = QString::fromLatin1("%1").arg(val, 0, 'g', 16); + QString data = QString::fromLatin1("%1").arg(val, 0, 'g', highPrec); setPropertyValue(data); } } @@ -1261,7 +1367,7 @@ PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyPrecisionItem) PropertyPrecisionItem::PropertyPrecisionItem() { - setDecimals(16); + setDecimals(highPrec); } // -------------------------------------------------------------------- @@ -1296,8 +1402,9 @@ QVariant PropertyBoolItem::value(const App::Property* prop) const void PropertyBoolItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } bool val = value.toBool(); QString data = (val ? QLatin1String("True") : QLatin1String("False")); setPropertyValue(data); @@ -1328,7 +1435,7 @@ QVariant PropertyBoolItem::editorData(QWidget *editor) const // --------------------------------------------------------------- -namespace Gui { namespace PropertyEditor { +namespace Gui::PropertyEditor { class VectorLineEdit : public Gui::ExpLineEdit { int decimals; @@ -1340,6 +1447,7 @@ public: } bool apply(const std::string &propName) override { + // NOLINTNEXTLINE if (!ExpressionBinding::apply(propName)) { // clazy:exclude=skipped-base-method QVariant data = property("coords"); if (data.canConvert()) { @@ -1358,7 +1466,7 @@ public: return false; } }; -}} +} // --------------------------------------------------------------- @@ -1385,11 +1493,12 @@ QVariant PropertyVectorItem::toString(const QVariant& prop) const QLocale loc; const Base::Vector3d& value = prop.value(); QString data = QString::fromLatin1("[%1 %2 %3]") - .arg(loc.toString(value.x, 'f', 2), - loc.toString(value.y, 'f', 2), - loc.toString(value.z, 'f', 2)); - if (hasExpression()) + .arg(loc.toString(value.x, 'f', lowPrec), + loc.toString(value.y, 'f', lowPrec), + loc.toString(value.z, 'f', lowPrec)); + if (hasExpression()) { data += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {data}; } @@ -1403,13 +1512,14 @@ QVariant PropertyVectorItem::value(const App::Property* prop) const void PropertyVectorItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } const Base::Vector3d& val = value.value(); QString data = QString::fromLatin1("(%1, %2, %3)") - .arg(val.x,0,'g',16) - .arg(val.y,0,'g',16) - .arg(val.z,0,'g',16); + .arg(val.x, 0, 'g', highPrec) + .arg(val.y, 0, 'g', highPrec) + .arg(val.z, 0, 'g', highPrec); setPropertyValue(data); } @@ -1433,9 +1543,9 @@ void PropertyVectorItem::setEditorData(QWidget *editor, const QVariant& data) co auto le = qobject_cast(editor); const Base::Vector3d& value = data.value(); QString text = QString::fromLatin1("[%1 %2 %3]") - .arg(loc.toString(value.x, 'f', 2), - loc.toString(value.y, 'f', 2), - loc.toString(value.z, 'f', 2)); + .arg(loc.toString(value.x, 'f', lowPrec), + loc.toString(value.y, 'f', lowPrec), + loc.toString(value.z, 'f', lowPrec)); le->setProperty("coords", data); le->setText(text); } @@ -1526,7 +1636,6 @@ void PropertyEditorWidget::showValue(const QVariant &d) lineEdit->setText(d.toString()); } - QVariant PropertyEditorWidget::value() const { return variant; @@ -1550,13 +1659,13 @@ VectorListWidget::VectorListWidget(int decimals, QWidget *parent) void VectorListWidget::buttonClicked() { - VectorListEditor* dlg = new VectorListEditor(decimals, this); + auto dlg = new VectorListEditor(decimals, this); dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->setValues(value().value>()); QPoint p(0, 0); p = this->mapToGlobal(p); dlg->move(p); - connect(dlg, &VectorListEditor::accepted, this, [&] { + connect(dlg, &VectorListEditor::accepted, this, [this, dlg] { QVariant data = QVariant::fromValue>(dlg->getValues()); setValue(data); }); @@ -1574,9 +1683,9 @@ void VectorListWidget::showValue(const QVariant& d) } else { data = QString::fromLatin1("[%1 %2 %3], ...") - .arg(loc.toString(value[0].x, 'f', 2), - loc.toString(value[0].y, 'f', 2), - loc.toString(value[0].z, 'f', 2)); + .arg(loc.toString(value[0].x, 'f', lowPrec), + loc.toString(value[0].y, 'f', lowPrec), + loc.toString(value[0].z, 'f', lowPrec)); } lineEdit->setText(data); } @@ -1596,13 +1705,14 @@ QVariant PropertyVectorListItem::toString(const QVariant& prop) const } else { data = QString::fromLatin1("[%1 %2 %3], ...") - .arg(loc.toString(value[0].x, 'f', 2), - loc.toString(value[0].y, 'f', 2), - loc.toString(value[0].z, 'f', 2)); + .arg(loc.toString(value[0].x, 'f', lowPrec), + loc.toString(value[0].y, 'f', lowPrec), + loc.toString(value[0].z, 'f', lowPrec)); } - if (hasExpression()) + if (hasExpression()) { data += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {data}; } @@ -1618,17 +1728,18 @@ QVariant PropertyVectorListItem::value(const App::Property* prop) const void PropertyVectorListItem::setValue(const QVariant& value) { - if (!value.canConvert>()) + if (!value.canConvert>()) { return; + } const QList& val = value.value>(); QString data; QTextStream str(&data); str << "["; for (const auto& it : val) { str << QString::fromLatin1("(%1, %2, %3), ") - .arg(it.x, 0, 'g', 16) - .arg(it.y, 0, 'g', 16) - .arg(it.z, 0, 'g', 16); + .arg(it.x, 0, 'g', highPrec) + .arg(it.y, 0, 'g', highPrec) + .arg(it.z, 0, 'g', highPrec); } str << "]"; setPropertyValue(data); @@ -1637,7 +1748,7 @@ void PropertyVectorListItem::setValue(const QVariant& value) QWidget* PropertyVectorListItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const { auto pe = new VectorListWidget(decimals(), parent); - QObject::connect(pe, SIGNAL(valueChanged(const QVariant &)), receiver, method); + QObject::connect(pe, SIGNAL(valueChanged(QVariant)), receiver, method); pe->setDisabled(isReadOnly()); return pe; } @@ -1681,8 +1792,9 @@ QVariant PropertyVectorDistanceItem::toString(const QVariant& prop) const Base::Quantity(value.x, Base::Unit::Length).getUserString() + QString::fromLatin1(" ") + Base::Quantity(value.y, Base::Unit::Length).getUserString() + QString::fromLatin1(" ") + Base::Quantity(value.z, Base::Unit::Length).getUserString() + QString::fromLatin1("]"); - if (hasExpression()) + if (hasExpression()) { data += QString::fromLatin1(" ( %1 )").arg(QString::fromStdString(getExpressionString())); + } return {data}; } @@ -1697,15 +1809,16 @@ QVariant PropertyVectorDistanceItem::value(const App::Property* prop) const void PropertyVectorDistanceItem::setValue(const QVariant& variant) { - if (hasExpression() || !variant.canConvert()) + if (hasExpression() || !variant.canConvert()) { return; + } const Base::Vector3d& value = variant.value(); Base::Quantity x = Base::Quantity(value.x, Base::Unit::Length); Base::Quantity y = Base::Quantity(value.y, Base::Unit::Length); Base::Quantity z = Base::Quantity(value.z, Base::Unit::Length); - Base::QuantityFormat format(Base::QuantityFormat::Default, 16); + Base::QuantityFormat format(Base::QuantityFormat::Default, highPrec); QString data = QString::fromLatin1("(%1, %2, %3)") .arg(Base::UnitsApi::toNumber(x, format), Base::UnitsApi::toNumber(y, format), @@ -1789,7 +1902,7 @@ PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyMatrixItem) PropertyMatrixItem::PropertyMatrixItem() { - const int decimals=16; + const int decimals = highPrec; m_a11 = static_cast(PropertyFloatItem::create()); m_a11->setParent(this); m_a11->setPropertyName(QLatin1String("A11")); @@ -1876,23 +1989,25 @@ QVariant PropertyMatrixItem::toString(const QVariant& prop) const { QLocale loc; const Base::Matrix4D& value = prop.value(); + // NOLINTBEGIN QString text = QString::fromLatin1("[%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16]") - .arg(loc.toString(value[0][0], 'f', 2), //(unsigned short usNdx) - loc.toString(value[0][1], 'f', 2), - loc.toString(value[0][2], 'f', 2), - loc.toString(value[0][3], 'f', 2), - loc.toString(value[1][0], 'f', 2), - loc.toString(value[1][1], 'f', 2), - loc.toString(value[1][2], 'f', 2), - loc.toString(value[1][3], 'f', 2), - loc.toString(value[2][0], 'f', 2)) - .arg(loc.toString(value[2][1], 'f', 2), - loc.toString(value[2][2], 'f', 2), - loc.toString(value[2][3], 'f', 2), - loc.toString(value[3][0], 'f', 2), - loc.toString(value[3][1], 'f', 2), - loc.toString(value[3][2], 'f', 2), - loc.toString(value[3][3], 'f', 2)); + .arg(loc.toString(value[0][0], 'f', lowPrec), //(unsigned short usNdx) + loc.toString(value[0][1], 'f', lowPrec), + loc.toString(value[0][2], 'f', lowPrec), + loc.toString(value[0][3], 'f', lowPrec), + loc.toString(value[1][0], 'f', lowPrec), + loc.toString(value[1][1], 'f', lowPrec), + loc.toString(value[1][2], 'f', lowPrec), + loc.toString(value[1][3], 'f', lowPrec), + loc.toString(value[2][0], 'f', lowPrec)) + .arg(loc.toString(value[2][1], 'f', lowPrec), + loc.toString(value[2][2], 'f', lowPrec), + loc.toString(value[2][3], 'f', lowPrec), + loc.toString(value[3][0], 'f', lowPrec), + loc.toString(value[3][1], 'f', lowPrec), + loc.toString(value[3][2], 'f', lowPrec), + loc.toString(value[3][3], 'f', lowPrec)); + // NOLINTEND return {text}; } @@ -1914,26 +2029,29 @@ QVariant PropertyMatrixItem::toolTip(const App::Property* prop) const void PropertyMatrixItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } const Base::Matrix4D& val = value.value(); + // NOLINTBEGIN QString data = QString::fromLatin1("FreeCAD.Matrix(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16)") - .arg(val[0][0],0, 'g', 16) - .arg(val[0][1],0, 'g', 16) - .arg(val[0][2],0, 'g', 16) - .arg(val[0][3],0, 'g', 16) - .arg(val[1][0],0, 'g', 16) - .arg(val[1][1],0, 'g', 16) - .arg(val[1][2],0, 'g', 16) - .arg(val[1][3],0, 'g', 16) - .arg(val[2][0],0, 'g', 16) - .arg(val[2][1],0, 'g', 16) - .arg(val[2][2],0, 'g', 16) - .arg(val[2][3],0, 'g', 16) - .arg(val[3][0],0, 'g', 16) - .arg(val[3][1],0, 'g', 16) - .arg(val[3][2],0, 'g', 16) - .arg(val[3][3],0, 'g', 16); + .arg(val[0][0],0, 'g', highPrec) + .arg(val[0][1],0, 'g', highPrec) + .arg(val[0][2],0, 'g', highPrec) + .arg(val[0][3],0, 'g', highPrec) + .arg(val[1][0],0, 'g', highPrec) + .arg(val[1][1],0, 'g', highPrec) + .arg(val[1][2],0, 'g', highPrec) + .arg(val[1][3],0, 'g', highPrec) + .arg(val[2][0],0, 'g', highPrec) + .arg(val[2][1],0, 'g', highPrec) + .arg(val[2][2],0, 'g', highPrec) + .arg(val[2][3],0, 'g', highPrec) + .arg(val[3][0],0, 'g', highPrec) + .arg(val[3][1],0, 'g', highPrec) + .arg(val[3][2],0, 'g', highPrec) + .arg(val[3][3],0, 'g', highPrec); + // NOLINTEND setPropertyValue(data); } @@ -1950,23 +2068,25 @@ void PropertyMatrixItem::setEditorData(QWidget *editor, const QVariant& data) co QLocale loc; auto le = qobject_cast(editor); const Base::Matrix4D& value = data.value(); + // NOLINTBEGIN QString text = QString::fromLatin1("[%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16]") - .arg(loc.toString(value[0][0], 'f', 2), //(unsigned short usNdx) - loc.toString(value[0][1], 'f', 2), - loc.toString(value[0][2], 'f', 2), - loc.toString(value[0][3], 'f', 2), - loc.toString(value[1][0], 'f', 2), - loc.toString(value[1][1], 'f', 2), - loc.toString(value[1][2], 'f', 2), - loc.toString(value[1][3], 'f', 2), - loc.toString(value[2][0], 'f', 2)) - .arg(loc.toString(value[2][1], 'f', 2), - loc.toString(value[2][2], 'f', 2), - loc.toString(value[2][3], 'f', 2), - loc.toString(value[3][0], 'f', 2), - loc.toString(value[3][1], 'f', 2), - loc.toString(value[3][2], 'f', 2), - loc.toString(value[3][3], 'f', 2)); + .arg(loc.toString(value[0][0], 'f', lowPrec), //(unsigned short usNdx) + loc.toString(value[0][1], 'f', lowPrec), + loc.toString(value[0][2], 'f', lowPrec), + loc.toString(value[0][3], 'f', lowPrec), + loc.toString(value[1][0], 'f', lowPrec), + loc.toString(value[1][1], 'f', lowPrec), + loc.toString(value[1][2], 'f', lowPrec), + loc.toString(value[1][3], 'f', lowPrec), + loc.toString(value[2][0], 'f', lowPrec)) + .arg(loc.toString(value[2][1], 'f', lowPrec), + loc.toString(value[2][2], 'f', lowPrec), + loc.toString(value[2][3], 'f', lowPrec), + loc.toString(value[3][0], 'f', lowPrec), + loc.toString(value[3][1], 'f', lowPrec), + loc.toString(value[3][2], 'f', lowPrec), + loc.toString(value[3][3], 'f', lowPrec)); + // NOLINTEND le->setText(text); } @@ -1976,165 +2096,215 @@ QVariant PropertyMatrixItem::editorData(QWidget *editor) const return {le->text()}; } +// clang-format off double PropertyMatrixItem::getA11() const { - return data(1,Qt::EditRole).value()[0][0]; + return data(1, Qt::EditRole).value()[0][0]; } void PropertyMatrixItem::setA11(double A11) { - setData(QVariant::fromValue(Base::Matrix4D(A11,getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(A11, getA12(), getA13(),getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA12() const { - return data(1,Qt::EditRole).value()[0][1]; + return data(1, Qt::EditRole).value()[0][1]; } void PropertyMatrixItem::setA12(double A12) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),A12,getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), A12, getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA13() const { - return data(1,Qt::EditRole).value()[0][2]; + return data(1, Qt::EditRole).value()[0][2]; } void PropertyMatrixItem::setA13(double A13) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),A13,getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), A13, getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA14() const { - return data(1,Qt::EditRole).value()[0][3]; + return data(1, Qt::EditRole).value()[0][3]; } void PropertyMatrixItem::setA14(double A14) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),A14,getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), A14, + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA21() const { - return data(1,Qt::EditRole).value()[1][0]; + return data(1, Qt::EditRole).value()[1][0]; } void PropertyMatrixItem::setA21(double A21) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),A21,getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + A21, getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA22() const { - return data(1,Qt::EditRole).value()[1][1]; + return data(1, Qt::EditRole).value()[1][1]; } void PropertyMatrixItem::setA22(double A22) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),A22,getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), A22, getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA23() const { - return data(1,Qt::EditRole).value()[1][2]; + return data(1, Qt::EditRole).value()[1][2]; } void PropertyMatrixItem::setA23(double A23) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),A23,getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), A23, getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA24() const { - return data(1,Qt::EditRole).value()[1][3]; + return data(1, Qt::EditRole).value()[1][3]; } void PropertyMatrixItem::setA24(double A24) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),A24,getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), A24, + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA31() const { - return data(1,Qt::EditRole).value()[2][0]; + return data(1, Qt::EditRole).value()[2][0]; } void PropertyMatrixItem::setA31(double A31) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),A31,getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + A31, getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA32() const { - return data(1,Qt::EditRole).value()[2][1]; + return data(1, Qt::EditRole).value()[2][1]; } void PropertyMatrixItem::setA32(double A32) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),A32,getA33(),getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), A32, getA33(), getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA33() const { - return data(1,Qt::EditRole).value()[2][2]; + return data(1, Qt::EditRole).value()[2][2]; } void PropertyMatrixItem::setA33(double A33) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),A33,getA34(),getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), A33, getA34(), + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA34() const { - return data(1,Qt::EditRole).value()[2][3]; + return data(1, Qt::EditRole).value()[2][3]; } void PropertyMatrixItem::setA34(double A34) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),A34,getA41(),getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), A34, + getA41(), getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA41() const { - return data(1,Qt::EditRole).value()[3][0]; + return data(1, Qt::EditRole).value()[3][0]; } void PropertyMatrixItem::setA41(double A41) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),A41,getA42(),getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + A41, getA42(), getA43(), getA44()))); } double PropertyMatrixItem::getA42() const { - return data(1,Qt::EditRole).value()[3][1]; + return data(1, Qt::EditRole).value()[3][1]; } void PropertyMatrixItem::setA42(double A42) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),A42,getA43(),getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), A42, getA43(), getA44()))); } double PropertyMatrixItem::getA43() const { - return data(1,Qt::EditRole).value()[3][2]; + return data(1, Qt::EditRole).value()[3][2]; } void PropertyMatrixItem::setA43(double A43) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),A43,getA44() ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), A43, getA44()))); } double PropertyMatrixItem::getA44() const { - return data(1,Qt::EditRole).value()[3][3]; + return data(1, Qt::EditRole).value()[3][3]; } void PropertyMatrixItem::setA44(double A44) { - setData(QVariant::fromValue(Base::Matrix4D(getA11(),getA12(),getA13(),getA14(),getA21(),getA22(),getA23(),getA24(),getA31(),getA32(),getA33(),getA34(),getA41(),getA42(),getA43(),A44 ))); + setData(QVariant::fromValue(Base::Matrix4D(getA11(), getA12(), getA13(), getA14(), + getA21(), getA22(), getA23(), getA24(), + getA31(), getA32(), getA33(), getA34(), + getA41(), getA42(), getA43(), A44))); } +// clang-format on // --------------------------------------------------------------- @@ -2153,8 +2323,9 @@ void RotationHelper::setChanged(bool value) bool RotationHelper::hasChangedAndReset() { - if (!changed_value) + if (!changed_value) { return false; + } changed_value = false; return true; @@ -2180,11 +2351,12 @@ void RotationHelper::getValue(Base::Vector3d& axis, double& angle) const double RotationHelper::getAngle(const Base::Rotation& val) const { - double angle; + double angle {}; Base::Vector3d dir; val.getRawValue(dir, angle); - if (dir * this->rot_axis < 0.0) + if (dir * this->rot_axis < 0.0) { angle = -angle; + } return angle; } @@ -2210,10 +2382,12 @@ Base::Rotation RotationHelper::setAxis(const Base::Rotation& value, const Base:: { this->rot_axis = axis; Base::Rotation rot = value; - Base::Vector3d dummy; double angle; + Base::Vector3d dummy; + double angle {}; rot.getValue(dummy, angle); - if (dummy * axis < 0.0) + if (dummy * axis < 0.0) { angle = -angle; + } rot.setValue(axis, angle); changed_value = true; return rot; @@ -2221,18 +2395,20 @@ Base::Rotation RotationHelper::setAxis(const Base::Rotation& value, const Base:: void RotationHelper::assignProperty(const Base::Rotation& value, double eps) { - double angle; + double angle {}; Base::Vector3d dir; value.getRawValue(dir, angle); Base::Vector3d cross = this->rot_axis.Cross(dir); double len2 = cross.Sqr(); if (angle != 0) { // vectors are not parallel - if (len2 > eps) + if (len2 > eps) { this->rot_axis = dir; + } // vectors point into opposite directions - else if (this->rot_axis.Dot(dir) < 0) + else if (this->rot_axis.Dot(dir) < 0) { this->rot_axis = -this->rot_axis; + } } this->rot_angle = Base::toDegrees(angle); } @@ -2259,8 +2435,9 @@ PropertyRotationItem::~PropertyRotationItem() = default; Base::Quantity PropertyRotationItem::getAngle() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return Base::Quantity(0.0); + } const Base::Rotation& val = value.value(); double angle = h.getAngle(val); @@ -2270,8 +2447,9 @@ Base::Quantity PropertyRotationItem::getAngle() const void PropertyRotationItem::setAngle(Base::Quantity angle) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } Base::Rotation rot = h.setAngle(angle.getValue()); setValue(QVariant::fromValue(rot)); @@ -2285,8 +2463,9 @@ Base::Vector3d PropertyRotationItem::getAxis() const void PropertyRotationItem::setAxis(const Base::Vector3d& axis) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto rot = value.value(); rot = h.setAxis(rot, axis); @@ -2297,7 +2476,7 @@ void PropertyRotationItem::assignProperty(const App::Property* prop) { // Choose an adaptive epsilon to avoid changing the axis when they are considered to // be equal. See https://forum.freecad.org/viewtopic.php?f=10&t=24662&start=10 - double eps = std::pow(10.0, -2*(decimals()+1)); + double eps = std::pow(10.0, -2 * (decimals() + 1)); // NOLINT if (prop->isDerivedFrom()) { const Base::Rotation& value = static_cast(prop)->getValue(); h.assignProperty(value, eps); @@ -2309,7 +2488,7 @@ QVariant PropertyRotationItem::value(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const Base::Rotation& value = static_cast(prop)->getValue(); - double angle; + double angle {}; Base::Vector3d dir; value.getRawValue(dir, angle); if (!h.isAxisInitialized()) { @@ -2346,7 +2525,7 @@ QVariant PropertyRotationItem::toolTip(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const Base::Rotation& p = static_cast(prop)->getValue(); - double angle; + double angle {}; Base::Vector3d dir; p.getRawValue(dir, angle); angle = Base::toDegrees(angle); @@ -2364,33 +2543,35 @@ QVariant PropertyRotationItem::toolTip(const App::Property* prop) const QVariant PropertyRotationItem::toString(const QVariant& prop) const { const Base::Rotation& p = prop.value(); - double angle; + double angle {}; Base::Vector3d dir; p.getRawValue(dir, angle); angle = Base::toDegrees(angle); QLocale loc; QString data = QString::fromUtf8("[(%1 %2 %3); %4]") - .arg(loc.toString(dir.x, 'f', 2), - loc.toString(dir.y, 'f', 2), - loc.toString(dir.z, 'f', 2), + .arg(loc.toString(dir.x, 'f', lowPrec), + loc.toString(dir.y, 'f', lowPrec), + loc.toString(dir.z, 'f', lowPrec), Base::Quantity(angle, Base::Unit::Angle).getUserString()); return {data}; } void PropertyRotationItem::setValue(const QVariant& value) { - if (!value.canConvert()) + if (!value.canConvert()) { return; + } // Accept this only if the user changed the axis, angle or position but // not if >this< item loses focus - if (!h.hasChangedAndReset()) + if (!h.hasChangedAndReset()) { return; + } Base::Vector3d axis; - double angle; + double angle {}; h.getValue(axis, angle); - Base::QuantityFormat format(Base::QuantityFormat::Default, 16); + Base::QuantityFormat format(Base::QuantityFormat::Default, highPrec); QString data = QString::fromLatin1("App.Rotation(App.Vector(%1,%2,%3),%4)") .arg(Base::UnitsApi::toNumber(axis.x, format), Base::UnitsApi::toNumber(axis.y, format), @@ -2422,18 +2603,19 @@ QVariant PropertyRotationItem::editorData(QWidget *editor) const void PropertyRotationItem::propertyBound() { if (isBound()) { - m_a->bind(App::ObjectIdentifier(getPath())<bind(App::ObjectIdentifier(getPath()) << App::ObjectIdentifier::String("Angle")); - m_d->bind(App::ObjectIdentifier(getPath())<bind(App::ObjectIdentifier(getPath()) << App::ObjectIdentifier::String("Axis")); } } // -------------------------------------------------------------------- -PlacementEditor::PlacementEditor(const QString& name, QWidget * parent) - : LabelButton(parent), _task(nullptr) +PlacementEditor::PlacementEditor(QString name, QWidget * parent) + : LabelButton(parent) + , _task(nullptr) + , propertyname{std::move(name)} { - propertyname = name; propertyname.replace(QLatin1String(" "), QLatin1String("")); } @@ -2442,7 +2624,7 @@ PlacementEditor::~PlacementEditor() = default; void PlacementEditor::browse() { Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); - Gui::Dialog::TaskPlacement* task; + Gui::Dialog::TaskPlacement* task {}; task = qobject_cast(dlg); if (dlg && !task) { // there is already another task dialog which must be closed first @@ -2467,21 +2649,22 @@ void PlacementEditor::browse() void PlacementEditor::showValue(const QVariant& d) { const Base::Placement& p = d.value(); - double angle; - Base::Vector3d dir, pos; + double angle {}; + Base::Vector3d dir; + Base::Vector3d pos; p.getRotation().getRawValue(dir, angle); angle = Base::toDegrees(angle); pos = p.getPosition(); QLocale loc; QString data = QString::fromUtf8("[(%1 %2 %3);%4 \xc2\xb0;(%5 %6 %7)]") - .arg(loc.toString(dir.x, 'f', 2), - loc.toString(dir.y, 'f', 2), - loc.toString(dir.z, 'f', 2), - loc.toString(angle, 'f', 2), - loc.toString(pos.x, 'f', 2), - loc.toString(pos.y, 'f', 2), - loc.toString(pos.z, 'f', 2)); + .arg(loc.toString(dir.x, 'f', lowPrec), + loc.toString(dir.y, 'f', lowPrec), + loc.toString(dir.z, 'f', lowPrec), + loc.toString(angle, 'f', lowPrec), + loc.toString(pos.x, 'f', lowPrec), + loc.toString(pos.y, 'f', lowPrec), + loc.toString(pos.z, 'f', lowPrec)); getLabel()->setText(data); } @@ -2526,8 +2709,9 @@ PropertyPlacementItem::~PropertyPlacementItem() = default; Base::Quantity PropertyPlacementItem::getAngle() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return Base::Quantity(0.0); + } const Base::Placement& val = value.value(); double angle = h.getAngle(val.getRotation()); @@ -2537,8 +2721,9 @@ Base::Quantity PropertyPlacementItem::getAngle() const void PropertyPlacementItem::setAngle(Base::Quantity angle) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto val = value.value(); Base::Rotation rot = h.setAngle(angle.getValue()); @@ -2554,8 +2739,9 @@ Base::Vector3d PropertyPlacementItem::getAxis() const void PropertyPlacementItem::setAxis(const Base::Vector3d& axis) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto val = value.value(); Base::Rotation rot = val.getRotation(); @@ -2567,8 +2753,9 @@ void PropertyPlacementItem::setAxis(const Base::Vector3d& axis) Base::Vector3d PropertyPlacementItem::getPosition() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return Base::Vector3d(0,0,0); + } const Base::Placement& val = value.value(); return val.getPosition(); } @@ -2576,8 +2763,9 @@ Base::Vector3d PropertyPlacementItem::getPosition() const void PropertyPlacementItem::setPosition(const Base::Vector3d& pos) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto val = value.value(); val.setPosition(pos); @@ -2589,7 +2777,7 @@ void PropertyPlacementItem::assignProperty(const App::Property* prop) { // Choose an adaptive epsilon to avoid changing the axis when they are considered to // be equal. See https://forum.freecad.org/viewtopic.php?f=10&t=24662&start=10 - double eps = std::pow(10.0, -2*(decimals()+1)); + double eps = std::pow(10.0, -2 * (decimals() + 1)); // NOLINT if (prop->isDerivedFrom()) { const Base::Placement& value = static_cast(prop)->getValue(); h.assignProperty(value.getRotation(), eps); @@ -2601,7 +2789,7 @@ QVariant PropertyPlacementItem::value(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const Base::Placement& value = static_cast(prop)->getValue(); - double angle; + double angle {}; Base::Vector3d dir; value.getRotation().getRawValue(dir, angle); if (!h.isAxisInitialized()) { @@ -2638,8 +2826,9 @@ QVariant PropertyPlacementItem::toolTip(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const Base::Placement& p = static_cast(prop)->getValue(); - double angle; - Base::Vector3d dir, pos; + double angle {}; + Base::Vector3d dir; + Base::Vector3d pos; p.getRotation().getRawValue(dir, angle); angle = Base::toDegrees(angle); pos = p.getPosition(); @@ -2661,17 +2850,18 @@ QVariant PropertyPlacementItem::toolTip(const App::Property* prop) const QVariant PropertyPlacementItem::toString(const QVariant& prop) const { const Base::Placement& p = prop.value(); - double angle; - Base::Vector3d dir, pos; + double angle {}; + Base::Vector3d dir; + Base::Vector3d pos; p.getRotation().getRawValue(dir, angle); angle = Base::toDegrees(angle); pos = p.getPosition(); QLocale loc; QString data = QString::fromUtf8("[(%1 %2 %3); %4; (%5 %6 %7)]") - .arg(loc.toString(dir.x, 'f', 2), - loc.toString(dir.y, 'f', 2), - loc.toString(dir.z, 'f', 2), + .arg(loc.toString(dir.x, 'f', lowPrec), + loc.toString(dir.y, 'f', lowPrec), + loc.toString(dir.z, 'f', lowPrec), Base::Quantity(angle, Base::Unit::Angle).getUserString(), Base::Quantity(pos.x, Base::Unit::Length).getUserString(), Base::Quantity(pos.y, Base::Unit::Length).getUserString(), @@ -2681,21 +2871,23 @@ QVariant PropertyPlacementItem::toString(const QVariant& prop) const void PropertyPlacementItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } // Accept this only if the user changed the axis, angle or position but // not if >this< item loses focus - if (!h.hasChangedAndReset()) + if (!h.hasChangedAndReset()) { return; + } const Base::Placement& val = value.value(); Base::Vector3d pos = val.getPosition(); Base::Vector3d axis; - double angle; + double angle {}; h.getValue(axis, angle); - Base::QuantityFormat format(Base::QuantityFormat::Default, 16); + Base::QuantityFormat format(Base::QuantityFormat::Default, highPrec); QString data = QString::fromLatin1("App.Placement(" "App.Vector(%1,%2,%3)," "App.Rotation(App.Vector(%4,%5,%6),%7))") @@ -2712,7 +2904,7 @@ void PropertyPlacementItem::setValue(const QVariant& value) QWidget* PropertyPlacementItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const { auto pe = new PlacementEditor(this->propertyName(), parent); - QObject::connect(pe, SIGNAL(valueChanged(const QVariant &)), receiver, method); + QObject::connect(pe, SIGNAL(valueChanged(QVariant)), receiver, method); // The Placement dialog only works if property is part of a DocumentObject bool readonly = isReadOnly(); @@ -2766,11 +2958,12 @@ PropertyEnumItem::PropertyEnumItem() void PropertyEnumItem::propertyBound() { - if (m_enum && isBound()) + if (m_enum && isBound()) { m_enum->bind(App::ObjectIdentifier(getPath())<isDerivedFrom()) { const auto prop_enum = static_cast(prop); std::vector enums = prop_enum->getEnumVector(); - for (const auto& it : enums) + for (const auto& it : enums) { res.push_back(QString::fromStdString(it)); + } } return res; } @@ -2793,15 +2987,17 @@ QVariant PropertyEnumItem::value(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const auto prop_enum = static_cast(prop); - if(!prop_enum->isValid()) + if(!prop_enum->isValid()) { return {QString()}; + } return {QString::fromUtf8(prop_enum->getValueAsString())}; } void PropertyEnumItem::setValue(const QVariant& value) { - if (hasExpression()) + if (hasExpression()) { return; + } QString data; @@ -2818,15 +3014,14 @@ void PropertyEnumItem::setValue(const QVariant& value) str << "u\"" << pystr.c_str() << "\", "; } str << "]"; + setPropertyValue(data); } else if (value.canConvert()) { QByteArray val = value.toString().toUtf8(); std::string str = Base::Tools::escapedUnicodeFromUtf8(val); data = QString::fromLatin1("u\"%1\"").arg(QString::fromStdString(str)); + setPropertyValue(data); } - else - return; - setPropertyValue(data); } namespace { @@ -2837,8 +3032,9 @@ struct EnumItem { QString text; QString fullText; std::shared_ptr children; - explicit EnumItem(const QString &t = QString(), const QString &f = QString()) - :text(t), fullText(f) + explicit EnumItem(QString t = QString(), QString f = QString()) + : text(std::move(t)) + , fullText(std::move(f)) {} void populate(QMenu *menu); }; @@ -2855,55 +3051,26 @@ void EnumItem::populate(QMenu *menu) return; } auto subMenu = menu->addMenu(text); - for (auto &item : *children) + for (auto &item : *children) { item.populate(subMenu); + } } -} // anonymous namespace - -QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const +std::shared_ptr getEnumItems(const QStringList& commonModes) // NOLINT { - const std::vector& items = getPropertyData(); - - QStringList commonModes, modes; - for (auto it = items.begin(); it != items.end(); ++it) { - if ((*it)->is()) { - auto prop = static_cast(*it); - if (!prop->hasEnums()) { - commonModes.clear(); - return nullptr; - } - const std::vector& value = prop->getEnumVector(); - if (it == items.begin()) { - for (const auto & jt : value) - commonModes << QString::fromUtf8(jt.c_str()); - } - else { - for (const auto & jt : value) { - if (commonModes.contains(QString::fromUtf8(jt.c_str()))) - modes << QString::fromUtf8(jt.c_str()); - } - - commonModes = modes; - modes.clear(); - } - } - } - - if (commonModes.isEmpty()) - return nullptr; - int index = -1; std::shared_ptr enumItems; for (auto &mode : commonModes) { ++index; auto fields = mode.split(QStringLiteral("|")); - if (!enumItems && fields.size() <= 1) + if (!enumItems && fields.size() <= 1) { continue; + } if (!enumItems) { enumItems = std::make_shared(); - for (int i=0; iemplace_back(commonModes[i], mode); + } } auto children = enumItems; int j = -1; @@ -2912,26 +3079,81 @@ QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver field = field.trimmed(); auto it = children->end(); if (field.isEmpty()) { - if (!children->empty()) + if (!children->empty()) { --it; - else + } + else { continue; - } else { + } + } + else { it = std::find_if(children->begin(), children->end(), [&field](const EnumItem &item) { return item.text == field; }); - if (it == children->end()) + if (it == children->end()) { it = children->emplace(children->end(), field, mode); + } } - if (j + 1 == (int)fields.size()) + if (j + 1 == (int)fields.size()) { break; - if (!it->children) + } + if (!it->children) { it->children = std::make_shared(); + } children = it->children; } } + return enumItems; +} + +} // anonymous namespace + +QStringList PropertyEnumItem::getCommonModes() const +{ + const std::vector& items = getPropertyData(); + + QStringList commonModes; + QStringList modes; + for (auto it = items.begin(); it != items.end(); ++it) { + if ((*it)->is()) { + auto prop = static_cast(*it); + if (!prop->hasEnums()) { + commonModes.clear(); + return {}; + } + const std::vector& value = prop->getEnumVector(); + if (it == items.begin()) { + for (const auto & jt : value) { + commonModes << QString::fromUtf8(jt.c_str()); + } + } + else { + for (const auto & jt : value) { + if (commonModes.contains(QString::fromUtf8(jt.c_str()))) { + modes << QString::fromUtf8(jt.c_str()); + } + } + + commonModes = modes; + modes.clear(); + } + } + } + + return commonModes; +} + +QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const +{ + QStringList commonModes = getCommonModes(); + if (commonModes.isEmpty()) { + return nullptr; + } + + std::shared_ptr enumItems = getEnumItems(commonModes); + if (!enumItems) { auto cb = new QComboBox(parent); cb->setFrame(false); @@ -2944,8 +3166,9 @@ QWidget* PropertyEnumItem::createEditor(QWidget* parent, const QObject* receiver auto button = new PropertyEnumButton(parent); button->setDisabled(isReadOnly()); auto menu = new QMenu(button); - for (auto &item : *enumItems) + for (auto &item : *enumItems) { item.populate(menu); + } button->setMenu(menu); QObject::connect(menu, &QMenu::aboutToShow, this, [=]() { menu->setMinimumWidth(button->width()); @@ -2964,16 +3187,19 @@ void PropertyEnumItem::setEditorData(QWidget *editor, const QVariant& data) cons cb->setEditable(false); cb->setCurrentIndex(cb->findText(data.toString())); } - else if (auto btn = qobject_cast(editor)) + else if (auto btn = qobject_cast(editor)) { btn->setText(data.toString()); + } } QVariant PropertyEnumItem::editorData(QWidget *editor) const { - if (auto cb = qobject_cast(editor)) + if (auto cb = qobject_cast(editor)) { return {cb->currentText()}; - else if (auto btn = qobject_cast(editor)) + } + if (auto btn = qobject_cast(editor)) { return btn->text(); + } return {}; } @@ -2988,7 +3214,7 @@ QWidget* PropertyStringListItem::createEditor(QWidget* parent, const QObject* re auto le = new Gui::LabelEditor(parent); le->setAutoFillBackground(true); le->setDisabled(isReadOnly()); - QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method); + QObject::connect(le, SIGNAL(textChanged(QString)), receiver, method); return le; } @@ -3010,8 +3236,9 @@ QVariant PropertyStringListItem::editorData(QWidget *editor) const QVariant PropertyStringListItem::toString(const QVariant& prop) const { QStringList list = prop.toStringList(); - if (list.size() > 10) { - list = list.mid(0, 10); + const int size = 10; + if (list.size() > size) { + list = list.mid(0, size); list.append(QLatin1String("...")); } @@ -3034,8 +3261,9 @@ QVariant PropertyStringListItem::value(const App::Property* prop) const void PropertyStringListItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } QStringList values = value.toStringList(); QString data; QTextStream str(&data); @@ -3066,7 +3294,7 @@ QWidget* PropertyFloatListItem::createEditor(QWidget* parent, const QObject* rec le->setAutoFillBackground(true); le->setInputType(Gui::LabelEditor::Float); le->setDisabled(isReadOnly()); - QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method); + QObject::connect(le, SIGNAL(textChanged(QString)), receiver, method); return le; } @@ -3088,8 +3316,9 @@ QVariant PropertyFloatListItem::editorData(QWidget *editor) const QVariant PropertyFloatListItem::toString(const QVariant& prop) const { QStringList list = prop.toStringList(); - if (list.size() > 10) { - list = list.mid(0, 10); + const int size = 10; + if (list.size() > size) { + list = list.mid(0, size); list.append(QLatin1String("...")); } QString text = QString::fromUtf8("[%1]").arg(list.join(QLatin1String(","))); @@ -3111,8 +3340,9 @@ QVariant PropertyFloatListItem::value(const App::Property* prop) const void PropertyFloatListItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } QStringList values = value.toStringList(); QString data; QTextStream str(&data); @@ -3121,8 +3351,9 @@ void PropertyFloatListItem::setValue(const QVariant& value) str << it << ","; } str << "]"; - if (data == QString::fromUtf8("[,]")) + if (data == QString::fromUtf8("[,]")) { data = QString::fromUtf8("[]"); + } setPropertyValue(data); } @@ -3138,7 +3369,7 @@ QWidget* PropertyIntegerListItem::createEditor(QWidget* parent, const QObject* r le->setAutoFillBackground(true); le->setInputType(Gui::LabelEditor::Integer); le->setDisabled(isReadOnly()); - QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method); + QObject::connect(le, SIGNAL(textChanged(QString)), receiver, method); return le; } @@ -3160,8 +3391,9 @@ QVariant PropertyIntegerListItem::editorData(QWidget *editor) const QVariant PropertyIntegerListItem::toString(const QVariant& prop) const { QStringList list = prop.toStringList(); - if (list.size() > 10) { - list = list.mid(0, 10); + const int size = 10; + if (list.size() > size) { + list = list.mid(0, size); list.append(QLatin1String("...")); } QString text = QString::fromUtf8("[%1]").arg(list.join(QLatin1String(","))); @@ -3184,8 +3416,9 @@ QVariant PropertyIntegerListItem::value(const App::Property* prop) const void PropertyIntegerListItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } QStringList values = value.toStringList(); QString data; QTextStream str(&data); @@ -3194,8 +3427,9 @@ void PropertyIntegerListItem::setValue(const QVariant& value) str << value << ","; } str << "]"; - if (data == QString::fromUtf8("[,]")) + if (data == QString::fromUtf8("[,]")) { data = QString::fromUtf8("[]"); + } setPropertyValue(data); } @@ -3234,8 +3468,9 @@ QVariant PropertyColorItem::value(const App::Property* prop) const void PropertyColorItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } auto col = value.value(); QString data = QString::fromLatin1("(%1,%2,%3)") .arg(col.red()) @@ -3269,7 +3504,7 @@ QVariant PropertyColorItem::editorData(QWidget *editor) const // -------------------------------------------------------------------- -namespace Gui { namespace PropertyEditor { +namespace Gui::PropertyEditor { class Material { public: @@ -3277,11 +3512,10 @@ namespace Gui { namespace PropertyEditor { QColor ambientColor; QColor specularColor; QColor emissiveColor; - float shininess; - float transparency; + float shininess {}; + float transparency {}; }; } -} Q_DECLARE_METATYPE(Gui::PropertyEditor::Material) @@ -3289,6 +3523,9 @@ PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyMaterialItem) PropertyMaterialItem::PropertyMaterialItem() { + const int min = 0; + const int max = 100; + const int steps = 5; diffuse = static_cast(PropertyColorItem::create()); diffuse->setParent(this); diffuse->setPropertyName(QLatin1String("DiffuseColor")); @@ -3310,15 +3547,15 @@ PropertyMaterialItem::PropertyMaterialItem() this->appendChild(emissive); shininess = static_cast(PropertyIntegerConstraintItem::create()); - shininess->setRange(0, 100); - shininess->setStepSize(5); + shininess->setRange(min, max); + shininess->setStepSize(steps); shininess->setParent(this); shininess->setPropertyName(QLatin1String("Shininess")); this->appendChild(shininess); transparency = static_cast(PropertyIntegerConstraintItem::create()); - transparency->setRange(0, 100); - transparency->setStepSize(5); + transparency->setRange(min, max); + transparency->setStepSize(steps); transparency->setParent(this); transparency->setPropertyName(QLatin1String("Transparency")); this->appendChild(transparency); @@ -3333,8 +3570,9 @@ void PropertyMaterialItem::propertyBound() QColor PropertyMaterialItem::getDiffuseColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } auto val = value.value(); return val.diffuseColor; @@ -3343,8 +3581,9 @@ QColor PropertyMaterialItem::getDiffuseColor() const void PropertyMaterialItem::setDiffuseColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); mat.diffuseColor = color; @@ -3354,8 +3593,9 @@ void PropertyMaterialItem::setDiffuseColor(const QColor& color) QColor PropertyMaterialItem::getAmbientColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } auto val = value.value(); return val.ambientColor; @@ -3364,8 +3604,9 @@ QColor PropertyMaterialItem::getAmbientColor() const void PropertyMaterialItem::setAmbientColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); mat.ambientColor = color; @@ -3375,8 +3616,9 @@ void PropertyMaterialItem::setAmbientColor(const QColor& color) QColor PropertyMaterialItem::getSpecularColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } auto val = value.value(); return val.specularColor; @@ -3385,8 +3627,9 @@ QColor PropertyMaterialItem::getSpecularColor() const void PropertyMaterialItem::setSpecularColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); mat.specularColor = color; @@ -3396,8 +3639,9 @@ void PropertyMaterialItem::setSpecularColor(const QColor& color) QColor PropertyMaterialItem::getEmissiveColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } auto val = value.value(); return val.emissiveColor; @@ -3406,8 +3650,9 @@ QColor PropertyMaterialItem::getEmissiveColor() const void PropertyMaterialItem::setEmissiveColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); mat.emissiveColor = color; @@ -3417,42 +3662,46 @@ void PropertyMaterialItem::setEmissiveColor(const QColor& color) int PropertyMaterialItem::getShininess() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return 0; + } auto val = value.value(); - return int(100 * val.shininess); + return toPercent(val.shininess); } void PropertyMaterialItem::setShininess(int s) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); - mat.shininess = float(s) / 100.0F; + mat.shininess = fromPercent(s); setValue(QVariant::fromValue(mat)); } int PropertyMaterialItem::getTransparency() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return 0; + } auto val = value.value(); - return int (100 * val.transparency); + return toPercent(val.transparency); } void PropertyMaterialItem::setTransparency(int t) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } auto mat = value.value(); - mat.transparency = float(t) / 100.0F; + mat.transparency = fromPercent(t); setValue(QVariant::fromValue(mat)); } @@ -3501,8 +3750,8 @@ QVariant PropertyMaterialItem::toolTip(const App::Property* prop) const .arg(ac.red()).arg(ac.green()).arg(ac.blue()) .arg(sc.red()).arg(sc.green()).arg(sc.blue()) .arg(ec.red()).arg(ec.green()).arg(ec.blue()) - .arg(int(100 * value.shininess)) - .arg(int(100 * value.transparency)) + .arg(toPercent(value.shininess)) + .arg(toPercent(value.transparency)) ; return {data}; @@ -3527,8 +3776,9 @@ QVariant PropertyMaterialItem::value(const App::Property* prop) const void PropertyMaterialItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } auto mat = value.value(); App::Color dc; dc.setValue(mat.diffuseColor); @@ -3577,8 +3827,9 @@ QWidget* PropertyMaterialItem::createEditor(QWidget* parent, const QObject* rece void PropertyMaterialItem::setEditorData(QWidget *editor, const QVariant& data) const { - if (!data.canConvert()) + if (!data.canConvert()) { return; + } auto val = data.value(); auto cb = qobject_cast(editor); @@ -3589,8 +3840,9 @@ QVariant PropertyMaterialItem::editorData(QWidget *editor) const { auto cb = qobject_cast(editor); QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } auto val = value.value(); val.diffuseColor = cb->color(); @@ -3603,6 +3855,10 @@ PROPERTYITEM_SOURCE(Gui::PropertyEditor::PropertyMaterialListItem) PropertyMaterialListItem::PropertyMaterialListItem() { + const int min = 0; + const int max = 100; + const int steps = 5; + // This editor gets a list of materials but it only edits the first item. diffuse = static_cast(PropertyColorItem::create()); diffuse->setParent(this); @@ -3625,15 +3881,15 @@ PropertyMaterialListItem::PropertyMaterialListItem() this->appendChild(emissive); shininess = static_cast(PropertyIntegerConstraintItem::create()); - shininess->setRange(0, 100); - shininess->setStepSize(5); + shininess->setRange(min, max); + shininess->setStepSize(steps); shininess->setParent(this); shininess->setPropertyName(QLatin1String("Shininess")); this->appendChild(shininess); transparency = static_cast(PropertyIntegerConstraintItem::create()); - transparency->setRange(0, 100); - transparency->setStepSize(5); + transparency->setRange(min, max); + transparency->setStepSize(steps); transparency->setParent(this); transparency->setPropertyName(QLatin1String("Transparency")); this->appendChild(transparency); @@ -3648,15 +3904,18 @@ void PropertyMaterialListItem::propertyBound() QColor PropertyMaterialListItem::getDiffuseColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } auto mat = list[0].value(); return mat.diffuseColor; @@ -3665,15 +3924,18 @@ QColor PropertyMaterialListItem::getDiffuseColor() const void PropertyMaterialListItem::setDiffuseColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); mat.diffuseColor = color; @@ -3684,15 +3946,18 @@ void PropertyMaterialListItem::setDiffuseColor(const QColor& color) QColor PropertyMaterialListItem::getAmbientColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } auto mat = list[0].value(); return mat.ambientColor; @@ -3701,15 +3966,18 @@ QColor PropertyMaterialListItem::getAmbientColor() const void PropertyMaterialListItem::setAmbientColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); mat.ambientColor = color; @@ -3720,15 +3988,18 @@ void PropertyMaterialListItem::setAmbientColor(const QColor& color) QColor PropertyMaterialListItem::getSpecularColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } auto mat = list[0].value(); return mat.specularColor; @@ -3737,15 +4008,18 @@ QColor PropertyMaterialListItem::getSpecularColor() const void PropertyMaterialListItem::setSpecularColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); mat.specularColor = color; @@ -3756,15 +4030,18 @@ void PropertyMaterialListItem::setSpecularColor(const QColor& color) QColor PropertyMaterialListItem::getEmissiveColor() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } auto mat = list[0].value(); return mat.emissiveColor; @@ -3773,15 +4050,18 @@ QColor PropertyMaterialListItem::getEmissiveColor() const void PropertyMaterialListItem::setEmissiveColor(const QColor& color) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); mat.emissiveColor = color; @@ -3792,35 +4072,41 @@ void PropertyMaterialListItem::setEmissiveColor(const QColor& color) int PropertyMaterialListItem::getShininess() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return 0; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return 0; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return 0; + } auto mat = list[0].value(); - return int(100 * mat.shininess); + return toPercent(mat.shininess); } void PropertyMaterialListItem::setShininess(int s) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); - mat.shininess = float(s) / 100.0F; + mat.shininess = fromPercent(s); list[0] = QVariant::fromValue(mat); setValue(list); } @@ -3828,50 +4114,59 @@ void PropertyMaterialListItem::setShininess(int s) int PropertyMaterialListItem::getTransparency() const { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return 0; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return 0; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return 0; + } auto mat = list[0].value(); - return int(100 * mat.transparency); + return toPercent(mat.transparency); } void PropertyMaterialListItem::setTransparency(int t) { QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } auto mat = list[0].value(); - mat.transparency = float(t) / 100.0F; + mat.transparency = fromPercent(t); list[0] = QVariant::fromValue(mat); setValue(list); } QVariant PropertyMaterialListItem::decoration(const QVariant& value) const { - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } // use the diffuse color auto mat = list[0].value(); @@ -3886,15 +4181,18 @@ QVariant PropertyMaterialListItem::decoration(const QVariant& value) const QVariant PropertyMaterialListItem::toString(const QVariant& prop) const { - if (!prop.canConvert()) + if (!prop.canConvert()) { return {}; + } QVariantList list = prop.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } // use the diffuse color auto mat = list[0].value(); @@ -3909,8 +4207,9 @@ QVariant PropertyMaterialListItem::toolTip(const App::Property* prop) const assert(prop && prop->isDerivedFrom()); const std::vector& values = static_cast(prop)->getValues(); - if (values.empty()) + if (values.empty()) { return {}; + } App::Material value = values.front(); auto dc = value.diffuseColor.asValue(); @@ -3930,8 +4229,8 @@ QVariant PropertyMaterialListItem::toolTip(const App::Property* prop) const .arg(ac.red()).arg(ac.green()).arg(ac.blue()) .arg(sc.red()).arg(sc.green()).arg(sc.blue()) .arg(ec.red()).arg(ec.green()).arg(ec.blue()) - .arg(int(100 * value.shininess)) - .arg(int(100 * value.transparency)) + .arg(toPercent(value.shininess)) + .arg(toPercent(value.transparency)) ; return {data}; @@ -3961,12 +4260,14 @@ QVariant PropertyMaterialListItem::value(const App::Property* prop) const void PropertyMaterialListItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } QString data; QTextStream str(&data); @@ -4024,15 +4325,18 @@ QWidget* PropertyMaterialListItem::createEditor(QWidget* parent, const QObject* void PropertyMaterialListItem::setEditorData(QWidget *editor, const QVariant& data) const { - if (!data.canConvert()) + if (!data.canConvert()) { return; + } QVariantList list = data.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return; + } // use the diffuse color auto mat = list[0].value(); @@ -4046,15 +4350,18 @@ QVariant PropertyMaterialListItem::editorData(QWidget *editor) const { auto cb = qobject_cast(editor); QVariant value = data(1, Qt::EditRole); - if (!value.canConvert()) + if (!value.canConvert()) { return {}; + } QVariantList list = value.toList(); - if (list.isEmpty()) + if (list.isEmpty()) { return {}; + } - if (!list[0].canConvert()) + if (!list[0].canConvert()) { return {}; + } // use the diffuse color auto mat = list[0].value(); @@ -4080,8 +4387,9 @@ QVariant PropertyFileItem::value(const App::Property* prop) const void PropertyFileItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } QString val = value.toString(); QString data = QString::fromLatin1("\"%1\"").arg(val); setPropertyValue(data); @@ -4097,15 +4405,14 @@ QWidget* PropertyFileItem::createEditor(QWidget* parent, const QObject* receiver auto fc = new Gui::FileChooser(parent); fc->setAutoFillBackground(true); fc->setDisabled(isReadOnly()); - QObject::connect(fc, SIGNAL(fileNameSelected(const QString&)), receiver, method); + QObject::connect(fc, SIGNAL(fileNameSelected(QString)), receiver, method); return fc; } void PropertyFileItem::setEditorData(QWidget *editor, const QVariant& data) const { const App::Property* prop = getFirstProperty(); - if (prop) { - const auto propFile = static_cast(prop); + if (const auto propFile = dynamic_cast(prop)) { std::string filter = propFile->getFilter(); auto fc = qobject_cast(editor); if (!filter.empty()) { @@ -4137,8 +4444,10 @@ QVariant PropertyPathItem::value(const App::Property* prop) const void PropertyPathItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } + QString val = value.toString(); QString data = QString::fromLatin1("\"%1\"").arg(val); setPropertyValue(data); @@ -4155,7 +4464,7 @@ QWidget* PropertyPathItem::createEditor(QWidget* parent, const QObject* receiver fc->setMode(FileChooser::Directory); fc->setAutoFillBackground(true); fc->setDisabled(isReadOnly()); - QObject::connect(fc, SIGNAL(fileNameSelected(const QString&)), receiver, method); + QObject::connect(fc, SIGNAL(fileNameSelected(QString)), receiver, method); return fc; } @@ -4187,8 +4496,10 @@ QVariant PropertyTransientFileItem::value(const App::Property* prop) const void PropertyTransientFileItem::setValue(const QVariant& value) { - if (hasExpression() || !value.canConvert()) + if (hasExpression() || !value.canConvert()) { return; + } + QString val = value.toString(); QString data = QString::fromLatin1("\"%1\"").arg(val); setPropertyValue(data); @@ -4204,7 +4515,7 @@ QWidget* PropertyTransientFileItem::createEditor(QWidget* parent, const QObject* auto fc = new Gui::FileChooser(parent); fc->setAutoFillBackground(true); fc->setDisabled(isReadOnly()); - QObject::connect(fc, SIGNAL(fileNameSelected(const QString&)), receiver, method); + QObject::connect(fc, SIGNAL(fileNameSelected(QString)), receiver, method); return fc; } @@ -4213,7 +4524,7 @@ void PropertyTransientFileItem::setEditorData(QWidget *editor, const QVariant& d auto fc = qobject_cast(editor); fc->setFileName(data.toString()); - const auto prop = static_cast + const auto prop = dynamic_cast (getFirstProperty()); if (prop) { @@ -4333,7 +4644,7 @@ void LinkLabel::onLinkActivated (const QString& s) { Q_UNUSED(s); auto select = new LinkSelection(qvariant_cast(link)); - QTimer::singleShot(50, select, &LinkSelection::select); + QTimer::singleShot(50, select, &LinkSelection::select); // NOLINT } void LinkLabel::onEditClicked () @@ -4387,32 +4698,35 @@ QVariant PropertyLinkItem::data(int column, int role) const { if(!propertyItems.empty() && column == 1 && (role == Qt::ForegroundRole || role == Qt::ToolTipRole)) { - auto propLink = Base::freecad_dynamic_cast(propertyItems[0]); - if(propLink) { - if(role==Qt::ForegroundRole && propLink->checkRestore()>1) - return QVariant::fromValue(QColor(0xff,0,0)); - else if(role == Qt::ToolTipRole) { - auto xlink = Base::freecad_dynamic_cast(propertyItems[0]); - if(xlink) { + if (auto propLink = dynamic_cast(propertyItems[0])) { + if (role==Qt::ForegroundRole && propLink->checkRestore() > 1) { + return QVariant::fromValue(QColor(0xff, 0, 0)); // NOLINT + } + if (role == Qt::ToolTipRole) { + if (auto xlink = dynamic_cast(propertyItems[0])) { const char *filePath = xlink->getFilePath(); - if(filePath && filePath[0]) + if (filePath && filePath[0]) { return QVariant::fromValue(QString::fromUtf8(filePath)); + } } } } } + return PropertyItem::data(column,role); } QVariant PropertyLinkItem::value(const App::Property* prop) const { auto propLink = Base::freecad_dynamic_cast(prop); - if(!propLink) + if (!propLink) { return {}; + } auto links = DlgPropertyLink::getLinksFromProperty(propLink); - if(links.empty()) + if (links.empty()) { return {}; + } return QVariant::fromValue(links); } @@ -4425,25 +4739,26 @@ void PropertyLinkItem::setValue(const QVariant& value) QWidget* PropertyLinkItem::createEditor(QWidget* parent, const QObject* receiver, const char* method) const { - if(propertyItems.empty()) + if (propertyItems.empty()) { return nullptr; + } auto ll = new LinkLabel(parent, propertyItems.front()); ll->setAutoFillBackground(true); ll->setDisabled(isReadOnly()); - QObject::connect(ll, SIGNAL(linkChanged(const QVariant&)), receiver, method); + QObject::connect(ll, SIGNAL(linkChanged(QVariant)), receiver, method); return ll; } void PropertyLinkItem::setEditorData(QWidget *editor, const QVariant& data) const { (void)data; - auto ll = static_cast(editor); + auto ll = dynamic_cast(editor); return ll->updatePropertyLink(); } QVariant PropertyLinkItem::editorData(QWidget *editor) const { - auto ll = static_cast(editor); + auto ll = dynamic_cast(editor); return ll->propertyLink(); } @@ -4468,6 +4783,7 @@ QByteArray PropertyItemEditorFactory::valuePropertyName (int /*type*/) const // do not allow to set properties because we do that in subclasses of PropertyItem return ""; } +// NOLINTEND(cppcoreguidelines-pro-*,cppcoreguidelines-prefer-member-initializer) #include "moc_PropertyItem.cpp" diff --git a/src/Gui/propertyeditor/PropertyItem.h b/src/Gui/propertyeditor/PropertyItem.h index 6512c09665..169f21823b 100644 --- a/src/Gui/propertyeditor/PropertyItem.h +++ b/src/Gui/propertyeditor/PropertyItem.h @@ -180,7 +180,7 @@ public: int childCount() const; int columnCount() const; QString propertyName() const; - void setPropertyName(QString name, QString realName=QString()); + void setPropertyName(const QString& name, const QString& realName=QString()); void setPropertyValue(const QString&); virtual QVariant data(int column, int role) const; bool setData (const QVariant& value); @@ -204,6 +204,15 @@ protected: //gets called when the bound expression is changed void onChange() override; +private: + QVariant dataProperty(int role) const; + QVariant dataValue(int role) const; + QString toString(const Py::Object&) const; + QString asNone(const Py::Object&) const; + QString asString(const Py::Object&) const; + QString asSequence(const Py::Object&) const; + QString asMapping(const Py::Object&) const; + protected: QString propName; QString displayText; @@ -809,7 +818,7 @@ class PlacementEditor : public Gui::LabelButton Q_OBJECT public: - explicit PlacementEditor(const QString& name, QWidget * parent = nullptr); + explicit PlacementEditor(QString name, QWidget * parent = nullptr); ~PlacementEditor() override; private Q_SLOTS: @@ -882,7 +891,10 @@ class GuiExport PropertyEnumItem: public PropertyItem QVariant editorData(QWidget *editor) const override; QStringList getEnum() const; - void setEnum(QStringList); + void setEnum(const QStringList&); + +private: + QStringList getCommonModes() const; protected: QVariant value(const App::Property*) const override;