diff --git a/src/Gui/SceneInspector.cpp b/src/Gui/SceneInspector.cpp index efa0f3e7abba..5bc6e3804f97 100644 --- a/src/Gui/SceneInspector.cpp +++ b/src/Gui/SceneInspector.cpp @@ -97,7 +97,10 @@ void SceneModel::setNode(QModelIndex index, SoNode* node) for (int i=0; igetNumChildren();i++) { SoNode* child = group->getChild(i); setNode(this->index(i, 0, index), child); - this->setData(this->index(i, 1, index), QVariant(QString::fromLatin1(child->getName()))); + // See ViewProviderDocumentObject::updateData + QByteArray name(child->getName()); + name = QByteArray::fromPercentEncoding(name); + this->setData(this->index(i, 1, index), QVariant(QString::fromUtf8(name))); } } // insert icon diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index 6de48915f735..7aeaacabd881 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -263,13 +263,14 @@ SbMatrix ViewProvider::convert(const Base::Matrix4D &rcMatrix) const dMtrx[12],dMtrx[13],dMtrx[14], dMtrx[15]); } -void ViewProvider::addDisplayMaskMode( SoNode *node, const char* type ) +void ViewProvider::addDisplayMaskMode(SoNode *node, const char* type) { - _sDisplayMaskModes[ type ] = pcModeSwitch->getNumChildren(); - pcModeSwitch->addChild( node ); + node->setName(type); + _sDisplayMaskModes[type] = pcModeSwitch->getNumChildren(); + pcModeSwitch->addChild(node); } -void ViewProvider::setDisplayMaskMode( const char* type ) +void ViewProvider::setDisplayMaskMode(const char* type) { std::map::const_iterator it = _sDisplayMaskModes.find( type ); if (it != _sDisplayMaskModes.end()) diff --git a/src/Gui/ViewProviderDocumentObject.cpp b/src/Gui/ViewProviderDocumentObject.cpp index d001f96ece91..bbaca4ca4863 100644 --- a/src/Gui/ViewProviderDocumentObject.cpp +++ b/src/Gui/ViewProviderDocumentObject.cpp @@ -24,6 +24,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include # include # include # include @@ -187,6 +188,19 @@ void ViewProviderDocumentObject::attach(App::DocumentObject *pcObj) ext->extensionAttach(pcObj); } +void ViewProviderDocumentObject::updateData(const App::Property* prop) +{ + if (pcObject && prop == &pcObject->Label) { + // SoBase::setName() replaces characters that according to the + // VRML standard are invalid. To avoid the replacement we use + // the percent encoding. + QByteArray ba(pcObject->Label.getValue()); + QByteArray name = ba.toPercentEncoding(); + pcRoot->setName(name.constData()); + } + ViewProvider::updateData(prop); +} + Gui::Document* ViewProviderDocumentObject::getDocument() const { App::Document* pAppDoc = pcObject->getDocument(); diff --git a/src/Gui/ViewProviderDocumentObject.h b/src/Gui/ViewProviderDocumentObject.h index ebe24ccf084e..c6d79d1a6b0e 100644 --- a/src/Gui/ViewProviderDocumentObject.h +++ b/src/Gui/ViewProviderDocumentObject.h @@ -62,6 +62,7 @@ class GuiExport ViewProviderDocumentObject : public ViewProvider App::PropertyBool Visibility; virtual void attach(App::DocumentObject *pcObject); + virtual void updateData(const App::Property*); /// Set the active mode, i.e. the first item of the 'Display' property. void setActiveMode(); /// Hide the object in the view diff --git a/src/Gui/ViewProviderGeometryObject.cpp b/src/Gui/ViewProviderGeometryObject.cpp index 5eb17793a43a..67445b26e187 100644 --- a/src/Gui/ViewProviderGeometryObject.cpp +++ b/src/Gui/ViewProviderGeometryObject.cpp @@ -180,6 +180,9 @@ void ViewProviderGeometryObject::updateData(const App::Property* prop) Base::Placement p = static_cast(prop)->getValue(); updateTransform(p, pcTransform); } + else { + ViewProviderDocumentObject::updateData(prop); + } } bool ViewProviderGeometryObject::doubleClicked(void)