+ 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;
bool _isClosing;
bool _isModified;
ViewProvider* _pcInEdit;
ViewProvider* _editViewProvider;
Application* _pcAppWnd;
// the doc/Document
App::Document* _pcDocument;
@ -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
@ -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())
@ -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;
@ -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;
@ -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);
}
@ -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();
@ -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);
}

View File

@ -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;
}