+ To avoid possible memory leaks or inconsistencies on Document::resetEdit() call finishEditing() of view provider inside document because the editing view could be closed already

This commit is contained in:
wmayer 2015-09-16 14:20:13 +02:00
parent 6dfc395a06
commit b9797ec92a
2 changed files with 16 additions and 16 deletions

View File

@ -73,7 +73,7 @@ struct DocumentP
int _iDocId; int _iDocId;
bool _isClosing; bool _isClosing;
bool _isModified; bool _isModified;
ViewProvider* _pcInEdit; ViewProvider* _editViewProvider;
Application* _pcAppWnd; Application* _pcAppWnd;
// the doc/Document // the doc/Document
App::Document* _pcDocument; App::Document* _pcDocument;
@ -118,7 +118,7 @@ Document::Document(App::Document* pcDocument,Application * app)
d->_isModified = false; d->_isModified = false;
d->_pcAppWnd = app; d->_pcAppWnd = app;
d->_pcDocument = pcDocument; d->_pcDocument = pcDocument;
d->_pcInEdit = 0; d->_editViewProvider = 0;
// Setup the connections // Setup the connections
d->connectNewObject = pcDocument->signalNewObject.connect d->connectNewObject = pcDocument->signalNewObject.connect
@ -207,7 +207,7 @@ Document::~Document()
bool Document::setEdit(Gui::ViewProvider* p, int ModNum) bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
{ {
if (d->_pcInEdit) if (d->_editViewProvider)
resetEdit(); resetEdit();
// is it really a ViewProvider of this document? // is it really a ViewProvider of this document?
if (d->_ViewProviderMap.find(dynamic_cast<ViewProviderDocumentObject*>(p)->getObject()) == d->_ViewProviderMap.end()) if (d->_ViewProviderMap.find(dynamic_cast<ViewProviderDocumentObject*>(p)->getObject()) == d->_ViewProviderMap.end())
@ -222,12 +222,12 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
} }
if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) { if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) {
d->_pcInEdit = p; d->_editViewProvider = p;
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (dlg) if (dlg)
dlg->setDocumentName(this->getDocument()->getName()); dlg->setDocumentName(this->getDocument()->getName());
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) if (d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit))); signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_editViewProvider)));
} }
else { else {
return false; return false;
@ -239,26 +239,27 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
void Document::resetEdit(void) void Document::resetEdit(void)
{ {
std::list<Gui::BaseView*>::iterator it; std::list<Gui::BaseView*>::iterator it;
if (d->_pcInEdit) { if (d->_editViewProvider) {
for (it = d->baseViews.begin();it != d->baseViews.end();++it) { for (it = d->baseViews.begin();it != d->baseViews.end();++it) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*it); View3DInventor *activeView = dynamic_cast<View3DInventor *>(*it);
if (activeView) if (activeView)
activeView->getViewer()->resetEditingViewProvider(); activeView->getViewer()->resetEditingViewProvider();
} }
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) d->_editViewProvider->finishEditing();
signalResetEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit))); if (d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
d->_pcInEdit = 0; signalResetEdit(*(static_cast<ViewProviderDocumentObject*>(d->_editViewProvider)));
d->_editViewProvider = 0;
} }
} }
ViewProvider *Document::getInEdit(void) const ViewProvider *Document::getInEdit(void) const
{ {
if (d->_pcInEdit) { if (d->_editViewProvider) {
// there is only one 3d view which is in edit mode // there is only one 3d view which is in edit mode
View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView()); View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView());
if (activeView && activeView->getViewer()->isEditingViewProvider()) if (activeView && activeView->getViewer()->isEditingViewProvider())
return d->_pcInEdit; return d->_editViewProvider;
} }
return 0; return 0;
@ -455,7 +456,7 @@ void Document::slotDeletedObject(const App::DocumentObject& Obj)
for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) { for (vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt);
if (activeView) { if (activeView) {
if (d->_pcInEdit == viewProvider) if (d->_editViewProvider == viewProvider)
resetEdit(); resetEdit();
activeView->getViewer()->removeViewProvider(viewProvider); activeView->getViewer()->removeViewProvider(viewProvider);
} }
@ -491,7 +492,7 @@ void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Prop
} }
// check for children // check for children
if(viewProvider->getChildRoot()) { if (viewProvider->getChildRoot()) {
std::vector<App::DocumentObject*> children = viewProvider->claimChildren3D(); std::vector<App::DocumentObject*> children = viewProvider->claimChildren3D();
SoGroup* childGroup = viewProvider->getChildRoot(); SoGroup* childGroup = viewProvider->getChildRoot();
@ -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) { for (std::list<Gui::BaseView*>::iterator vIt = d->baseViews.begin();vIt != d->baseViews.end();++vIt) {
View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt); View3DInventor *activeView = dynamic_cast<View3DInventor *>(*vIt);
if (activeView && viewProvider) { if (activeView && viewProvider) {
if (d->_pcInEdit == ChildViewProvider) if (d->_editViewProvider == ChildViewProvider)
resetEdit(); resetEdit();
activeView->getViewer()->removeViewProvider(ChildViewProvider); activeView->getViewer()->removeViewProvider(ChildViewProvider);
} }

View File

@ -667,7 +667,6 @@ void View3DInventorViewer::resetEditingViewProvider()
{ {
if (this->editViewProvider) { if (this->editViewProvider) {
this->editViewProvider->unsetEditViewer(this); this->editViewProvider->unsetEditViewer(this);
this->editViewProvider->finishEditing();
removeEventCallback(SoEvent::getClassTypeId(), Gui::ViewProvider::eventCallback,this->editViewProvider); removeEventCallback(SoEvent::getClassTypeId(), Gui::ViewProvider::eventCallback,this->editViewProvider);
this->editViewProvider = 0; this->editViewProvider = 0;
} }