From 61aa0fcafe911cf4a92476ceba5f6b3aabb71d88 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 8 May 2016 19:28:02 +0200 Subject: [PATCH] + implement PropertyMaterialListItem --- src/App/PropertyStandard.cpp | 5 +- src/Gui/SoFCDB.cpp | 1 + src/Gui/propertyeditor/PropertyItem.cpp | 317 ++++++++++++++++++------ 3 files changed, 241 insertions(+), 82 deletions(-) diff --git a/src/App/PropertyStandard.cpp b/src/App/PropertyStandard.cpp index a4c3d3061d..82cbae057c 100644 --- a/src/App/PropertyStandard.cpp +++ b/src/App/PropertyStandard.cpp @@ -2604,7 +2604,8 @@ void PropertyMaterialList::setPyObject(PyObject *value) for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { if (PyObject_TypeCheck((*it).ptr(), &(MaterialPy::Type))) { - materials.push_back(*static_cast(value)->getMaterialPtr()); + Material mat = *static_cast((*it).ptr())->getMaterialPtr(); + materials.push_back(mat); } } @@ -2679,7 +2680,7 @@ void PropertyMaterialList::RestoreDocFile(Base::Reader &reader) const char* PropertyMaterialList::getEditorName(void) const { - return "";// "Gui::PropertyEditor::PropertyMaterialListItem"; + return "Gui::PropertyEditor::PropertyMaterialListItem"; } Property *PropertyMaterialList::Copy(void) const diff --git a/src/Gui/SoFCDB.cpp b/src/Gui/SoFCDB.cpp index f1cdd03ed7..3df835c0b7 100644 --- a/src/Gui/SoFCDB.cpp +++ b/src/Gui/SoFCDB.cpp @@ -139,6 +139,7 @@ void Gui::SoFCDB::init() PropertyIntegerListItem ::init(); PropertyColorItem ::init(); PropertyMaterialItem ::init(); + PropertyMaterialListItem ::init(); PropertyFileItem ::init(); PropertyPathItem ::init(); PropertyTransientFileItem ::init(); diff --git a/src/Gui/propertyeditor/PropertyItem.cpp b/src/Gui/propertyeditor/PropertyItem.cpp index 016ed1650c..1648c243d1 100644 --- a/src/Gui/propertyeditor/PropertyItem.cpp +++ b/src/Gui/propertyeditor/PropertyItem.cpp @@ -2640,6 +2640,7 @@ TYPESYSTEM_SOURCE(Gui::PropertyEditor::PropertyMaterialListItem, Gui::PropertyEd PropertyMaterialListItem::PropertyMaterialListItem() { + // This editor gets a list of materials but it only edits the first item. diffuse = static_cast(PropertyColorItem::create()); diffuse->setParent(this); diffuse->setPropertyName(QLatin1String("DiffuseColor")); @@ -2685,8 +2686,15 @@ QColor PropertyMaterialListItem::getDiffuseColor() const if (!value.canConvert()) return QColor(); - const QVariantList& val = value.toList(); - return val[0].value(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return QColor(); + + if (!list[0].canConvert()) + return QColor(); + + Material mat = list[0].value(); + return mat.diffuseColor; } void PropertyMaterialListItem::setDiffuseColor(const QColor& color) @@ -2695,9 +2703,17 @@ void PropertyMaterialListItem::setDiffuseColor(const QColor& color) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[0] = QVariant(color); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.diffuseColor = color; + list[0] = QVariant::fromValue(mat); + setValue(list); } QColor PropertyMaterialListItem::getAmbientColor() const @@ -2706,8 +2722,15 @@ QColor PropertyMaterialListItem::getAmbientColor() const if (!value.canConvert()) return QColor(); - const QVariantList& val = value.toList(); - return val[1].value(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return QColor(); + + if (!list[0].canConvert()) + return QColor(); + + Material mat = list[0].value(); + return mat.ambientColor; } void PropertyMaterialListItem::setAmbientColor(const QColor& color) @@ -2716,9 +2739,17 @@ void PropertyMaterialListItem::setAmbientColor(const QColor& color) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[1] = QVariant(color); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.ambientColor = color; + list[0] = QVariant::fromValue(mat); + setValue(list); } QColor PropertyMaterialListItem::getSpecularColor() const @@ -2727,8 +2758,15 @@ QColor PropertyMaterialListItem::getSpecularColor() const if (!value.canConvert()) return QColor(); - const QVariantList& val = value.toList(); - return val[2].value(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return QColor(); + + if (!list[0].canConvert()) + return QColor(); + + Material mat = list[0].value(); + return mat.specularColor; } void PropertyMaterialListItem::setSpecularColor(const QColor& color) @@ -2737,9 +2775,17 @@ void PropertyMaterialListItem::setSpecularColor(const QColor& color) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[2] = QVariant(color); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.specularColor = color; + list[0] = QVariant::fromValue(mat); + setValue(list); } QColor PropertyMaterialListItem::getEmissiveColor() const @@ -2748,8 +2794,15 @@ QColor PropertyMaterialListItem::getEmissiveColor() const if (!value.canConvert()) return QColor(); - const QVariantList& val = value.toList(); - return val[3].value(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return QColor(); + + if (!list[0].canConvert()) + return QColor(); + + Material mat = list[0].value(); + return mat.emissiveColor; } void PropertyMaterialListItem::setEmissiveColor(const QColor& color) @@ -2758,9 +2811,17 @@ void PropertyMaterialListItem::setEmissiveColor(const QColor& color) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[3] = QVariant(color); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.emissiveColor = color; + list[0] = QVariant::fromValue(mat); + setValue(list); } float PropertyMaterialListItem::getShininess() const @@ -2769,8 +2830,15 @@ float PropertyMaterialListItem::getShininess() const if (!value.canConvert()) return 0; - const QVariantList& val = value.toList(); - return val[4].toFloat(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return 0; + + if (!list[0].canConvert()) + return 0; + + Material mat = list[0].value(); + return mat.shininess; } void PropertyMaterialListItem::setShininess(float s) @@ -2779,9 +2847,17 @@ void PropertyMaterialListItem::setShininess(float s) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[4] = QVariant(s); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.shininess = s; + list[0] = QVariant::fromValue(mat); + setValue(list); } float PropertyMaterialListItem::getTransparency() const @@ -2790,8 +2866,15 @@ float PropertyMaterialListItem::getTransparency() const if (!value.canConvert()) return 0; - const QVariantList& val = value.toList(); - return val[5].toFloat(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return 0; + + if (!list[0].canConvert()) + return 0; + + Material mat = list[0].value(); + return mat.transparency; } void PropertyMaterialListItem::setTransparency(float t) @@ -2800,16 +2883,34 @@ void PropertyMaterialListItem::setTransparency(float t) if (!value.canConvert()) return; - QVariantList val = value.toList(); - val[5] = QVariant(t); - setValue(val); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + Material mat = list[0].value(); + mat.transparency = t; + list[0] = QVariant::fromValue(mat); + setValue(list); } QVariant PropertyMaterialListItem::decoration(const QVariant& value) const { + if (!value.canConvert()) + return QVariant(); + + QVariantList list = value.toList(); + if (list.isEmpty()) + return QVariant(); + + if (!list[0].canConvert()) + return QVariant(); + // use the diffuse color - const QVariantList& val = value.toList(); - QColor color = val[0].value(); + Material mat = list[0].value(); + QColor color = mat.diffuseColor; int size = QApplication::style()->pixelMetric(QStyle::PM_ListViewIconSize); QPixmap p(size, size); @@ -2820,9 +2921,19 @@ QVariant PropertyMaterialListItem::decoration(const QVariant& value) const QVariant PropertyMaterialListItem::toString(const QVariant& prop) const { + if (!prop.canConvert()) + return QVariant(); + + QVariantList list = prop.toList(); + if (list.isEmpty()) + return QVariant(); + + if (!list[0].canConvert()) + return QVariant(); + // use the diffuse color - const QVariantList& val = prop.toList(); - QColor value = val[0].value(); + Material mat = list[0].value(); + QColor value = mat.diffuseColor; QString color = QString::fromLatin1("[%1, %2, %3]") .arg(value.red()).arg(value.green()).arg(value.blue()); return QVariant(color); @@ -2830,9 +2941,13 @@ QVariant PropertyMaterialListItem::toString(const QVariant& prop) const QVariant PropertyMaterialListItem::toolTip(const App::Property* prop) const { - assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyMaterial::getClassTypeId())); + assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyMaterialList::getClassTypeId())); - const App::Material& value = static_cast(prop)->getValue(); + const std::vector& values = static_cast(prop)->getValues(); + if (values.empty()) + return QVariant(); + + App::Material value = values.front(); QColor dc = toQColor(value.diffuseColor); QColor ac = toQColor(value.ambientColor); QColor sc = toQColor(value.specularColor); @@ -2859,17 +2974,22 @@ QVariant PropertyMaterialListItem::toolTip(const App::Property* prop) const QVariant PropertyMaterialListItem::value(const App::Property* prop) const { - assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyMaterial::getClassTypeId())); + assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyMaterialList::getClassTypeId())); - const App::Material& value = static_cast(prop)->getValue(); + const std::vector& value = static_cast(prop)->getValues(); QVariantList variantList; - variantList << QVariant(toQColor(value.diffuseColor)); - variantList << QVariant(toQColor(value.ambientColor)); - variantList << QVariant(toQColor(value.specularColor)); - variantList << QVariant(toQColor(value.emissiveColor)); - variantList << QVariant(value.shininess); - variantList << QVariant(value.transparency); + for (std::vector::const_iterator it = value.begin(); it != value.end(); ++it) { + Material mat; + mat.diffuseColor = toQColor(it->diffuseColor); + mat.ambientColor = toQColor(it->ambientColor); + mat.specularColor = toQColor(it->specularColor); + mat.emissiveColor = toQColor(it->emissiveColor); + mat.shininess = it->shininess; + mat.transparency = it->transparency; + + variantList << QVariant::fromValue(mat); + } return variantList; } @@ -2879,39 +2999,52 @@ void PropertyMaterialListItem::setValue(const QVariant& value) if (!value.canConvert()) return; - QVariantList val = value.toList(); - App::Color dc = fromQColor(val[0].value()); - App::Color ac = fromQColor(val[1].value()); - App::Color sc = fromQColor(val[2].value()); - App::Color ec = fromQColor(val[3].value()); - float s = val[4].toFloat(); - float t = val[5].toFloat(); + QVariantList list = value.toList(); + if (list.isEmpty()) + return; - QString data = QString::fromLatin1( - "App.Material(" - "DiffuseColor=(%1,%2,%3)," - "AmbientColor=(%4,%5,%6)," - "SpecularColor=(%7,%8,%9)," - "EmissiveColor=(%10,%11,%12)," - "Shininess=(%13)," - "Transparency=(%14)," - ")" - ) - .arg(dc.r, 0, 'f', decimals()) - .arg(dc.g, 0, 'f', decimals()) - .arg(dc.b, 0, 'f', decimals()) - .arg(ac.r, 0, 'f', decimals()) - .arg(ac.g, 0, 'f', decimals()) - .arg(ac.b, 0, 'f', decimals()) - .arg(sc.r, 0, 'f', decimals()) - .arg(sc.g, 0, 'f', decimals()) - .arg(sc.b, 0, 'f', decimals()) - .arg(ec.r, 0, 'f', decimals()) - .arg(ec.g, 0, 'f', decimals()) - .arg(ec.b, 0, 'f', decimals()) - .arg(s, 0, 'f', decimals()) - .arg(t, 0, 'f', decimals()) - ; + QString data; + QTextStream str(&data); + str << "("; + + for (QVariantList::iterator it = list.begin(); it != list.end(); ++it) { + Material mat = it->value(); + App::Color dc = fromQColor(mat.diffuseColor); + App::Color ac = fromQColor(mat.ambientColor); + App::Color sc = fromQColor(mat.specularColor); + App::Color ec = fromQColor(mat.emissiveColor); + float s = mat.shininess; + float t = mat.transparency; + + QString item = QString::fromLatin1( + "App.Material(" + "DiffuseColor=(%1,%2,%3)," + "AmbientColor=(%4,%5,%6)," + "SpecularColor=(%7,%8,%9)," + "EmissiveColor=(%10,%11,%12)," + "Shininess=(%13)," + "Transparency=(%14)," + ")" + ) + .arg(dc.r, 0, 'f', decimals()) + .arg(dc.g, 0, 'f', decimals()) + .arg(dc.b, 0, 'f', decimals()) + .arg(ac.r, 0, 'f', decimals()) + .arg(ac.g, 0, 'f', decimals()) + .arg(ac.b, 0, 'f', decimals()) + .arg(sc.r, 0, 'f', decimals()) + .arg(sc.g, 0, 'f', decimals()) + .arg(sc.b, 0, 'f', decimals()) + .arg(ec.r, 0, 'f', decimals()) + .arg(ec.g, 0, 'f', decimals()) + .arg(ec.b, 0, 'f', decimals()) + .arg(s, 0, 'f', decimals()) + .arg(t, 0, 'f', decimals()) + ; + str << item << ", "; + } + + str << ")"; setPropertyValue(data); } @@ -2926,8 +3059,22 @@ QWidget* PropertyMaterialListItem::createEditor(QWidget* parent, const QObject* void PropertyMaterialListItem::setEditorData(QWidget *editor, const QVariant& data) const { + if (!data.canConvert()) + return; + + QVariantList list = data.toList(); + if (list.isEmpty()) + return; + + if (!list[0].canConvert()) + return; + + // use the diffuse color + Material mat = list[0].value(); + QColor color = mat.diffuseColor; + Gui::ColorButton *cb = qobject_cast(editor); - cb->setColor(getDiffuseColor()); + cb->setColor(color); } QVariant PropertyMaterialListItem::editorData(QWidget *editor) const @@ -2937,9 +3084,19 @@ QVariant PropertyMaterialListItem::editorData(QWidget *editor) const if (!value.canConvert()) return QVariant(); - QVariantList val = value.toList(); - val[0] = QVariant(cb->color()); - return val; + QVariantList list = value.toList(); + if (list.isEmpty()) + return QVariant(); + + if (!list[0].canConvert()) + return QVariant(); + + // use the diffuse color + Material mat = list[0].value(); + mat.diffuseColor = cb->color(); + list[0] = QVariant::fromValue(mat); + + return list; } // --------------------------------------------------------------------