Skip to content

Commit

Permalink
+ To avoid possible memory leaks or inconsistencies on Document::rese…
Browse files Browse the repository at this point in the history
…tEdit() call finishEditing() of view provider inside document because the editing view could be closed already
  • Loading branch information
wwmayer committed Sep 16, 2015
1 parent 6dfc395 commit b9797ec
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
31 changes: 16 additions & 15 deletions src/Gui/Document.cpp
Expand Up @@ -73,7 +73,7 @@ struct DocumentP
int _iDocId;
bool _isClosing;
bool _isModified;
ViewProvider* _pcInEdit;
ViewProvider* _editViewProvider;
Application* _pcAppWnd;
// the doc/Document
App::Document* _pcDocument;
Expand Down Expand Up @@ -118,7 +118,7 @@ Document::Document(App::Document* pcDocument,Application * app)
d->_isModified = false;
d->_pcAppWnd = app;
d->_pcDocument = pcDocument;
d->_pcInEdit = 0;
d->_editViewProvider = 0;

// Setup the connections
d->connectNewObject = pcDocument->signalNewObject.connect
Expand Down Expand Up @@ -207,7 +207,7 @@ Document::~Document()

bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
{
if (d->_pcInEdit)
if (d->_editViewProvider)
resetEdit();
// is it really a ViewProvider of this document?
if (d->_ViewProviderMap.find(dynamic_cast<ViewProviderDocumentObject*>(p)->getObject()) == d->_ViewProviderMap.end())
Expand All @@ -222,12 +222,12 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
}

if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) {
d->_pcInEdit = p;
d->_editViewProvider = p;
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (dlg)
dlg->setDocumentName(this->getDocument()->getName());
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit)));
if (d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_editViewProvider)));
}
else {
return false;
Expand All @@ -239,26 +239,27 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
void Document::resetEdit(void)
{
std::list<Gui::BaseView*>::iterator it;
if (d->_pcInEdit) {
if (d->_editViewProvider) {
for (it = d->baseViews.begin();it != d->baseViews.end();++it) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*it);
if (activeView)
activeView->getViewer()->resetEditingViewProvider();
}

if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalResetEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit)));
d->_pcInEdit = 0;
d->_editViewProvider->finishEditing();
if (d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalResetEdit(*(static_cast<ViewProviderDocumentObject*>(d->_editViewProvider)));
d->_editViewProvider = 0;
}
}

ViewProvider *Document::getInEdit(void) const
{
if (d->_pcInEdit) {
if (d->_editViewProvider) {
// there is only one 3d view which is in edit mode
View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView());
if (activeView && activeView->getViewer()->isEditingViewProvider())
return d->_pcInEdit;
return d->_editViewProvider;
}

return 0;
Expand Down Expand Up @@ -455,7 +456,7 @@ void Document::slotDeletedObject(const App::DocumentObject& Obj)
for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt);
if (activeView) {
if (d->_pcInEdit == viewProvider)
if (d->_editViewProvider == viewProvider)
resetEdit();
activeView->getViewer()->removeViewProvider(viewProvider);
}
Expand Down Expand Up @@ -491,7 +492,7 @@ void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Prop
}

// check for children
if(viewProvider->getChildRoot()) {
if (viewProvider->getChildRoot()) {
std::vector<App::DocumentObject*> children = viewProvider->claimChildren3D();
SoGroup* childGroup = viewProvider->getChildRoot();

Expand All @@ -510,7 +511,7 @@ void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Prop
for (std::list<Gui::BaseView*>::iterator vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt);
if (activeView && viewProvider) {
if (d->_pcInEdit == ChildViewProvider)
if (d->_editViewProvider == ChildViewProvider)
resetEdit();
activeView->getViewer()->removeViewProvider(ChildViewProvider);
}
Expand Down
1 change: 0 additions & 1 deletion src/Gui/View3DInventorViewer.cpp
Expand Up @@ -667,7 +667,6 @@ void View3DInventorViewer::resetEditingViewProvider()
{
if (this->editViewProvider) {
this->editViewProvider->unsetEditViewer(this);
this->editViewProvider->finishEditing();
removeEventCallback(SoEvent::getClassTypeId(), Gui::ViewProvider::eventCallback,this->editViewProvider);
this->editViewProvider = 0;
}
Expand Down

0 comments on commit b9797ec

Please sign in to comment.