From cd7fb70d1f217da53d907e79506add1e6139f89c Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Wed, 12 Feb 2020 14:45:13 +0800 Subject: [PATCH] Gui: fix crash on Document resetEdit --- src/Gui/Application.cpp | 2 ++ src/Gui/Document.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index b4330209f6..be4cef5e98 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -971,6 +971,8 @@ Gui::MDIView* Application::editViewOfNode(SoNode *node) const } void Application::setEditDocument(Gui::Document *doc) { + if(doc == d->editDocument) + return; if(!doc) d->editDocument = 0; for(auto &v : d->documents) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index e28f44242b..e17726700f 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -462,7 +462,12 @@ void Document::_resetEdit(void) } d->_editViewProvider->finishEditing(); - if (d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) + + // Have to check d->_editViewProvider below, because there is a chance + // the editing object gets deleted inside the above call to + // 'finishEditing()', which will trigger our slotDeletedObject(), which + // nullifies _editViewProvider. + if (d->_editViewProvider && d->_editViewProvider->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId())) signalResetEdit(*(static_cast(d->_editViewProvider))); d->_editViewProvider = 0;