+ 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:
parent
6dfc395a06
commit
b9797ec92a
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user